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

Artifact 73eb4c41f3e745bbaa7ecc49d3aa2688e4f298ba:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0460: 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  e.# define WHERE
0470: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
0480: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0490: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
04a0: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
04b0: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65  WhereMaskSet Whe
04e0: 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64  reMaskSet;.typed
04f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0500: 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66  rInfo WhereOrInf
0510: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0520: 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57  t WhereAndInfo W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70  hereAndInfo;.typ
0540: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0550: 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b  eCost WhereCost;
0560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0570: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0580: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0590: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
05a0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
05b0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
05c0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
05d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05e0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05f0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0600: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0610: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0620: 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f   others by AND o
0630: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75  perators,.** usu
0640: 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d  ally, or sometim
0650: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
0660: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  s separated by O
0670: 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  R..**.** All Whe
0680: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
0690: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
06a0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06b0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
06c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
06d0: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
06e0: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
06f0: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
0700: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0710: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0720: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0730: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0750: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
0760: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
0770: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
0780: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
0790: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
07a0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07b0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
07c0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
07d0: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
07e0: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
07f0: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
0800: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
0810: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
0820: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
0830: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0840: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0850: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
0860: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0870: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0880: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0890: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
08a0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
08b0: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
08c0: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
08d0: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
08e0: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
08f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
0900: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
0910: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
0920: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
0930: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
0940: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
0950: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
0960: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
0970: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
0980: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
0990: 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68 65  e, wtFlag as the
09a0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74   TERM_ORINFO set
09b0: 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d   and eOperator==
09c0: 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65  WO_OR.** and the
09d0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
09e0: 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74  Info field point
09f0: 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69  s to auxiliary i
0a00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a  nformation that.
0a10: 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ** is collected 
0a20: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20  about the.**.** 
0a30: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
0a40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
0a50: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
0a60: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
0a70: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
0a80: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
0a90: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
0aa0: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
0ab0: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
0ac0: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
0ad0: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
0ae0: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
0af0: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
0b00: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
0b10: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
0b20: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
0b30: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
0b40: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
0b50: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
0b60: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
0b70: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0b80: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0ba0: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0bb0: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0bc0: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
0bd0: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
0be0: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
0bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
0c00: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
0c10: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
0c20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
0c30: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
0c40: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
0c50: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
0c60: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
0c70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
0c80: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
0c90: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
0ca0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0cb0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0cc0: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
0cd0: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
0ce0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
0cf0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
0d00: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
0d10: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
0d20: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
0d30: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
0d40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
0d50: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0d60: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0d70: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0d80: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0d90: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0da0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0db0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0dc0: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0dd0: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0de0: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0df0: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0e00: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0e10: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0e20: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0e30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0e40: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0e50: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
0e60: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
0e70: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
0e80: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
0e90: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
0ea0: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
0eb0: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
0ec0: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
0ed0: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
0ee0: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
0ef0: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
0f00: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
0f10: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65   tables..*/.type
0f20: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0f30: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0f40: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f50: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0f80: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
0f90: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
0fa0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0fc0: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
0fd0: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
0fe0: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
0ff0: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
1000: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
1010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1020: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
1030: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
1040: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
1050: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
1060: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
1070: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
1080: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
1090: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
10a0: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
10b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f  nformation if eO
10c0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a  perator==WO_OR *
10d0: 2f 0a 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e  /.    WhereAndIn
10e0: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a  fo *pAndInfo; /*
10f0: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
1100: 6f 6e 20 69 66 20 65 4f 70 65 72 61 74 6f 72 3d  on if eOperator=
1110: 3d 57 4f 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75  =WO_AND */.  } u
1120: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
1130: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
1140: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
1150: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
1160: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
1170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
1180: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
1190: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
11a0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
11b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11c0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
11d0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
11e0: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
11f0: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
1200: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
1210: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
1220: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
1230: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
1240: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
1250: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
1260: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
1270: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
1280: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
1290: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
12a0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
12b0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
12c0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
12d0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
12e0: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
12f0: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
1300: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
1310: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
1320: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1330: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
1340: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
1350: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
1360: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
1370: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
1380: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
1390: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
13a0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
13b0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
13c0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
13d0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
13e0: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
13f0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
1400: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
1410: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
1420: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
1430: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
1440: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
1450: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
1460: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
1470: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
1480: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
1490: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
14a0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
14b0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
14c0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
14d0: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
14e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14f0: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
1500: 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20  VNULL    0x80   
1510: 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20  /* Manufactured 
1520: 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c  x>NULL or x<=NUL
1530: 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a  L term */.#else.
1540: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
1550: 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f  NULL    0x00   /
1560: 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f  * Disabled if no
1570: 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f  t using stat3 */
1580: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1590: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
15a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
15b0: 63 74 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20  cture holds all 
15c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
15d0: 74 20 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  t a.** WHERE cla
15e0: 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69  use.  Mostly thi
15f0: 73 20 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72  s is a container
1600: 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   for one or more
1610: 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a   WhereTerms..**.
1620: 2a 2a 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ** Explanation o
1630: 66 20 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61  f pOuter:  For a
1640: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
1650: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
1660: 20 20 20 20 20 20 20 20 20 20 61 20 41 4e 44 20            a AND 
1670: 28 28 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64  ((b AND c) OR (d
1680: 20 41 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a   AND e)) AND f.*
1690: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73  *.** There are s
16a0: 65 70 61 72 61 74 65 20 57 68 65 72 65 43 6c 61  eparate WhereCla
16b0: 75 73 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  use objects for 
16c0: 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65  the whole clause
16d0: 20 61 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20   and for.** the 
16e0: 73 75 62 63 6c 61 75 73 65 73 20 22 28 62 20 41  subclauses "(b A
16f0: 4e 44 20 63 29 22 20 61 6e 64 20 22 28 64 20 41  ND c)" and "(d A
1700: 4e 44 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75  ND e)".  The pOu
1710: 74 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ter field of the
1720: 0a 2a 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70  .** subclauses p
1730: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65  oints to the Whe
1740: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
1750: 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c  for the whole cl
1760: 61 75 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ause..*/.struct 
1770: 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20  WhereClause {.  
1780: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1790: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17a0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
17b0: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
17c0: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a 20   *pMaskSet;  /* 
17d0: 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c 65  Mapping of table
17e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
17f0: 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20  to bitmasks */. 
1800: 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b 20   Bitmask vmask; 
1810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
1820: 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67  mask identifying
1830: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
1840: 75 72 73 6f 72 73 20 2a 2f 0a 20 20 57 68 65 72  ursors */.  Wher
1850: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
1860: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
1870: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
1880: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
1890: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
18a0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
18b0: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
18c0: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
18d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
18e0: 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45  ht include WHERE
18f0: 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69  _AND_ONLY */.  i
1900: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1910: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1920: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1930: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1950: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1960: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1970: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1980: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1990: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
19a0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
19b0: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
19c0: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
19d0: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
19e0: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
19f0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
1a00: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
1a10: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
1a20: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
1a30: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
1a40: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1a50: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1a60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1a70: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1a80: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1a90: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1aa0: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1ab0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1ac0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1ad0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1ae0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1af0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1b00: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1b10: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1b20: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1b30: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1b40: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1b50: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1b60: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1b70: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1b80: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1b90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1ba0: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1bb0: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1bc0: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1bd0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1be0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1bf0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1c00: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1c10: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1c20: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1c30: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1c40: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1c50: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1c60: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1c70: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1c80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1c90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1ca0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1cb0: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1cc0: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1cd0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ce0: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1cf0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1d00: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1d10: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1d20: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1d30: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1d40: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1d50: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1d60: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1d70: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1d80: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1d90: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1da0: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1db0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1dc0: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1dd0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1de0: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1df0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1e00: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1e10: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1e20: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1e30: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1e40: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1e50: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1e60: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1e70: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1e80: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1e90: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1ea0: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1eb0: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1ec0: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1ed0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1ee0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1ef0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1f00: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1f10: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1f20: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1f30: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1f40: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f50: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1f60: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1f70: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1f80: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1f90: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1fa0: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1fb0: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1fc0: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1fd0: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1fe0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1ff0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
2000: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
2010: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
2020: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
2030: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
2040: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
2050: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
2060: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
2070: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
2080: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
2090: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
20a0: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
20b0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
20c0: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
20d0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
20e0: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
20f0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
2100: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
2110: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
2120: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
2130: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
2140: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
2150: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
2160: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
2170: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
2180: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21b0: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
21c0: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
21d0: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
21e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21f0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
2200: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
2210: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
2220: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
2230: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
2240: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2250: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2260: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2270: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2280: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2290: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
22a0: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
22b0: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
22c0: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
22d0: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
22e0: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
22f0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2300: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
2310: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
2320: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
2330: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
2340: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2350: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2360: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2370: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2380: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2390: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
23a0: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
23b0: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
23c0: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
23d0: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
23e0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
23f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
2400: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
2410: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
2420: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
2430: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
2440: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2450: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2460: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2470: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2480: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2490: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
24a0: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
24b0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
24c0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
24d0: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
24e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
24f0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
2500: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
2510: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
2520: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
2530: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
2540: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2550: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2560: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2570: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2580: 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20  #define WO_NOOP 
2590: 20 20 30 78 38 30 30 20 20 20 20 20 20 20 2f 2a    0x800       /*
25a0: 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65 73 20   This term does 
25b0: 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73 65 61  not restrict sea
25c0: 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64  rch space */..#d
25d0: 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20  efine WO_ALL    
25e0: 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0xfff       /* M
25f0: 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69  ask of all possi
2600: 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  ble WO_* values 
2610: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49  */.#define WO_SI
2620: 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20  NGLE 0x0ff      
2630: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2640: 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f  non-compound WO_
2650: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a  * values */../*.
2660: 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46  ** Value for wsF
2670: 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2680: 20 62 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64   bestIndex() and
2690: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68   stored in.** Wh
26a0: 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73  ereLevel.wsFlags
26b0: 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 64  .  These flags d
26c0: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73  etermine which s
26d0: 65 61 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67  earch.** strateg
26e0: 69 65 73 20 61 72 65 20 61 70 70 72 6f 70 72 69  ies are appropri
26f0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ate..**.** The l
2700: 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  east significant
2710: 20 31 32 20 62 69 74 73 20 69 73 20 72 65 73 65   12 bits is rese
2720: 72 76 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66  rved as a mask f
2730: 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62  or WO_ values ab
2740: 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72  ove..** The Wher
2750: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66  eLevel.wsFlags f
2760: 69 65 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20  ield is usually 
2770: 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f  set to WO_IN|WO_
2780: 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a  EQ|WO_ISNULL..**
2790: 20 42 75 74 20 69 66 20 74 68 65 20 74 61 62 6c   But if the tabl
27a0: 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
27b0: 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a  able of a left j
27c0: 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e  oin, WhereLevel.
27d0: 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65  wsFlags.** is se
27e0: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
27f0: 2e 20 20 54 68 65 20 57 68 65 72 65 4c 65 76 65  .  The WhereLeve
2800: 6c 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20  l.wsFlags field 
2810: 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64  can then be used
2820: 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20   as.** the "op" 
2830: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e  parameter to fin
2840: 64 54 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72  dTerm when we ar
2850: 65 20 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61  e resolving equa
2860: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
2870: 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73  ..** ISNULL cons
2880: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65  traints will the
2890: 6e 20 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e  n not be used on
28a0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
28b0: 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f   of a left.** jo
28c0: 69 6e 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31  in.  Tickets #21
28d0: 37 37 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f  77 and #2189..*/
28e0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
28f0: 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78 30 30  OWID_EQ     0x00
2900: 30 30 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64  001000  /* rowid
2910: 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49  =EXPR or rowid I
2920: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
2930: 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  ne WHERE_ROWID_R
2940: 41 4e 47 45 20 20 30 78 30 30 30 30 32 30 30 30  ANGE  0x00002000
2950: 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20    /* rowid<EXPR 
2960: 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50  and/or rowid>EXP
2970: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
2980: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20  RE_COLUMN_EQ    
2990: 30 78 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78  0x00010000  /* x
29a0: 3d 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e  =EXPR or x IN (.
29b0: 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c  ..) or x IS NULL
29c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
29d0: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30  E_COLUMN_RANGE 0
29e0: 78 30 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c  x00020000  /* x<
29f0: 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58  EXPR and/or x>EX
2a00: 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  PR */.#define WH
2a10: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20  ERE_COLUMN_IN   
2a20: 20 30 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20   0x00040000  /* 
2a30: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
2a40: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
2a50: 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38 30  MN_NULL  0x00080
2a60: 30 30 30 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c  000  /* x IS NUL
2a70: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  L */.#define WHE
2a80: 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20  RE_INDEXED      
2a90: 30 78 30 30 30 66 30 30 30 30 20 20 2f 2a 20 41  0x000f0000  /* A
2aa0: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 75 73 65  nything that use
2ab0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64  s an index */.#d
2ac0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4e 4f 54 5f  efine WHERE_NOT_
2ad0: 46 55 4c 4c 53 43 41 4e 20 30 78 31 30 30 66 33  FULLSCAN 0x100f3
2ae0: 30 30 30 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74  000  /* Does not
2af0: 20 64 6f 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   do a full table
2b00: 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65   scan */.#define
2b10: 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20   WHERE_IN_ABLE  
2b20: 20 20 20 20 30 78 30 30 30 66 31 30 30 30 20 20      0x000f1000  
2b30: 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75 70 70 6f  /* Able to suppo
2b40: 72 74 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  rt an IN operato
2b50: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  r */.#define WHE
2b60: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20  RE_TOP_LIMIT    
2b70: 30 78 30 30 31 30 30 30 30 30 20 20 2f 2a 20 78  0x00100000  /* x
2b80: 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52  <EXPR or x<=EXPR
2b90: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
2ba0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d  define WHERE_BTM
2bb0: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 32 30  _LIMIT    0x0020
2bc0: 30 30 30 30 20 20 2f 2a 20 78 3e 45 58 50 52 20  0000  /* x>EXPR 
2bd0: 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74  or x>=EXPR const
2be0: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
2bf0: 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49   WHERE_BOTH_LIMI
2c00: 54 20 20 20 30 78 30 30 33 30 30 30 30 30 20 20  T   0x00300000  
2c10: 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50 52 20 61  /* Both x>EXPR a
2c20: 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65  nd x<EXPR */.#de
2c30: 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f  fine WHERE_IDX_O
2c40: 4e 4c 59 20 20 20 20 20 30 78 30 30 34 30 30 30  NLY     0x004000
2c50: 30 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  00  /* Use index
2c60: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
2c70: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
2c80: 45 52 45 5f 4f 52 44 45 52 45 44 20 20 20 20 20  ERE_ORDERED     
2c90: 20 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a 20   0x00800000  /* 
2ca0: 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65  Output will appe
2cb0: 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72  ar in correct or
2cc0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
2cd0: 48 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20  HERE_REVERSE    
2ce0: 20 20 30 78 30 31 30 30 30 30 30 30 20 20 2f 2a    0x01000000  /*
2cf0: 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   Scan in reverse
2d00: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2d10: 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20  e WHERE_UNIQUE  
2d20: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2d30: 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d   /* Selects no m
2d40: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
2d50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2d60: 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20 20 20 30  E_ALL_UNIQUE   0
2d70: 78 30 34 30 30 30 30 30 30 20 20 2f 2a 20 54 68  x04000000  /* Th
2d80: 69 73 20 61 6e 64 20 61 6c 6c 20 70 72 69 6f 72  is and all prior
2d90: 20 68 61 76 65 20 6f 6e 65 20 72 6f 77 20 2a 2f   have one row */
2da0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
2db0: 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78 30 38  IRTUALTABLE 0x08
2dc0: 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 76  000000  /* Use v
2dd0: 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f  irtual-table pro
2de0: 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69  cessing */.#defi
2df0: 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  ne WHERE_MULTI_O
2e00: 52 20 20 20 20 20 30 78 31 30 30 30 30 30 30 30  R     0x10000000
2e10: 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75    /* OR using mu
2e20: 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a  ltiple indices *
2e30: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2e40: 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78 32  TEMP_INDEX   0x2
2e50: 30 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 73  0000000  /* Uses
2e60: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2e70: 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  dex */.#define W
2e80: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 20 20 20  HERE_DISTINCT   
2e90: 20 20 30 78 34 30 30 30 30 30 30 30 20 20 2f 2a    0x40000000  /*
2ea0: 20 43 6f 72 72 65 63 74 20 6f 72 64 65 72 20 66   Correct order f
2eb0: 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 23  or DISTINCT */.#
2ec0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 56  define WHERE_COV
2ed0: 45 52 5f 53 43 41 4e 20 20 20 30 78 38 30 30 30  ER_SCAN   0x8000
2ee0: 30 30 30 30 20 20 2f 2a 20 46 75 6c 6c 20 73 63  0000  /* Full sc
2ef0: 61 6e 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67  an of a covering
2f00: 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   index */../*.**
2f10: 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63 6f 6e   This module con
2f20: 74 61 69 6e 73 20 6d 61 6e 79 20 73 65 70 61 72  tains many separ
2f30: 61 74 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ate subroutines 
2f40: 74 68 61 74 20 77 6f 72 6b 20 74 6f 67 65 74 68  that work togeth
2f50: 65 72 20 74 6f 0a 2a 2a 20 66 69 6e 64 20 74 68  er to.** find th
2f60: 65 20 62 65 73 74 20 69 6e 64 69 63 65 73 20 74  e best indices t
2f70: 6f 20 75 73 65 20 66 6f 72 20 61 63 63 65 73 73  o use for access
2f80: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
2f90: 20 74 61 62 6c 65 20 69 6e 20 61 20 71 75 65 72   table in a quer
2fa0: 79 2e 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  y..** An instanc
2fb0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2fc0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c  ng structure hol
2fd0: 64 73 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72  ds context infor
2fe0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
2ff0: 0a 2a 2a 20 69 6e 64 65 78 20 73 65 61 72 63 68  .** index search
3000: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
3010: 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 70  be more easily p
3020: 61 73 73 65 64 20 62 65 74 77 65 65 6e 20 74 68  assed between th
3030: 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 72 6f 75  e various.** rou
3040: 74 69 6e 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  tines..*/.typede
3050: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 42 65  f struct WhereBe
3060: 73 74 49 64 78 20 57 68 65 72 65 42 65 73 74 49  stIdx WhereBestI
3070: 64 78 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65  dx;.struct Where
3080: 42 65 73 74 49 64 78 20 7b 0a 20 20 50 61 72 73  BestIdx {.  Pars
3090: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30b0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
30c0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
30d0: 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
30e0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
30f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
3100: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3110: 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
3120: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
3130: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
3140: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
3150: 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
3160: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
3170: 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61  rsors not availa
3180: 62 6c 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ble */.  Bitmask
3190: 20 6e 6f 74 56 61 6c 69 64 3b 20 20 20 20 20 20   notValid;      
31a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
31b0: 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
31c0: 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73  e for any purpos
31d0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
31e0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20  *pOrderBy;      
31f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
3200: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3210: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
3220: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
3230: 20 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74     /* The select
3240: 2d 6c 69 73 74 20 69 66 20 71 75 65 72 79 20 69  -list if query i
3250: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
3260: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
3270: 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 3b 20  fo **ppIdxInfo; 
3280: 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61  /* Index informa
3290: 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78  tion passed to x
32a0: 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 69  BestIndex */.  i
32b0: 6e 74 20 69 2c 20 6e 3b 20 20 20 20 20 20 20 20  nt i, n;        
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32d0: 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20 69 73 20  * Which loop is 
32e0: 62 65 69 6e 67 20 63 6f 64 65 64 3b 20 23 20 6f  being coded; # o
32f0: 66 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65  f loops */.  Whe
3300: 72 65 4c 65 76 65 6c 20 2a 61 4c 65 76 65 6c 3b  reLevel *aLevel;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3320: 49 6e 66 6f 20 61 62 6f 75 74 20 6f 75 74 65 72  Info about outer
3330: 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65 72   loops */.  Wher
3340: 65 43 6f 73 74 20 63 6f 73 74 3b 20 20 20 20 20  eCost cost;     
3350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3360: 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
3370: 20 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   plan */.};../*.
3380: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
3390: 66 20 74 68 65 20 70 72 6f 62 65 20 63 6f 73 74  f the probe cost
33a0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
33b0: 65 20 62 61 73 65 6c 69 6e 65 20 63 6f 73 74 0a  e baseline cost.
33c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
33d0: 6d 70 61 72 65 43 6f 73 74 28 63 6f 6e 73 74 20  mpareCost(const 
33e0: 57 68 65 72 65 43 6f 73 74 20 2a 70 50 72 6f 62  WhereCost *pProb
33f0: 65 2c 20 63 6f 6e 73 74 20 57 68 65 72 65 43 6f  e, const WhereCo
3400: 73 74 20 2a 70 42 61 73 65 6c 69 6e 65 29 7b 0a  st *pBaseline){.
3410: 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 72 43    if( pProbe->rC
3420: 6f 73 74 3c 70 42 61 73 65 6c 69 6e 65 2d 3e 72  ost<pBaseline->r
3430: 43 6f 73 74 20 29 20 72 65 74 75 72 6e 20 31 3b  Cost ) return 1;
3440: 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 72  .  if( pProbe->r
3450: 43 6f 73 74 3e 70 42 61 73 65 6c 69 6e 65 2d 3e  Cost>pBaseline->
3460: 72 43 6f 73 74 20 29 20 72 65 74 75 72 6e 20 30  rCost ) return 0
3470: 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  ;.  if( pProbe->
3480: 70 6c 61 6e 2e 6e 4f 42 53 61 74 3e 70 42 61 73  plan.nOBSat>pBas
3490: 65 6c 69 6e 65 2d 3e 70 6c 61 6e 2e 6e 4f 42 53  eline->plan.nOBS
34a0: 61 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  at ) return 1;. 
34b0: 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 6c 61   if( pProbe->pla
34c0: 6e 2e 6e 52 6f 77 3c 70 42 61 73 65 6c 69 6e 65  n.nRow<pBaseline
34d0: 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 29 20 72 65  ->plan.nRow ) re
34e0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
34f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
3500: 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c  tialize a preall
3510: 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75  ocated WhereClau
3520: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
3530: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
3540: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20  reClauseInit(.  
3550: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3560: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3570: 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62  WhereClause to b
3580: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  e initialized */
3590: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
35a0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
35b0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
35c0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
35d0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
35e0: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
35f0: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75   table cursor nu
3600: 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b  mbers to bitmask
3610: 73 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  s */.  u16 wctrl
3620: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
3630: 2f 2a 20 4d 69 67 68 74 20 69 6e 63 6c 75 64 65  /* Might include
3640: 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
3650: 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61  */.){.  pWC->pPa
3660: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
3670: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20  pWC->pMaskSet = 
3680: 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d  pMaskSet;.  pWC-
3690: 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a 20 20 70  >pOuter = 0;.  p
36a0: 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20  WC->nTerm = 0;. 
36b0: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72   pWC->nSlot = Ar
36c0: 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74  raySize(pWC->aSt
36d0: 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20  atic);.  pWC->a 
36e0: 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a  = pWC->aStatic;.
36f0: 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30    pWC->vmask = 0
3700: 3b 0a 20 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c  ;.  pWC->wctrlFl
3710: 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
3720: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
3730: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
3740: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
3750: 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43  auseClear(WhereC
3760: 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  lause*);../*.** 
3770: 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d  Deallocate all m
3780: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
3790: 20 77 69 74 68 20 61 20 57 68 65 72 65 4f 72 49   with a WhereOrI
37a0: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
37b0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
37c0: 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  OrInfoDelete(sql
37d0: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f  ite3 *db, WhereO
37e0: 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65  rInfo *p){.  whe
37f0: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
3800: 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->wc);.  sqlite3
3810: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
3820: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
3830: 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  te all memory as
3840: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
3850: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a  WhereAndInfo obj
3860: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
3870: 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f  oid whereAndInfo
3880: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
3890: 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f  db, WhereAndInfo
38a0: 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61   *p){.  whereCla
38b0: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
38c0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
38d0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
38e0: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
38f0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
3900: 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65 72  cture.  The Wher
3910: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
3920: 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e  e.** itself is n
3930: 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73 20  ot freed.  This 
3940: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 69  routine is the i
3950: 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72 65 43  nverse of whereC
3960: 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a  lauseInit()..*/.
3970: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
3980: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65  eClauseClear(Whe
3990: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a  reClause *pWC){.
39a0: 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
39b0: 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74  Term *a;.  sqlit
39c0: 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50  e3 *db = pWC->pP
39d0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28  arse->db;.  for(
39e0: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20  i=pWC->nTerm-1, 
39f0: 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20  a=pWC->a; i>=0; 
3a00: 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69  i--, a++){.    i
3a10: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
3a20: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
3a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
3a40: 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70  rDelete(db, a->p
3a50: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
3a60: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
3a70: 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b  & TERM_ORINFO ){
3a80: 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e  .      whereOrIn
3a90: 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  foDelete(db, a->
3aa0: 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20  u.pOrInfo);.    
3ab0: 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46  }else if( a->wtF
3ac0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49  lags & TERM_ANDI
3ad0: 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65  NFO ){.      whe
3ae0: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
3af0: 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66  db, a->u.pAndInf
3b00: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
3b10: 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d  if( pWC->a!=pWC-
3b20: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
3b30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3b40: 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d  , pWC->a);.  }.}
3b50: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69  ../*.** Add a si
3b60: 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65  ngle new WhereTe
3b70: 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  rm entry to the 
3b80: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
3b90: 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e  ct pWC..** The n
3ba0: 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a  ew WhereTerm obj
3bb0: 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74  ect is construct
3bc0: 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61  ed from Expr p a
3bd0: 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e  nd with wtFlags.
3be0: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e  .** The index in
3bf0: 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65   pWC->a[] of the
3c00: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 69   new WhereTerm i
3c10: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
3c20: 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72  ccess..** 0 is r
3c30: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e  eturned if the n
3c40: 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75  ew WhereTerm cou
3c50: 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20  ld not be added 
3c60: 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a  due to a memory.
3c70: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ** allocation er
3c80: 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ror.  The memory
3c90: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
3ca0: 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f  ure will be reco
3cb0: 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  rded in.** the d
3cc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3cd0: 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69 67  flag so that hig
3ce0: 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69  her-level functi
3cf0: 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20 69  ons can detect i
3d00: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
3d10: 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65  utine will incre
3d20: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
3d30: 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72  the pWC->a[] arr
3d40: 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ay as necessary.
3d50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74  .**.** If the wt
3d60: 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  Flags argument i
3d70: 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e  ncludes TERM_DYN
3d80: 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f  AMIC, then respo
3d90: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72  nsibility.** for
3da0: 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70   freeing the exp
3db0: 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73  ression p is ass
3dc0: 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72  umed by the Wher
3dd0: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70  eClause object p
3de0: 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  WC..** This is t
3df0: 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69 73  rue even if this
3e00: 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74   routine fails t
3e10: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
3e20: 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
3e30: 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73  * WARNING:  This
3e40: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72   routine might r
3e50: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70  eallocate the sp
3e60: 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ace used to stor
3e70: 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e  e.** WhereTerms.
3e80: 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74    All pointers t
3e90: 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f  o WhereTerms sho
3ea0: 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74  uld be invalidat
3eb0: 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c  ed after.** call
3ec0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
3ed0: 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73  .  Such pointers
3ee0: 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61   may be reinitia
3ef0: 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e  lized by referen
3f00: 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d  cing.** the pWC-
3f10: 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  >a[] array..*/.s
3f20: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43  tatic int whereC
3f30: 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72  lauseInsert(Wher
3f40: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
3f50: 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67  pr *p, u8 wtFlag
3f60: 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  s){.  WhereTerm 
3f70: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64  *pTerm;.  int id
3f80: 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77  x;.  testcase( w
3f90: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
3fa0: 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a  RTUAL );  /* EV:
3fb0: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 20 2a   R-00211-15100 *
3fc0: 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65  /.  if( pWC->nTe
3fd0: 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29  rm>=pWC->nSlot )
3fe0: 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
3ff0: 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a  *pOld = pWC->a;.
4000: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4010: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pWC->pParse->d
4020: 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  b;.    pWC->a = 
4030: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
4040: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57  aw(db, sizeof(pW
4050: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53  C->a[0])*pWC->nS
4060: 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  lot*2 );.    if(
4070: 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20   pWC->a==0 ){.  
4080: 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73 20      if( wtFlags 
4090: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
40a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
40b0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
40c0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
40d0: 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b    pWC->a = pOld;
40e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
40f0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
4100: 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20  y(pWC->a, pOld, 
4110: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
4120: 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20  )*pWC->nTerm);. 
4130: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43     if( pOld!=pWC
4140: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
4150: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4160: 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20  (db, pOld);.    
4170: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
4180: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
4190: 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e  ocSize(db, pWC->
41a0: 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  a)/sizeof(pWC->a
41b0: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72  [0]);.  }.  pTer
41c0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20  m = &pWC->a[idx 
41d0: 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b  = pWC->nTerm++];
41e0: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
41f0: 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  = p;.  pTerm->wt
4200: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
4210: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
4220: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
4230: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
4240: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
4250: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4260: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
4270: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
4280: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
4290: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
42a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
42b0: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
42c0: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
42d0: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
42e0: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
42f0: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
4300: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
4310: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
4320: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
4330: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
4340: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
4350: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
4360: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
4370: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
4380: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
4390: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
43a0: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
43b0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
43c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
43d0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
43e0: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
43f0: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
4400: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4420: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
4430: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
4440: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
4450: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
4460: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
4470: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
4480: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
4490: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
44a0: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
44b0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
44c0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
44d0: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
44e0: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
44f0: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
4500: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
4510: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
4520: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
4530: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
4540: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
4550: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
4560: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
4570: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
4580: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4590: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
45a0: 6e 74 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f  nt op){.  pWC->o
45b0: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66  p = (u8)op;.  if
45c0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
45d0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
45e0: 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20  ->op!=op ){.    
45f0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
4600: 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29  t(pWC, pExpr, 0)
4610: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
4620: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
4630: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29  Expr->pLeft, op)
4640: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
4650: 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69  (pWC, pExpr->pRi
4660: 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a  ght, op);.  }.}.
4670: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
4680: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
4690: 6d 61 73 6b 20 73 65 74 20 28 61 20 57 68 65 72  mask set (a Wher
46a0: 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29  eMaskSet object)
46b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74  .*/.#define init
46c0: 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73  MaskSet(P)  mems
46d0: 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(P, 0, sizeof(
46e0: 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  *P))../*.** Retu
46f0: 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  rn the bitmask f
4700: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
4710: 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  sor number.  Ret
4720: 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72  urn 0 if.** iCur
4730: 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  sor is not in th
4740: 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e set..*/.static
4750: 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b   Bitmask getMask
4760: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
4770: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
4780: 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rsor){.  int i;.
4790: 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53    assert( pMaskS
47a0: 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65  et->n<=(int)size
47b0: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b  of(Bitmask)*8 );
47c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d  .  for(i=0; i<pM
47d0: 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  askSet->n; i++){
47e0: 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65  .    if( pMaskSe
47f0: 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f  t->ix[i]==iCurso
4800: 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  r ){.      retur
4810: 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  n ((Bitmask)1)<<
4820: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  i;.    }.  }.  r
4830: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4840: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d  * Create a new m
4850: 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69  ask for cursor i
4860: 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cursor..**.** Th
4870: 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f  ere is one curso
4880: 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74  r per table in t
4890: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
48a0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   The number of.*
48b0: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
48c0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
48d0: 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74  imited by a test
48e0: 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a   early in the.**
48f0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
4900: 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  in() routine.  S
4910: 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
4920: 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  he pMaskSet->ix[
4930: 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20  ].** array will 
4940: 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a  never overflow..
4950: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
4960: 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d  reateMask(WhereM
4970: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4980: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
4990: 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53    assert( pMaskS
49a0: 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a  et->n < ArraySiz
49b0: 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20  e(pMaskSet->ix) 
49c0: 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69  );.  pMaskSet->i
49d0: 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d  x[pMaskSet->n++]
49e0: 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f   = iCursor;.}../
49f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4a00: 65 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69  e walks (recursi
4a10: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
4a20: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
4a30: 65 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d  erates.** a bitm
4a40: 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77  ask indicating w
4a50: 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
4a60: 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70  used in that exp
4a70: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e  ression.** tree.
4a80: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
4a90: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
4aa0: 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61   to work, the ca
4ab0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d  lling function m
4ac0: 75 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76  ust have.** prev
4ad0: 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73  iously invoked s
4ae0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
4af0: 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20  rNames() on the 
4b00: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65  expression.  See
4b10: 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 63  .** the header c
4b20: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
4b30: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
4b40: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
4b50: 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  n..** The sqlite
4b60: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
4b70: 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f  s() routines loo
4b80: 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61  ks for column na
4b90: 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20  mes and.** sets 
4ba0: 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f  their opcodes to
4bb0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74   TK_COLUMN and t
4bc0: 68 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65  heir Expr.iTable
4bd0: 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68   fields to.** th
4be0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
4bf0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
4c00: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
4c10: 20 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20   just has to.** 
4c20: 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75  translate the cu
4c30: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
4c40: 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  o bitmask values
4c50: 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74   and OR all.** t
4c60: 68 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65  he bitmasks toge
4c70: 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
4c80: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
4c90: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
4ca0: 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69  MaskSet*, ExprLi
4cb0: 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  st*);.static Bit
4cc0: 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54  mask exprSelectT
4cd0: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4ce0: 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a  askSet*, Select*
4cf0: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
4d00: 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  k exprTableUsage
4d10: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
4d20: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70  MaskSet, Expr *p
4d30: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
4d40: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  k = 0;.  if( p==
4d50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4d60: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
4d70: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b  LUMN ){.    mask
4d80: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
4d90: 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b  Set, p->iTable);
4da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b  .    return mask
4db0: 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65  ;.  }.  mask = e
4dc0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4dd0: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68  askSet, p->pRigh
4de0: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
4df0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
4e00: 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29  skSet, p->pLeft)
4e10: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
4e20: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
4e30: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
4e40: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
4e50: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
4e60: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c  skSet, p->x.pSel
4e70: 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ect);.  }else{. 
4e80: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
4e90: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
4ea0: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69  askSet, p->x.pLi
4eb0: 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  st);.  }.  retur
4ec0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
4ed0: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
4ee0: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
4ef0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
4f00: 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  et, ExprList *pL
4f10: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
4f20: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
4f30: 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
4f40: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4f50: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
4f60: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  ++){.      mask 
4f70: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
4f80: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
4f90: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
4fa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4fb0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
4fc0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
4fd0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57  lectTableUsage(W
4fe0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
4ff0: 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70  skSet, Select *p
5000: 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  S){.  Bitmask ma
5010: 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  sk = 0;.  while(
5020: 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69   pS ){.    SrcLi
5030: 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70  st *pSrc = pS->p
5040: 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  Src;.    mask |=
5050: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
5060: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
5070: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
5080: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
5090: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
50a0: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
50b0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
50c0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
50d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
50e0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
50f0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
5100: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
5110: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
5120: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
5130: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
5140: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
5150: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
5160: 53 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Src!=0) ){.     
5170: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
5180: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
5190: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
51a0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53     mask |= exprS
51b0: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
51c0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e  pMaskSet, pSrc->
51d0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
51e0: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65         mask |= e
51f0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
5200: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
5210: 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d  i].pOn);.      }
5220: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20  .    }.    pS = 
5230: 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  pS->pPrior;.  }.
5240: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
5250: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
5260: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
5270: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
5280: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
5290: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
52a0: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
52b0: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
52c0: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
52d0: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
52e0: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
52f0: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
5300: 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a 0a 2a  , and "IN"..**.*
5310: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
5320: 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32 36 33  -OF: R-59926-263
5330: 39 33 20 54 6f 20 62 65 20 75 73 61 62 6c 65 20  93 To be usable 
5340: 62 79 20 61 6e 20 69 6e 64 65 78 20 61 20 74 65  by an index a te
5350: 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f 66  rm must be.** of
5360: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
5370: 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f 6c  owing forms: col
5380: 75 6d 6e 20 3d 20 65 78 70 72 65 73 73 69 6f 6e  umn = expression
5390: 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65 73   column > expres
53a0: 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e  sion.** column >
53b0: 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  = expression col
53c0: 75 6d 6e 20 3c 20 65 78 70 72 65 73 73 69 6f 6e  umn < expression
53d0: 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72 65   column <= expre
53e0: 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73 73  ssion.** express
53f0: 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78 70  ion = column exp
5400: 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e  ression > column
5410: 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20 63   expression >= c
5420: 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73 73  olumn.** express
5430: 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78 70  ion < column exp
5440: 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d  ression <= colum
5450: 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28  n column IN.** (
5460: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 29  expression-list)
5470: 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62 71   column IN (subq
5480: 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53 20  uery) column IS 
5490: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
54a0: 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74  nt allowedOp(int
54b0: 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   op){.  assert( 
54c0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_GT>TK_EQ && T
54d0: 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_GT<TK_GE );.  
54e0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b  assert( TK_LT>TK
54f0: 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f  _EQ && TK_LT<TK_
5500: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
5510: 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LE>TK_EQ && T
5520: 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LE<TK_GE );.  
5530: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
5540: 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75  K_EQ+4 );.  retu
5550: 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  rn op==TK_IN || 
5560: 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70  (op>=TK_EQ && op
5570: 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d  <=TK_GE) || op==
5580: 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a  TK_ISNULL;.}../*
5590: 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a  .** Swap two obj
55a0: 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50  ects of type TYP
55b0: 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57  E..*/.#define SW
55c0: 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59  AP(TYPE,A,B) {TY
55d0: 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74  PE t=A; A=B; B=t
55e0: 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74  ;}../*.** Commut
55f0: 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  e a comparison o
5600: 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73  perator.  Expres
5610: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
5620: 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72  m "X op Y".** ar
5630: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
5640: 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a   "Y op X"..**.**
5650: 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20   If a collation 
5660: 73 65 71 75 65 6e 63 65 20 69 73 20 61 73 73 6f  sequence is asso
5670: 63 69 61 74 65 64 20 77 69 74 68 20 65 69 74 68  ciated with eith
5680: 65 72 20 74 68 65 20 6c 65 66 74 20 6f 72 20 72  er the left or r
5690: 69 67 68 74 0a 2a 2a 20 73 69 64 65 20 6f 66 20  ight.** side of 
56a0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  the comparison, 
56b0: 69 74 20 72 65 6d 61 69 6e 73 20 61 73 73 6f 63  it remains assoc
56c0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
56d0: 61 6d 65 20 73 69 64 65 20 61 66 74 65 72 0a 2a  ame side after.*
56e0: 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61 74 69 6f  * the commutatio
56f0: 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74 65  n. So "Y collate
5700: 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65   NOCASE op X" be
5710: 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 63 6f 6c  comes .** "X col
5720: 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 59  late NOCASE op Y
5730: 22 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ". This is becau
5740: 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  se any collation
5750: 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20   sequence on.** 
5760: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69  the left hand si
5770: 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  de of a comparis
5780: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
5790: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
57a0: 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64  nce .** attached
57b0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46   to the right. F
57c0: 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61 73  or the same reas
57d0: 6f 6e 20 74 68 65 20 45 50 5f 45 78 70 43 6f 6c  on the EP_ExpCol
57e0: 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20  late flag.** is 
57f0: 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f  not commuted..*/
5800: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
5810: 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a  rCommute(Parse *
5820: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
5830: 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52  xpr){.  u16 expR
5840: 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  ight = (pExpr->p
5850: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
5860: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  P_ExpCollate);. 
5870: 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28   u16 expLeft = (
5880: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
5890: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
58a0: 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ate);.  assert( 
58b0: 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d  allowedOp(pExpr-
58c0: 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f  >op) && pExpr->o
58d0: 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 70 45  p!=TK_IN );.  pE
58e0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f  xpr->pRight->pCo
58f0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5900: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5910: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
5920: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
5930: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
5940: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
5950: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
5960: 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53 65 71  ;.  SWAP(CollSeq
5970: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d  *,pExpr->pRight-
5980: 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c  >pColl,pExpr->pL
5990: 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70  eft->pColl);.  p
59a0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
59b0: 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 52  ags = (pExpr->pR
59c0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45  ight->flags & ~E
59d0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20  P_ExpCollate) | 
59e0: 65 78 70 4c 65 66 74 3b 0a 20 20 70 45 78 70 72  expLeft;.  pExpr
59f0: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 3d  ->pLeft->flags =
5a00: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
5a10: 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43  flags & ~EP_ExpC
5a20: 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 52 69 67  ollate) | expRig
5a30: 68 74 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a  ht;.  SWAP(Expr*
5a40: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70  ,pExpr->pRight,p
5a50: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
5a60: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  if( pExpr->op>=T
5a70: 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65  K_GT ){.    asse
5a80: 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
5a90: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
5aa0: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32  ( TK_GE==TK_LE+2
5ab0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
5ac0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20  TK_GT>TK_EQ );. 
5ad0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
5ae0: 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  <TK_LE );.    as
5af0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e  sert( pExpr->op>
5b00: 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d  =TK_GT && pExpr-
5b10: 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op<=TK_GE );.  
5b20: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28    pExpr->op = ((
5b30: 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29  pExpr->op-TK_GT)
5b40: 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d  ^2)+TK_GT;.  }.}
5b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  ../*.** Translat
5b60: 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65  e from TK_xx ope
5b70: 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62  rator to WO_xx b
5b80: 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  itmask..*/.stati
5b90: 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61  c u16 operatorMa
5ba0: 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31  sk(int op){.  u1
5bb0: 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61  6 c;.  assert( a
5bc0: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a  llowedOp(op) );.
5bd0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
5be0: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e  ){.    c = WO_IN
5bf0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
5c00: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
5c10: 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c     c = WO_ISNULL
5c20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
5c30: 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28  ssert( (WO_EQ<<(
5c40: 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37  op-TK_EQ)) < 0x7
5c50: 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28  fff );.    c = (
5c60: 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d  u16)(WO_EQ<<(op-
5c70: 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61  TK_EQ));.  }.  a
5c80: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53  ssert( op!=TK_IS
5c90: 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53  NULL || c==WO_IS
5ca0: 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  NULL );.  assert
5cb0: 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63  ( op!=TK_IN || c
5cc0: 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73  ==WO_IN );.  ass
5cd0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c  ert( op!=TK_EQ |
5ce0: 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  | c==WO_EQ );.  
5cf0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c  assert( op!=TK_L
5d00: 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b  T || c==WO_LT );
5d10: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
5d20: 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45  K_LE || c==WO_LE
5d30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5d40: 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_GT || c==WO
5d50: 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GT );.  assert(
5d60: 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d   op!=TK_GE || c=
5d70: 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75  =WO_GE );.  retu
5d80: 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn c;.}../*.** S
5d90: 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d  earch for a term
5da0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
5db0: 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20  ause that is of 
5dc0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
5dd0: 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72   <expr>".** wher
5de0: 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e  e X is a referen
5df0: 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d  ce to the iColum
5e00: 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20  n of table iCur 
5e10: 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  and <op> is one 
5e20: 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20  of.** the WO_xx 
5e30: 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73  operator codes s
5e40: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
5e50: 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  op parameter..**
5e60: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
5e70: 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20  r to the term.  
5e80: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20  Return 0 if not 
5e90: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
5ea0: 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64   WhereTerm *find
5eb0: 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61  Term(.  WhereCla
5ec0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
5ed0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
5ee0: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
5ef0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5f10: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
5f20: 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  LHS */.  int iCo
5f30: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  lumn,          /
5f40: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
5f50: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d  of LHS */.  Bitm
5f60: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
5f70: 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f    /* RHS must no
5f80: 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74  t overlap with t
5f90: 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33  his mask */.  u3
5fa0: 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  2 op,           
5fb0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57      /* Mask of W
5fc0: 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63  O_xx values desc
5fd0: 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20  ribing operator 
5fe0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
5ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
6000: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
6010: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
6020: 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
6030: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
6040: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b  *pTerm;.  int k;
6050: 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72 3e  .  assert( iCur>
6060: 3d 30 20 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f  =0 );.  op &= WO
6070: 5f 41 4c 4c 3b 0a 20 20 66 6f 72 28 3b 20 70 57  _ALL;.  for(; pW
6080: 43 3b 20 70 57 43 3d 70 57 43 2d 3e 70 4f 75 74  C; pWC=pWC->pOut
6090: 65 72 29 7b 0a 20 20 20 20 66 6f 72 28 70 54 65  er){.    for(pTe
60a0: 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43  rm=pWC->a, k=pWC
60b0: 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c  ->nTerm; k; k--,
60c0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
60d0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
60e0: 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20  Cursor==iCur.   
60f0: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
6100: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
6110: 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20  otReady)==0.    
6120: 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75       && pTerm->u
6130: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
6140: 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26  lumn.         &&
6150: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
6160: 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20  or & op)!=0.    
6170: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28    ){.        if(
6180: 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70   iColumn>=0 && p
6190: 49 64 78 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f  Idx && pTerm->eO
61a0: 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55  perator!=WO_ISNU
61b0: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
61c0: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
61d0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
61e0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
61f0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  l;.          cha
6200: 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20  r idxaff;.      
6210: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
6220: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
6230: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
6240: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 69  ;.  .          i
6250: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
6260: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
6270: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
6280: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
6290: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
62a0: 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29 20  yOk(pX, idxaff) 
62b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 0a 20  ) continue;.  . 
62c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67 75           /* Figu
62d0: 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61  re out the colla
62e0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65  tion sequence re
62f0: 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e 20 69  quired from an i
6300: 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20 20 20  ndex for.       
6310: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75     ** it to be u
6320: 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69  seful for optimi
6330: 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  sing expression 
6340: 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20  pX. Store this. 
6350: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
6360: 65 20 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43  e in variable pC
6370: 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  oll..          *
6380: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
6390: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
63a0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
63b0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
63c0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
63d0: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
63e0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
63f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 43         assert(pC
6400: 6f 6c 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  oll || pParse->n
6410: 45 72 72 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  Err);.  .       
6420: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78     for(j=0; pIdx
6430: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69  ->aiColumn[j]!=i
6440: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
6450: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
6460: 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f  VER(j>=pIdx->nCo
6470: 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30  lumn) ) return 0
6480: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6490: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
64a0: 6c 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  l && sqlite3StrI
64b0: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
64c0: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  , pIdx->azColl[j
64d0: 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ]) ) continue;. 
64e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
64f0: 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20   return pTerm;. 
6500: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6510: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
6520: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
6530: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
6540: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
6550: 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  SrcList*, WhereC
6560: 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  lause*, int);../
6570: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
6580: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
6590: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
65a0: 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f  ause.  .**.**.*/
65b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
65c0: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53  rAnalyzeAll(.  S
65d0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
65e0: 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46  ,       /* the F
65f0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
6600: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
6610: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
6620: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
6630: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
6640: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
6650: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
6660: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
6670: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
6680: 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a  bList, pWC, i);.
6690: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
66a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
66b0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  OPTIMIZATION./*.
66c0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
66d0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
66e0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b  ression is a LIK
66f0: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
6700: 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  or that.** can b
6710: 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
6720: 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  g inequality con
6730: 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72  straints.  Retur
6740: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a  n TRUE if it is.
6750: 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20  ** so and false 
6760: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  if not..**.** In
6770: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f   order for the o
6780: 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70  perator to be op
6790: 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52  timizible, the R
67a0: 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72  HS must be a str
67b0: 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74  ing.** literal t
67c0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  hat does not beg
67d0: 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61  in with a wildca
67e0: 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  rd.  .*/.static 
67f0: 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62  int isLikeOrGlob
6800: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6810: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
6820: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
6830: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
6840: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
6850: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
6860: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
6870: 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78   Expr **ppPrefix
6880: 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ,  /* Pointer to
6890: 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65   TK_STRING expre
68a0: 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65  ssion with patte
68b0: 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69  rn prefix */.  i
68c0: 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c  nt *pisComplete,
68d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
68e0: 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73  only wildcard is
68f0: 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63   % in the last c
6900: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e  haracter */.  in
6910: 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20  t *pnoCase      
6920: 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72  /* True if upper
6930: 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65  case is equivale
6940: 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20  nt to lowercase 
6950: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
6960: 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20  ar *z = 0;      
6970: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20     /* String on 
6980: 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  RHS of LIKE oper
6990: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ator */.  Expr *
69a0: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20  pRight, *pLeft; 
69b0: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e       /* Right an
69c0: 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c  d left size of L
69d0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
69e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
69f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
6a00: 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73  List of operands
6a10: 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65   to the LIKE ope
6a20: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
6a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6a40: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61        /* One cha
6a50: 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f  racter in z[] */
6a60: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a80: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
6a90: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
6aa0: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63  haracters */.  c
6ab0: 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20  har wc[3];      
6ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c            /* Wil
6ad0: 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73  dcard characters
6ae0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6af0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
6b00: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
6b10: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  nection */.  sql
6b20: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
6b30: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20   = 0;.  int op; 
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b50: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20     /* Opcode of 
6b60: 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28  pRight */..  if(
6b70: 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46   !sqlite3IsLikeF
6b80: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70  unction(db, pExp
6b90: 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20  r, pnoCase, wc) 
6ba0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6bb0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
6bc0: 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20  TE_EBCDIC.  if( 
6bd0: 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72  *pnoCase ) retur
6be0: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c  n 0;.#endif.  pL
6bf0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
6c00: 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20  List;.  pLeft = 
6c10: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
6c20: 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  r;.  if( pLeft->
6c30: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20  op!=TK_COLUMN . 
6c40: 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
6c50: 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21  Affinity(pLeft)!
6c60: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
6c70: 20 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61   .   || IsVirtua
6c80: 6c 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20  l(pLeft->pTab). 
6c90: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20   ){.    /* IMP: 
6ca0: 52 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68  R-02065-49465 Th
6cb0: 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
6cc0: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20   of the LIKE or 
6cd0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75  GLOB operator mu
6ce0: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
6cf0: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65   name of an inde
6d00: 78 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  xed column with 
6d10: 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a  TEXT affinity. *
6d20: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
6d30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
6d40: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d  eft->iColumn!=(-
6d50: 31 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  1) ); /* Because
6d60: 20 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41   IPK never has A
6d70: 46 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52  FF_TEXT */..  pR
6d80: 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  ight = pList->a[
6d90: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d  0].pExpr;.  op =
6da0: 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69   pRight->op;.  i
6db0: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
6dc0: 45 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70  ER ){.    op = p
6dd0: 52 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a  Right->op2;.  }.
6de0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52    if( op==TK_VAR
6df0: 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62  IABLE ){.    Vdb
6e00: 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20  e *pReprepare = 
6e10: 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
6e20: 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  re;.    int iCol
6e30: 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75   = pRight->iColu
6e40: 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  mn;.    pVal = s
6e50: 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c  qlite3VdbeGetVal
6e60: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69  ue(pReprepare, i
6e70: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Col, SQLITE_AFF_
6e80: 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70  NONE);.    if( p
6e90: 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76  Val && sqlite3_v
6ea0: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
6eb0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
6ec0: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20        z = (char 
6ed0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6ee0: 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20  text(pVal);.    
6ef0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
6f00: 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
6f10: 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29  se->pVdbe, iCol)
6f20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
6f30: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
6f40: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
6f50: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
6f60: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
6f70: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
6f80: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
6f90: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
6fa0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
6fb0: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
6fc0: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
6fd0: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
6fe0: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
6ff0: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
7000: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
7010: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
7020: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
7030: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
7040: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
7050: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
7060: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
7070: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
7080: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
7090: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
70a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
70b0: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
70c0: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
70d0: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
70e0: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
70f0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
7100: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
7110: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
7120: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
7130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
7140: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
7150: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  ght->iColumn);. 
7160: 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43         if( *pisC
7170: 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68  omplete && pRigh
7180: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29  t->u.zToken[1] )
7190: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
71a0: 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  f the rhs of the
71b0: 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e   LIKE expression
71c0: 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20   is a variable, 
71d0: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
71e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
71f0: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
7200: 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  le means there i
7210: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76  s no need to inv
7220: 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20  oke the LIKE.   
7230: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
7240: 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56  on, then no OP_V
7250: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
7260: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f  added to the pro
7270: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  gram..          
7280: 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70  ** This causes p
7290: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20  roblems for the 
72a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
72b0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20  ameter_name().  
72c0: 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20          ** API. 
72d0: 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68  To workaround th
72e0: 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20  em, add a dummy 
72f0: 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65  OP_Variable here
7300: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
7310: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
7320: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7330: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7350: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
7360: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31  arse, pRight, r1
7370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
7380: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
7390: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
73a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
73b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
73c0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
73d0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
73e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
73f0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
7400: 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20       z = 0;.    
7410: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
7420: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
7430: 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29  .  return (z!=0)
7440: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7450: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
7460: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
7470: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7480: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
7490: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
74a0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
74b0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
74c0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
74d0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
74e0: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
74f0: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
7500: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
7510: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
7520: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
7530: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
7540: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
7550: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
7560: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
7570: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
7580: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
7590: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
75a0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
75b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
75c0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
75d0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
75e0: 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20  match")!=0 ){.  
75f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7600: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
7610: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
7620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
7630: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7640: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
7650: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
7660: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
7670: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7680: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
7690: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
76a0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
76b0: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
76c0: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
76d0: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
76e0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
76f0: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
7700: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
7710: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
7720: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
7730: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
7740: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7750: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
7760: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
7770: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
7780: 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66  ){.  pDerived->f
7790: 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66  lags |= pBase->f
77a0: 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f  lags & EP_FromJo
77b0: 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  in;.  pDerived->
77c0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
77d0: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
77e0: 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66  oinTable;.}..#if
77f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7800: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
7810: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
7820: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
7830: 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41  UBQUERY)./*.** A
7840: 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68  nalyze a term th
7850: 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  at consists of t
7860: 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f  wo or more OR-co
7870: 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65  nnected.** subte
7880: 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a  rms.  So in:.**.
7890: 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45  **     ... WHERE
78a0: 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37    (a=5) AND (b=7
78b0: 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29   OR c=9 OR d=13)
78c0: 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20   AND (d=13).**  
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e          ^^^^^^^^
78f0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a  ^^^^^^^^^^^^.**.
7900: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7910: 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73  analyzes terms s
7920: 75 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c  uch as the middl
7930: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62  e term in the ab
7940: 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20  ove example..** 
7950: 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62  A WhereOrTerm ob
7960: 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64  ject is computed
7970: 20 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f   and attached to
7980: 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a   the term under.
7990: 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67  ** analysis, reg
79a0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
79b0: 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e  utcome of the an
79c0: 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a  alysis.  Hence:.
79d0: 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  **.**     WhereT
79e0: 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d  erm.wtFlags   |=
79f0: 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a    TERM_ORINFO.**
7a00: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75       WhereTerm.u
7a10: 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64  .pOrInfo  =  a d
7a20: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
7a30: 61 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d  ated WhereOrTerm
7a40: 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68   object.**.** Th
7a50: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61  e term being ana
7a60: 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20  lyzed must have 
7a70: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f  two or more of O
7a80: 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74  R-connected subt
7a90: 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c  erms..** A singl
7aa0: 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20  e subterm might 
7ab0: 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d  be a set of AND-
7ac0: 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75  connected sub-su
7ad0: 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70  bterms..** Examp
7ae0: 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64  les of terms und
7af0: 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a  er analysis:.**.
7b00: 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74  **     (A)     t
7b10: 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78  1.x=t2.y OR t1.x
7b20: 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35  =t2.z OR t1.y=15
7b30: 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a   OR t1.z=t3.a+5.
7b40: 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78  **     (B)     x
7b50: 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d  =expr1 OR expr2=
7b60: 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20  x OR x=expr3.** 
7b70: 20 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78      (C)     t1.x
7b80: 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74  =t2.y OR (t1.x=t
7b90: 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29  2.z AND t1.y=15)
7ba0: 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20  .**     (D)     
7bb0: 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31  x=expr1 OR (y>11
7bc0: 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20   AND y<22 AND z 
7bd0: 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a  LIKE '*hello*').
7be0: 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28  **     (E)     (
7bf0: 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20  p.a=1 AND q.b=2 
7c00: 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70  AND r.c=3) OR (p
7c10: 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41  .x=4 AND q.y=5 A
7c20: 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20  ND r.z=6).**.** 
7c30: 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66  CASE 1:.**.** If
7c40: 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72   all subterms ar
7c50: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e  e of the form T.
7c60: 43 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20  C=expr for some 
7c70: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
7c80: 20 43 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74   C.** a single t
7c90: 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e  able T (as shown
7ca0: 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62   in example B ab
7cb0: 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65  ove) then create
7cc0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
7cd0: 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61  * term that is a
7ce0: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20  n equivalent IN 
7cf0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20  expression.  In 
7d00: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
7d10: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e  the term.** bein
7d20: 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a  g analyzed is:.*
7d30: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78  *.**      x = ex
7d40: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
7d50: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
7d60: 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65  3.**.** then cre
7d70: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
7d80: 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73  l term like this
7d90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  :.**.**      x I
7da0: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
7db0: 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  xpr3).**.** CASE
7dc0: 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   2:.**.** If all
7dd0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
7de0: 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e  dexable by a sin
7df0: 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65  gle table T, the
7e00: 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n set.**.**     
7e10: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
7e20: 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  tor             
7e30: 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20   =  WO_OR.**    
7e40: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
7e50: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
7e60: 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20   |=  the cursor 
7e70: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
7e80: 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65   T.**.** A subte
7e90: 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65  rm is "indexable
7ea0: 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68  " if it is of th
7eb0: 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c  e form.** "T.C <
7ec0: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
7ed0: 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d  e C is any colum
7ee0: 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64  n of table T and
7ef0: 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   .** <op> is one
7f00: 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c   of "=", "<", "<
7f10: 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22  =", ">", ">=", "
7f20: 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e  IS NULL", or "IN
7f30: 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  "..** A subterm 
7f40: 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c  is also indexabl
7f50: 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e  e if it is an AN
7f60: 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  D of two or more
7f70: 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20  .** subsubterms 
7f80: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
7f90: 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62  which is indexab
7fa0: 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41  le.  Indexable A
7fb0: 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20  ND .** subterms 
7fc0: 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72  have their eOper
7fd0: 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41  ator set to WO_A
7fe0: 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65  ND and they have
7ff0: 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73  .** u.pAndInfo s
8000: 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  et to a dynamica
8010: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
8020: 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63  ereAndTerm objec
8030: 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e  t..**.** From an
8040: 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76  other point of v
8050: 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22  iew, "indexable"
8060: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
8070: 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a  subterm could.**
8080: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
8090: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
80a0: 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  ex if an appropr
80b0: 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74  iate index exist
80c0: 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79  s..** This analy
80d0: 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  sis does not con
80e0: 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72  sider whether or
80f0: 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65   not the index e
8100: 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69  xists; that.** i
8110: 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20  s something the 
8120: 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74  bestIndex() rout
8130: 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69  ine will determi
8140: 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73  ne.  This analys
8150: 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73  is.** only looks
8160: 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74   at whether subt
8170: 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65  erms appropriate
8180: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78   for indexing ex
8190: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65  ist..**.** All e
81a0: 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67  xamples A throug
81b0: 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61  h E above all sa
81c0: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42  tisfy case 2.  B
81d0: 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20  ut if a term.** 
81e0: 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20  also statisfies 
81f0: 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20  case 1 (such as 
8200: 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  B) we know that 
8210: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69  the optimizer wi
8220: 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65  ll.** always pre
8230: 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69  fer case 1, so i
8240: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70  n that case we p
8250: 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65  retend that case
8260: 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74   2 is not.** sat
8270: 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74  isfied..**.** It
8280: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
8290: 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  se that multiple
82a0: 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65   tables are inde
82b0: 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d  xable.  For exam
82c0: 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76  ple,.** (E) abov
82d0: 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f  e is indexable o
82e0: 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61  n tables P, Q, a
82f0: 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  nd R..**.** Term
8300: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
8310: 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64  ase 2 are candid
8320: 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20  ates for lookup 
8330: 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61  by using.** sepa
8340: 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20  rate indices to 
8350: 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20  find rowids for 
8360: 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64  each subterm and
8370: 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68   composing.** th
8380: 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72  e union of all r
8390: 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f  owids using a Ro
83a0: 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  wSet object.  Th
83b0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  is is similar.**
83c0: 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69   to "bitmap indi
83d0: 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61  ces" in other da
83e0: 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a  tabase engines..
83f0: 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a  **.** OTHERWISE:
8400: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
8410: 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73  r case 1 nor cas
8420: 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20  e 2 apply, then 
8430: 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61  leave the eOpera
8440: 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65  tor set to.** ze
8450: 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69  ro.  This term i
8460: 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72  s not useful for
8470: 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74   search..*/.stat
8480: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
8490: 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63  yzeOrTerm(.  Src
84a0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
84b0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
84c0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
84d0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
84e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
84f0: 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63  complete WHERE c
8500: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
8510: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
8520: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
8530: 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20   the OR-term to 
8540: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
8550: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
8560: 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b  e = pWC->pParse;
8570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8580: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
8590: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
85a0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
85c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
85d0: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
85e0: 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e   *pTerm = &pWC->
85f0: 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f  a[idxTerm];    /
8600: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
8610: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45   analyzed */.  E
8620: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
8630: 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20  rm->pExpr;      
8640: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
8650: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
8660: 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d  term */.  WhereM
8670: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
8680: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
8690: 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65 20 6d  ; /* Table use m
86a0: 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  asks */.  int i;
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
86e0: 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  rs */.  WhereCla
86f0: 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20  use *pOrWc;     
8700: 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20    /* Breakup of 
8710: 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65  pTerm into subte
8720: 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  rms */.  WhereTe
8730: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20  rm *pOrTerm;    
8740: 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d     /* A Sub-term
8750: 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57   within the pOrW
8760: 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e  c */.  WhereOrIn
8770: 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20  fo *pOrInfo;    
8780: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69   /* Additional i
8790: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63  nformation assoc
87a0: 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d  iated with pTerm
87b0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68   */.  Bitmask ch
87c0: 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20  ngToIN;         
87d0: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
87e0: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
87f0: 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  e 1 */.  Bitmask
8800: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
8810: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
8820: 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c  t are indexable,
8830: 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65   satisfying case
8840: 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   2 */..  /*.  **
8850: 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c   Break the OR cl
8860: 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65  ause into its se
8870: 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e  parate subterms.
8880: 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61    The subterms a
8890: 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  re.  ** stored i
88a0: 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  n a WhereClause 
88b0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
88c0: 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20  ning within the 
88d0: 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a  WhereOrInfo.  **
88e0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
88f0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
8900: 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75  original OR clau
8910: 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20  se term..  */.  
8920: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
8930: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
8940: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49  DYNAMIC|TERM_ORI
8950: 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  NFO|TERM_ANDINFO
8960: 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
8970: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
8980: 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  _OR );.  pTerm->
8990: 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49  u.pOrInfo = pOrI
89a0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
89b0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
89c0: 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b  zeof(*pOrInfo));
89d0: 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d  .  if( pOrInfo==
89e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  0 ) return;.  pT
89f0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
8a00: 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70  TERM_ORINFO;.  p
8a10: 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d  OrWc = &pOrInfo-
8a20: 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  >wc;.  whereClau
8a30: 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57  seInit(pOrWc, pW
8a40: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C->pParse, pMask
8a50: 53 65 74 2c 20 70 57 43 2d 3e 77 63 74 72 6c 46  Set, pWC->wctrlF
8a60: 6c 61 67 73 29 3b 0a 20 20 77 68 65 72 65 53 70  lags);.  whereSp
8a70: 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72  lit(pOrWc, pExpr
8a80: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72  , TK_OR);.  expr
8a90: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
8aa0: 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64   pOrWc);.  if( d
8ab0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8ac0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8ad0: 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  rt( pOrWc->nTerm
8ae0: 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  >=2 );..  /*.  *
8af0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65  * Compute the se
8b00: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
8b10: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
8b20: 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a  ases 1 or 2..  *
8b30: 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20  /.  indexable = 
8b40: 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63  ~(Bitmask)0;.  c
8b50: 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 70 57 43 2d  hngToIN = ~(pWC-
8b60: 3e 76 6d 61 73 6b 29 3b 0a 20 20 66 6f 72 28 69  >vmask);.  for(i
8b70: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
8b80: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
8b90: 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78  a; i>=0 && index
8ba0: 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  able; i--, pOrTe
8bb0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
8bc0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8bd0: 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d  or & WO_SINGLE)=
8be0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
8bf0: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
8c00: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
8c10: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8c20: 61 74 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ator==0 );.     
8c30: 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72   assert( (pOrTer
8c40: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
8c50: 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f  RM_ANDINFO|TERM_
8c60: 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  ORINFO))==0 );. 
8c70: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
8c80: 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66  0;.      pAndInf
8c90: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
8ca0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
8cb0: 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20  f(*pAndInfo));. 
8cc0: 20 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66       if( pAndInf
8cd0: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  o ){.        Whe
8ce0: 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43  reClause *pAndWC
8cf0: 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  ;.        WhereT
8d00: 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20  erm *pAndTerm;. 
8d10: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
8d20: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
8d30: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = 0;.        pOr
8d40: 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
8d50: 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20   = pAndInfo;.   
8d60: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8d70: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e  Flags |= TERM_AN
8d80: 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70  DINFO;.        p
8d90: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8da0: 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20  r = WO_AND;.    
8db0: 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41      pAndWC = &pA
8dc0: 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
8dd0: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49      whereClauseI
8de0: 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d  nit(pAndWC, pWC-
8df0: 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65  >pParse, pMaskSe
8e00: 74 2c 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61  t, pWC->wctrlFla
8e10: 67 73 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  gs);.        whe
8e20: 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20  reSplit(pAndWC, 
8e30: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  pOrTerm->pExpr, 
8e40: 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20  TK_AND);.       
8e50: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
8e60: 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20  pSrc, pAndWC);. 
8e70: 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70         pAndWC->p
8e80: 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
8e90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
8ea0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8eb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
8ec0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
8ee0: 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d  r(j=0, pAndTerm=
8ef0: 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e  pAndWC->a; j<pAn
8f00: 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  dWC->nTerm; j++,
8f10: 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20   pAndTerm++){.  
8f20: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8f30: 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70  ( pAndTerm->pExp
8f40: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
8f50: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
8f60: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  AndTerm->pExpr->
8f70: 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  op) ){.         
8f80: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
8f90: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  k(pMaskSet, pAnd
8fa0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8fb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
8fc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8fd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8fe0: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
8ff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
9000: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
9010: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
9020: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
9030: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
9040: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
9050: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
9060: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
9070: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
9080: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
9090: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
90a0: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
90b0: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
90c0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
90d0: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
90e0: 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  or);.      if( p
90f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9100: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
9110: 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  {.        WhereT
9120: 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
9130: 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d  OrWc->a[pOrTerm-
9140: 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
9150: 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28     b |= getMask(
9160: 70 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72  pMaskSet, pOther
9170: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
9180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64       }.      ind
9190: 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20  exable &= b;.   
91a0: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
91b0: 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51  eOperator!=WO_EQ
91c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
91d0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
91e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
91f0: 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20  hngToIN &= b;.  
9200: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9210: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72  .  /*.  ** Recor
9220: 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  d the set of tab
9230: 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79  les that satisfy
9240: 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65   case 2.  The se
9250: 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20  t might be.  ** 
9260: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f  empty..  */.  pO
9270: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
9280: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20   = indexable;.  
9290: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
92a0: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20   = indexable==0 
92b0: 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20  ? 0 : WO_OR;..  
92c0: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
92d0: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
92e0: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
92f0: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
9300: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
9310: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
9320: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
9330: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
9340: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
9350: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
9360: 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    **.  ** chngTo
9370: 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74  IN will hold eit
9380: 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62  her 0, 1, or 2 b
9390: 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20  its.  The 0-bit 
93a0: 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  case means.  ** 
93b0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
93c0: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
93d0: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
93e0: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
93f0: 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61  an.  ** IN opera
9400: 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  tor because one 
9410: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e  or more terms in
9420: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63   the OR clause c
9430: 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ontain.  ** some
9440: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
9450: 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   == on a column 
9460: 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61  in the single ta
9470: 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a  ble.  The 1-bit.
9480: 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20    ** case means 
9490: 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20  that every term 
94a0: 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
94b0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
94c0: 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75    ** "table.colu
94d0: 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d  mn=expr" for som
94e0: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
94f0: 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61   The one bit tha
9500: 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69  t is set.  ** wi
9510: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ll correspond to
9520: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   the common tabl
9530: 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65  e.  We still nee
9540: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
9550: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65  ke.  ** sure the
9560: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
9570: 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  used on all term
9580: 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61  s.  The 2-bit ca
9590: 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20  se is when.  ** 
95a0: 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  the all terms ar
95b0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  e of the form "t
95c0: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62  able1.column=tab
95d0: 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74  le2.column".  It
95e0: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70  .  ** might be p
95f0: 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20  ossible to form 
9600: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
9610: 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65  ith either table
9620: 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72  1.column.  ** or
9630: 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61   table2.column a
9640: 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74  s the LHS if eit
9650: 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  her is common to
9660: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20   every term of. 
9670: 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73   ** the OR claus
9680: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  e..  **.  ** Not
9690: 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20  e that terms of 
96a0: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e  the form "table.
96b0: 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f  column1=table.co
96c0: 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a  lumn2" (the.  **
96d0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62   same table on b
96e0: 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65  oth sizes of the
96f0: 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f   ==) cannot be o
9700: 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  ptimized..  */. 
9710: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
9720: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
9730: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
9740: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
9750: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
9760: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
9770: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
9780: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
9790: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
97a0: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
97b0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
97c0: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
97d0: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
97e0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
97f0: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
9800: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9810: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9820: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
9830: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
9840: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
9850: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
9860: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
9870: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
9880: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
9890: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
98a0: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
98b0: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
98c0: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
98d0: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
98e0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
98f0: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
9900: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
9910: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
9920: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
9930: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
9940: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
9950: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
9960: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
9970: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
9980: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
9990: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
99a0: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
99b0: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
99c0: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
99d0: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
99e0: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
99f0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
9a00: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
9a10: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9a20: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
9a30: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _EQ );.        p
9a40: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9a50: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
9a60: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
9a70: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
9a80: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
9a90: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
9aa0: 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   the 2-bit case 
9ab0: 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68  and we are on th
9ac0: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
9ad0: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  on and.         
9ae0: 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d   ** current term
9af0: 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72   is from the fir
9b00: 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53  st iteration.  S
9b10: 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d  o skip this term
9b20: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
9b30: 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20  ssert( j==1 );. 
9b40: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
9b50: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
9b60: 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f       if( (chngTo
9b70: 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61  IN & getMask(pMa
9b80: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
9b90: 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20  leftCursor))==0 
9ba0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
9bb0: 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62  This term must b
9bc0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31  e of the form t1
9bd0: 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74  .a==t2.b where t
9be0: 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20  2 is in the.    
9bf0: 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49        ** chngToI
9c00: 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20  N set but t1 is 
9c10: 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20  not.  This term 
9c20: 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70  will be either p
9c30: 72 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20  receeded.       
9c40: 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64     ** or follwed
9c50: 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20   by an inverted 
9c60: 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61  copy (t2.b==t1.a
9c70: 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65  ).  Skip this te
9c80: 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rm .          **
9c90: 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76   and use its inv
9ca0: 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ersion. */.     
9cb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
9cc0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9cd0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b  & TERM_COPIED );
9ce0: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
9cf0: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
9d00: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
9d10: 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  TUAL );.        
9d20: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9d30: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
9d40: 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56  RM_COPIED|TERM_V
9d50: 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20  IRTUAL) );.     
9d60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9d70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9d80: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65   iColumn = pOrTe
9d90: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
9da0: 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f  ;.        iCurso
9db0: 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  r = pOrTerm->lef
9dc0: 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  tCursor;.       
9dd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9de0: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b        if( i<0 ){
9df0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63  .        /* No c
9e00: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63  andidate table+c
9e10: 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e  olumn was found.
9e20: 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
9e30: 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  occur.        **
9e40: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
9e50: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
9e60: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
9e70: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
9e80: 72 74 28 20 28 63 68 6e 67 54 6f 49 4e 26 28 63  rt( (chngToIN&(c
9e90: 68 6e 67 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29  hngToIN-1))==0 )
9ea0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9eb0: 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d  ( chngToIN==getM
9ec0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43  ask(pMaskSet, iC
9ed0: 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20  ursor) );.      
9ee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9ef0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9f00: 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20   j==1 );..      
9f10: 2f 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64  /* We have found
9f20: 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62   a candidate tab
9f30: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20  le and column.  
9f40: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
9f50: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61  that.      ** ta
9f60: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69  ble and column i
9f70: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
9f80: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52  y term in the OR
9f90: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
9fa0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
9fb0: 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69  1;.      for(; i
9fc0: 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54  >=0 && okToChngT
9fd0: 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  oIN; i--, pOrTer
9fe0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
9ff0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
a000: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
a010: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
a020: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
a030: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
a040: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
a050: 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45  ->wtFlags &= ~TE
a060: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
a070: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
a080: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
a090: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
a0a0: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
a0b0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
a0c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0d0: 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20     int affLeft, 
a0e0: 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20  affRight;.      
a0f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69      /* If the ri
a100: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
a110: 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20   also a column, 
a120: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
a130: 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
a140: 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61   of both right a
a150: 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75  nd left sides mu
a160: 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20  st be such that 
a170: 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20  no type.        
a180: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
a190: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
a1a0: 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69   the right.  (Ti
a1b0: 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20  cket #2249).    
a1c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a1d0: 20 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71     affRight = sq
a1e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
a1f0: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
a200: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
a210: 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73       affLeft = s
a220: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
a230: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
a240: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
a250: 20 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68       if( affRigh
a260: 74 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74  t!=0 && affRight
a270: 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20  !=affLeft ){.   
a280: 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e           okToChn
a290: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
a2a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a2b0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
a2c0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
a2d0: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
a2e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
a2f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a300: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
a310: 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  t, okToChngToIN 
a320: 69 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69  is true if origi
a330: 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66  nal pTerm satisf
a340: 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  ies.    ** case 
a350: 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  1.  In that case
a360: 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  , construct a ne
a370: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74  w virtual term t
a380: 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70  hat is .    ** p
a390: 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69  Term converted i
a3a0: 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  nto an IN operat
a3b0: 6f 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  or..    **.    *
a3c0: 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35  * EV: R-00211-15
a3d0: 31 30 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  100.    */.    i
a3e0: 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  f( okToChngToIN 
a3f0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
a400: 44 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dup;            
a410: 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64  /* A transient d
a420: 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73  uplicate express
a430: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
a440: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
a450: 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f  ;   /* The RHS o
a460: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
a470: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
a480: 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *pLeft = 0;     
a490: 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
a4a0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
a4b0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
a4c0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
a4d0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
a4e0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a  IN operator */..
a4f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
a500: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
a510: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
a520: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
a530: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
a540: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
a550: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
a560: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
a570: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a580: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
a590: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
a5a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
a5b0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
a5c0: 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ==iCursor );.   
a5d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
a5e0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
a5f0: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20  mn==iColumn );. 
a600: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
a610: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a620: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
a630: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
a640: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
a650: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
a660: 6e 64 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  nd(pWC->pParse, 
a670: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
a680: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f        pLeft = pO
a690: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
a6a0: 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eft;.      }.   
a6b0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
a6c0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75  !=0 );.      pDu
a6d0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
a6e0: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
a6f0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
a700: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
a710: 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c  se, TK_IN, pDup,
a720: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
a730: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
a740: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
a750: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
a760: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
a770: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
a780: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
a790: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
a7a0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
a7b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a7c0: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
a7d0: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
a7e0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
a7f0: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
a800: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
a810: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
a820: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
a830: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ew==0 );.       
a840: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
a850: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
a860: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
a870: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
a880: 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e  ];.        pWC->
a890: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
a8a0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
a8b0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
a8c0: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ld = 1;.      }e
a8d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
a8e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
a8f0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
a900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65       }.      pTe
a910: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
a920: 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73  WO_NOOP;  /* cas
a930: 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20  e 1 trumps case 
a940: 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  2 */.    }.  }.}
a950: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
a960: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
a970: 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49  IZATION && !SQLI
a980: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
a990: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   */.../*.** The 
a9a0: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
a9b0: 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72  utine is an Wher
a9c0: 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20  eTerm structure 
a9d0: 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  with only the.**
a9e0: 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66   "pExpr" field f
a9f0: 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a  illed in.  The j
aa00: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
aa10: 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65  ne is to analyze
aa20: 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65   the.** subexpre
aa30: 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61  ssion and popula
aa40: 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  te all the other
aa50: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57   fields of the W
aa60: 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75  hereTerm.** stru
aa70: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
aa80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
aa90: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  s of the form "<
aaa0: 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74  expr> <op> X" it
aab0: 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a   gets commuted.*
aac0: 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72  * to the standar
aad0: 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70  d form of "X <op
aae0: 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a  > <expr>"..**.**
aaf0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
ab00: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
ab10: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
ab20: 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20  re both X and Y 
ab30: 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20  are.** columns, 
ab40: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
ab50: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  l expression is 
ab60: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
ab70: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
ab80: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
ab90: 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64  "Y <op> X" is ad
aba0: 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45  ded to the WHERE
abb0: 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61   clause and.** a
abc0: 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65  nalyzed separate
abd0: 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61  ly.  The origina
abe0: 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  l term is marked
abf0: 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45   with TERM_COPIE
ac00: 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77  D.** and the new
ac10: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
ac20: 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49  with TERM_DYNAMI
ac30: 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20  C (because it's 
ac40: 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74  pExpr.** needs t
ac50: 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20  o be freed with 
ac60: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29  the WhereClause)
ac70: 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41   and TERM_VIRTUA
ac80: 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a  L (because it.**
ac90: 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63   is a commuted c
aca0: 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74  opy of a prior t
acb0: 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69  erm.)  The origi
acc0: 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68  nal term has nCh
acd0: 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65  ild=1.** and the
ace0: 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72   copy has idxPar
acf0: 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69  ent set to the i
ad00: 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67  ndex of the orig
ad10: 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  inal term..*/.st
ad20: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
ad30: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74  alyze(.  SrcList
ad40: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
ad50: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
ad60: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
ad70: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
ad80: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
ad90: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
ada0: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
adb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
adc0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20   of the term to 
add0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
ade0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
adf0: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
ae00: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d       /* The term
ae10: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
ae20: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
ae30: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
ae40: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
ae50: 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b  table index mask
ae60: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  s */.  Expr *pEx
ae70: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
ae80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
ae90: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
aea0: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69  analyzed */.  Bi
aeb0: 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74  tmask prereqLeft
aec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
aed0: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
aee0: 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  of the pExpr->pL
aef0: 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  eft */.  Bitmask
af00: 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20   prereqAll;     
af10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
af20: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45  requesites of pE
af30: 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  xpr */.  Bitmask
af40: 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b   extraRight = 0;
af50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
af60: 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  ra dependencies 
af70: 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a  on LEFT JOIN */.
af80: 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20    Expr *pStr1 = 
af90: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
afa0: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b     /* RHS of LIK
afb0: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
afc0: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  */.  int isCompl
afd0: 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ete = 0;        
afe0: 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
aff0: 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77  LIKE/GLOB ends w
b000: 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a  ith wildcard */.
b010: 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30    int noCase = 0
b020: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b030: 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20     /* LIKE/GLOB 
b040: 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63 61  distinguishes ca
b050: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  se */.  int op; 
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d           /* Top-
b080: 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20  level operator. 
b090: 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20   pExpr->op */.  
b0a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
b0b0: 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  pWC->pParse;    
b0c0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
b0d0: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
b0e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b0f0: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  b;        /* Dat
b100: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
b110: 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
b120: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b130: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b140: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
b150: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61  [idxTerm];.  pMa
b160: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
b170: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
b180: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
b190: 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78   prereqLeft = ex
b1a0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
b1b0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c  skSet, pExpr->pL
b1c0: 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78  eft);.  op = pEx
b1d0: 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70  pr->op;.  if( op
b1e0: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61  ==TK_IN ){.    a
b1f0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
b200: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
b210: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
b220: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
b230: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
b240: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
b250: 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74  ght = exprSelect
b260: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
b270: 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Set, pExpr->x.pS
b280: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
b290: 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e{.      pTerm->
b2a0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
b2b0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
b2c0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
b2d0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
b2e0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  }.  }else if( op
b2f0: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
b300: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
b310: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Right = 0;.  }el
b320: 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70  se{.    pTerm->p
b330: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
b340: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
b350: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  kSet, pExpr->pRi
b360: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72  ght);.  }.  prer
b370: 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c  eqAll = exprTabl
b380: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
b390: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45   pExpr);.  if( E
b3a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
b3b0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
b3c0: 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  n) ){.    Bitmas
b3d0: 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k x = getMask(pM
b3e0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  askSet, pExpr->i
b3f0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b  RightJoinTable);
b400: 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c  .    prereqAll |
b410: 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69  = x;.    extraRi
b420: 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f  ght = x-1;  /* O
b430: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  N clause terms m
b440: 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77  ay not be used w
b450: 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20  ith an index.   
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74      ** on left t
b480: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
b490: 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30  OIN.  Ticket #30
b4a0: 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72  15 */.  }.  pTer
b4b0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
b4c0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72  rereqAll;.  pTer
b4d0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
b4e0: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  -1;.  pTerm->iPa
b4f0: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rent = -1;.  pTe
b500: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
b510: 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64  0;.  if( allowed
b520: 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d  Op(op) && (pTerm
b530: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
b540: 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29  prereqLeft)==0 )
b550: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
b560: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
b570: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
b580: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
b590: 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66  ht;.    if( pLef
b5a0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
b5b0: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
b5c0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
b5d0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
b5e0: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74     pTerm->u.left
b5f0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
b600: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
b610: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
b620: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
b630: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
b640: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
b650: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
b660: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
b670: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
b680: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
b690: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
b6a0: 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a  eftCursor>=0 ){.
b6b0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
b6c0: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ew;.        pDup
b6d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b6e0: 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
b6f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
b700: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
b710: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b720: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
b730: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
b740: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
b750: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e    }.        idxN
b760: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
b770: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70  Insert(pWC, pDup
b780: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
b790: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
b7a0: 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77        if( idxNew
b7b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b7c0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57        pNew = &pW
b7d0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
b7e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72        pNew->iPar
b7f0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
b800: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
b810: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
b820: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
b830: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
b840: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
b850: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
b860: 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  D;.      }else{.
b870: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
b880: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
b890: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
b8a0: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
b8b0: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
b8c0: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
b8d0: 20 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a   = pDup->pLeft;.
b8e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
b8f0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
b900: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
b910: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
b920: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
b930: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
b940: 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c  e( (prereqLeft |
b950: 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20   extraRight) != 
b960: 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20  prereqLeft );.  
b970: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
b980: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
b990: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b  ft | extraRight;
b9a0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
b9b0: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
b9c0: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
b9d0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
b9e0: 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f  atorMask(pDup->o
b9f0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  p);.    }.  }..#
ba00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ba10: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
ba20: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
ba30: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
ba40: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
ba50: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
ba60: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
ba70: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
ba80: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
ba90: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
baa0: 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nts.  For exampl
bab0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
bac0: 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e    a BETWEEN b AN
bad0: 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  D c.  **.  ** is
bae0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a   converted into:
baf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
bb00: 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44  (a BETWEEN b AND
bb10: 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41   c) AND (a>=b) A
bb20: 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20  ND (a<=c).  **. 
bb30: 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20   ** The two new 
bb40: 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
bb50: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
bb60: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
bb70: 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
bb80: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22   new terms are "
bb90: 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65  dynamic" and are
bba0: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65   children of the
bbb0: 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45   original BETWEE
bbc0: 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68  N.  ** term.  Th
bbd0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  at means that if
bbe0: 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72   the BETWEEN ter
bbf0: 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20  m is coded, the 
bc00: 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a  children are.  *
bc10: 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20  * skipped.  Or, 
bc20: 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  if the children 
bc30: 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
bc40: 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
bc50: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54  riginal.  ** BET
bc60: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69  WEEN term is ski
bc70: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
bc80: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
bc90: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70  =TK_BETWEEN && p
bca0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
bcb0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
bcc0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
bcd0: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  .pList;.    int 
bce0: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
bcf0: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
bd00: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
bd10: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
bd20: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
bd30: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
bd40: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
bd50: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
bd60: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
bd70: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  pr;.      int id
bd80: 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNew;.      pNew
bd90: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
bda0: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b  xpr(pParse, ops[
bdb0: 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  i], .           
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
bde0: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
bdf0: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
be20: 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
be30: 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29  i].pExpr, 0), 0)
be40: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
be50: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
be60: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
be70: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
be80: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
be90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
bea0: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
beb0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
bec0: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
bed0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
bee0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
bef0: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
bf00: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
bf10: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  idxTerm;.    }. 
bf20: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
bf30: 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 2;.  }.#endif
bf40: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
bf50: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
bf60: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65  TION */..#if !de
bf70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bf80: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
bf90: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
bfa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
bfb0: 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  ERY).  /* Analyz
bfc0: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73  e a term that is
bfd0: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f   composed of two
bfe0: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
bff0: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  s connected by. 
c000: 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   ** an OR operat
c010: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  or..  */.  else 
c020: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
c030: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65  K_OR ){.    asse
c040: 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  rt( pWC->op==TK_
c050: 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41  AND );.    exprA
c060: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72  nalyzeOrTerm(pSr
c070: 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29  c, pWC, idxTerm)
c080: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
c090: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c0a0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
c0b0: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
c0c0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
c0d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c0e0: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
c0f0: 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e  ION.  /* Add con
c100: 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75  straints to redu
c110: 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
c120: 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72  ace on a LIKE or
c130: 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61   GLOB.  ** opera
c140: 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  tor..  **.  ** A
c150: 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66   like pattern of
c160: 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b   the form "x LIK
c170: 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61  E 'abc%'" is cha
c180: 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72  nged into constr
c190: 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  aints.  **.  ** 
c1a0: 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63           x>='abc
c1b0: 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e  ' AND x<'abd' AN
c1c0: 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a  D x LIKE 'abc%'.
c1d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61    **.  ** The la
c1e0: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
c1f0: 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22  the prefix "abc"
c200: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
c210: 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a  to form the.  **
c220: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
c230: 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20  dition "abd"..  
c240: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70  */.  if( pWC->op
c250: 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20  ==TK_AND .   && 
c260: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61  isLikeOrGlob(pPa
c270: 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74  rse, pExpr, &pSt
c280: 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c  r1, &isComplete,
c290: 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20   &noCase).  ){. 
c2a0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20     Expr *pLeft; 
c2b0: 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20        /* LHS of 
c2c0: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
c2d0: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
c2e0: 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20  pStr2;       /* 
c2f0: 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20  Copy of pStr1 - 
c300: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
c310: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
c320: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
c330: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
c340: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
c350: 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20  dxNew1;.    int 
c360: 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 43 6f 6c  idxNew2;.    Col
c370: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
c380: 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
c390: 75 65 6e 63 65 20 74 6f 20 75 73 65 20 2a 2f 0a  uence to use */.
c3a0: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
c3b0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
c3c0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
c3d0: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
c3e0: 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30  Dup(db, pStr1, 0
c3f0: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
c400: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
c410: 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b        u8 c, *pC;
c420: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63         /* Last c
c430: 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20  haracter before 
c440: 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  the first wildca
c450: 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d  rd */.      pC =
c460: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e   (u8*)&pStr2->u.
c470: 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74  zToken[sqlite3St
c480: 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e  rlen30(pStr2->u.
c490: 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20  zToken)-1];.    
c4a0: 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20    c = *pC;.     
c4b0: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
c4c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
c4d0: 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d  int is to increm
c4e0: 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61  ent the last cha
c4f0: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
c500: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
c510: 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75  ** wildcard.  Bu
c520: 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e  t if we incremen
c530: 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c  t '@', that will
c540: 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68   push it into th
c550: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70  e.        ** alp
c560: 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68  habetic range wh
c570: 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73  ere case convers
c580: 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75  ions will mess u
c590: 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  p the .        *
c5a0: 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54  * inequality.  T
c5b0: 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61  o avoid this, ma
c5c0: 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20  ke sure to also 
c5d0: 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20  run the full.   
c5e0: 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20       ** LIKE on 
c5f0: 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78  all candidate ex
c600: 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65  pressions by cle
c610: 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70  aring the isComp
c620: 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20  lete flag.      
c630: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
c640: 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f   c=='A'-1 ) isCo
c650: 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 2f 2a  mplete = 0;   /*
c660: 20 45 56 3a 20 52 2d 36 34 33 33 39 2d 30 38 32   EV: R-64339-082
c670: 30 37 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20  07 */...        
c680: 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72  c = sqlite3Upper
c690: 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20  ToLower[c];.    
c6a0: 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20    }.      *pC = 
c6b0: 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c + 1;.    }.   
c6c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c6d0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
c6e0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 6e 6f 43  SQLITE_UTF8, noC
c6f0: 61 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a  ase ? "NOCASE" :
c700: 20 22 42 49 4e 41 52 59 22 2c 30 29 3b 0a 20 20   "BINARY",0);.  
c710: 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71    pNewExpr1 = sq
c720: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
c730: 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20  e, TK_GE, .     
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
c760: 6c 6c 28 73 71 6c 69 74 65 33 45 78 70 72 44 75  ll(sqlite3ExprDu
c770: 70 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70  p(db,pLeft,0), p
c780: 43 6f 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20  Coll),.         
c790: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72              pStr
c7a0: 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  1, 0);.    idxNe
c7b0: 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w1 = whereClause
c7c0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
c7d0: 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54  Expr1, TERM_VIRT
c7e0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
c7f0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c800: 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20   idxNew1==0 );. 
c810: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
c820: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
c830: 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  1);.    pNewExpr
c840: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
c850: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a  (pParse, TK_LT,.
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c880: 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33 45  SetColl(sqlite3E
c890: 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c  xprDup(db,pLeft,
c8a0: 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20 20  0), pColl),.    
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20   pStr2, 0);.    
c8d0: 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43  idxNew2 = whereC
c8e0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
c8f0: 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d   pNewExpr2, TERM
c900: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
c910: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
c920: 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30  case( idxNew2==0
c930: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
c940: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
c950: 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65  dxNew2);.    pTe
c960: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
c970: 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69  Term];.    if( i
c980: 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  sComplete ){.   
c990: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
c9a0: 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  1].iParent = idx
c9b0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d  Term;.      pWC-
c9c0: 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72  >a[idxNew2].iPar
c9d0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
c9e0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
c9f0: 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ld = 2;.    }.  
ca00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ca10: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
ca20: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
ca30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ca40: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
ca50: 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54   /* Add a WO_MAT
ca60: 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72  CH auxiliary ter
ca70: 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61  m to the constra
ca80: 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20  int set if the. 
ca90: 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72   ** current expr
caa0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
cab0: 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d   form:  column M
cac0: 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20  ATCH expr..  ** 
cad0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
cae0: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
caf0: 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
cb00: 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75  ds of.  ** virtu
cb10: 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20  al tables.  The 
cb20: 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74  native query opt
cb30: 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20  imizer does not 
cb40: 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20  attempt.  ** to 
cb50: 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68  do anything with
cb60: 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73   MATCH functions
cb70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d  ..  */.  if( isM
cb80: 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78  atchOfColumn(pEx
cb90: 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  pr) ){.    int i
cba0: 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20  dxNew;.    Expr 
cbb0: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
cbc0: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
cbd0: 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69  pNewTerm;.    Bi
cbe0: 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75  tmask prereqColu
cbf0: 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a  mn, prereqExpr;.
cc00: 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45  .    pRight = pE
cc10: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
cc20: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c  0].pExpr;.    pL
cc30: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
cc40: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
cc50: 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72  ;.    prereqExpr
cc60: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
cc70: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67  e(pMaskSet, pRig
cc80: 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43  ht);.    prereqC
cc90: 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c  olumn = exprTabl
cca0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
ccb0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
ccc0: 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70   (prereqExpr & p
ccd0: 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20  rereqColumn)==0 
cce0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
ccf0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70  NewExpr;.      p
cd00: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
cd10: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
cd20: 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20  K_MATCH, .      
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
cd50: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52  e3ExprDup(db, pR
cd60: 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20  ight, 0), 0);.  
cd70: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
cd80: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
cd90: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
cda0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
cdb0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
cdc0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
cdd0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
cde0: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
cdf0: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
ce00: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
ce10: 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70  ight = prereqExp
ce20: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  r;.      pNewTer
ce30: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
ce40: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
ce50: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
ce60: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
ce70: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
ce80: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
ce90: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54  perator = WO_MAT
cea0: 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  CH;.      pNewTe
ceb0: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
cec0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
ced0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
cee0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
cef0: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
cf00: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
cf10: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
cf20: 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
cf30: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
cf40: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
cf50: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
cf60: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cf70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
cf80: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
cf90: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
cfa0: 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f   /* When sqlite_
cfb0: 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
cfc0: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
cfd0: 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66  e an operator of
cfe0: 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22   the.  ** form "
cff0: 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63  x IS NOT NULL" c
d000: 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
d010: 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65  evaluated more e
d020: 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20  fficiently.  ** 
d030: 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78  as "x>NULL" if x
d040: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
d050: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ER PRIMARY KEY. 
d060: 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a   So construct a.
d070: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72    ** virtual ter
d080: 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a  m of that form..
d090: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
d0a0: 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  hat the virtual 
d0b0: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67  term must be tag
d0c0: 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e  ged with TERM_VN
d0d0: 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ULL.  This.  ** 
d0e0: 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77  TERM_VNULL tag w
d0f0: 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65  ill suppress the
d100: 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
d110: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
d120: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f  .  ** of the loo
d130: 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20  p.  Without the 
d140: 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c  TERM_VNULL flag,
d150: 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68   the not-null ch
d160: 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  eck at.  ** the 
d170: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f  start of the loo
d180: 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61  p will prevent a
d190: 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ny results from 
d1a0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
d1b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
d1c0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
d1d0: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
d1e0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
d1f0: 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
d200: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pLeft->iColumn>=
d210: 30 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20  0.  ){.    Expr 
d220: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45  *pNewExpr;.    E
d230: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
d240: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69  pr->pLeft;.    i
d250: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57  nt idxNew;.    W
d260: 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65  hereTerm *pNewTe
d270: 72 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70  rm;..    pNewExp
d280: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
d290: 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a  (pParse, TK_GT,.
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d2c0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
d2d0: 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Left, 0),.      
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 45 78        sqlite3PEx
d300: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55  pr(pParse, TK_NU
d310: 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29  LL, 0, 0, 0), 0)
d320: 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20  ;..    idxNew = 
d330: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
d340: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
d350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
d370: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
d380: 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e  _DYNAMIC|TERM_VN
d390: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64  ULL);.    if( id
d3a0: 78 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  xNew ){.      pN
d3b0: 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
d3c0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
d3d0: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
d3e0: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20  Right = 0;.     
d3f0: 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43   pNewTerm->leftC
d400: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
d410: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
d420: 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  wTerm->u.leftCol
d430: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
d440: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77  lumn;.      pNew
d450: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
d460: 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70  = WO_GT;.      p
d470: 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  NewTerm->iParent
d480: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
d490: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
d4a0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
d4b0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
d4c0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  = 1;.      pTerm
d4d0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
d4e0: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
d4f0: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
d500: 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65  All = pTerm->pre
d510: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  reqAll;.    }.  
d520: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d530: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a  TE_ENABLE_STAT *
d540: 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  /..  /* Prevent 
d550: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
d560: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66  of a LEFT JOIN f
d570: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74  rom being used t
d580: 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20  o drive.  ** an 
d590: 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73  index for tables
d5a0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
d5b0: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
d5c0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
d5d0: 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68  ght |= extraRigh
d5e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
d5f0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
d600: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
d610: 6e 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  n list passed as
d620: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
d630: 6d 65 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 20 65  ment.** for an e
d640: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 79 70  xpression of typ
d650: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74  e TK_COLUMN that
d660: 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 73   refers to the s
d670: 61 6d 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a  ame column and.*
d680: 2a 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20  * uses the same 
d690: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
d6a0: 63 65 20 61 73 20 74 68 65 20 69 43 6f 6c 27 74  ce as the iCol't
d6b0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  h column of inde
d6c0: 78 20 70 49 64 78 2e 0a 2a 2a 20 41 72 67 75 6d  x pIdx..** Argum
d6d0: 65 6e 74 20 69 42 61 73 65 20 69 73 20 74 68 65  ent iBase is the
d6e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 75   cursor number u
d6f0: 73 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sed for the tabl
d700: 65 20 74 68 61 74 20 70 49 64 78 20 72 65 66 65  e that pIdx refe
d710: 72 73 0a 2a 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  rs.** to..**.** 
d720: 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65  If such an expre
d730: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
d740: 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  its index in pLi
d750: 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72  st->a[] is retur
d760: 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78  ned. If.** no ex
d770: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
d780: 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
d790: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d7a0: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20   findIndexCol(. 
d7b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
d7e0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d7f0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
d800: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
d810: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61  sion list to sea
d820: 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  rch */.  int iBa
d830: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
d840: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
d850: 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73  or for table ass
d860: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
d870: 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
d880: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
d890: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
d8a0: 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  to match column 
d8b0: 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  of */.  int iCol
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
d8e0: 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61  n of index to ma
d8f0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
d900: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
d910: 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
d920: 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20  zColl[iCol];..  
d930: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
d940: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d950: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 4c 69     Expr *p = pLi
d960: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
d970: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
d980: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  K_COLUMN.     &&
d990: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64   p->iColumn==pId
d9a0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
d9b0: 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61  ].     && p->iTa
d9c0: 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29  ble==iBase.    )
d9d0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
d9e0: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
d9f0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
da00: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
da10: 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  ( ALWAYS(pColl) 
da20: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
da30: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
da40: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
da50: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
da60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
da70: 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
da80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
da90: 74 69 6e 65 20 64 65 74 65 72 6d 69 6e 65 73 20  tine determines 
daa0: 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75  if pIdx can be u
dab0: 73 65 64 20 74 6f 20 61 73 73 69 73 74 20 69 6e  sed to assist in
dac0: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
dad0: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
dae0: 69 65 72 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  ier. In other wo
daf0: 72 64 73 2c 20 69 74 20 74 65 73 74 73 20 77 68  rds, it tests wh
db00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 75 73 69  ether or not usi
db10: 6e 67 20 74 68 69 73 0a 2a 2a 20 69 6e 64 65 78  ng this.** index
db20: 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c   for the outer l
db30: 6f 6f 70 20 67 75 61 72 61 6e 74 65 65 73 20 74  oop guarantees t
db40: 68 61 74 20 72 6f 77 73 20 77 69 74 68 20 65 71  hat rows with eq
db50: 75 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  ual values for.*
db60: 2a 20 61 6c 6c 20 65 78 70 72 65 73 73 69 6f 6e  * all expression
db70: 73 20 69 6e 20 74 68 65 20 70 44 69 73 74 69 6e  s in the pDistin
db80: 63 74 20 6c 69 73 74 20 61 72 65 20 64 65 6c 69  ct list are deli
db90: 76 65 72 65 64 20 67 72 6f 75 70 65 64 20 74 6f  vered grouped to
dba0: 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f  gether..**.** Fo
dbb0: 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71  r example, the q
dbc0: 75 65 72 79 20 0a 2a 2a 0a 2a 2a 20 20 20 53 45  uery .**.**   SE
dbd0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 61 2c  LECT DISTINCT a,
dbe0: 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57   b, c FROM tbl W
dbf0: 48 45 52 45 20 61 20 3d 20 3f 0a 2a 2a 0a 2a 2a  HERE a = ?.**.**
dc00: 20 63 61 6e 20 62 65 6e 65 66 69 74 20 66 72 6f   can benefit fro
dc10: 6d 20 61 6e 79 20 69 6e 64 65 78 20 6f 6e 20 63  m any index on c
dc20: 6f 6c 75 6d 6e 73 20 22 62 22 20 61 6e 64 20 22  olumns "b" and "
dc30: 63 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  c"..*/.static in
dc40: 74 20 69 73 44 69 73 74 69 6e 63 74 49 6e 64 65  t isDistinctInde
dc50: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
dc60: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
dc70: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
dc80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
dc90: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcb0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
dcc0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
dcd0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
dce0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
dcf0: 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  ex being conside
dd00: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  red */.  int bas
dd10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
dd20: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
dd30: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
dd40: 65 20 74 61 62 6c 65 20 70 49 64 78 20 69 73 20  e table pIdx is 
dd50: 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
dd60: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 20 20   *pDistinct,    
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44          /* The D
dd80: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
dd90: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  ons */.  int nEq
dda0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
ddb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ddc0: 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75  er of index colu
ddd0: 6d 6e 73 20 77 69 74 68 20 3d 3d 20 2a 2f 0a 29  mns with == */.)
dde0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
ddf0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
de00: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75      /* Mask of u
de10: 6e 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20 70  naccounted for p
de20: 44 69 73 74 69 6e 63 74 20 65 78 70 72 73 20 2a  Distinct exprs *
de30: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
de60: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 61  variable */..  a
de70: 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74  ssert( pDistinct
de80: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 49 64  !=0 );.  if( pId
de90: 78 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70  x->zName==0 || p
dea0: 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3e  Distinct->nExpr>
deb0: 3d 42 4d 53 20 29 20 72 65 74 75 72 6e 20 30 3b  =BMS ) return 0;
dec0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 44 69  .  testcase( pDi
ded0: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3d 3d 42  stinct->nExpr==B
dee0: 4d 53 2d 31 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  MS-1 );..  /* Lo
def0: 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74  op through all t
df00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
df10: 6e 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 6c  n the distinct l
df20: 69 73 74 2e 20 49 66 20 61 6e 79 20 6f 66 20 74  ist. If any of t
df30: 68 65 6d 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74  hem.  ** are not
df40: 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20 72   simple column r
df50: 65 66 65 72 65 6e 63 65 73 2c 20 72 65 74 75 72  eferences, retur
df60: 6e 20 65 61 72 6c 79 2e 20 4f 74 68 65 72 77 69  n early. Otherwi
df70: 73 65 2c 20 74 65 73 74 20 69 66 20 74 68 65 0a  se, test if the.
df80: 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73    ** WHERE claus
df90: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f  e contains a "co
dfa0: 6c 3d 58 22 20 63 6c 61 75 73 65 2e 20 49 66 20  l=X" clause. If 
dfb0: 69 74 20 64 6f 65 73 2c 20 74 68 65 20 65 78 70  it does, the exp
dfc0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 63 61 6e  ression.  ** can
dfd0: 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 49 66 20   be ignored. If 
dfe0: 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 61 6e 64  it does not, and
dff0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 6f 65 73   the column does
e000: 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74   not belong to t
e010: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
e020: 6c 65 20 61 73 20 69 6e 64 65 78 20 70 49 64 78  le as index pIdx
e030: 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
e040: 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 72  Finally, if ther
e050: 65 20 69 73 20 6e 6f 0a 20 20 2a 2a 20 6d 61 74  e is no.  ** mat
e060: 63 68 69 6e 67 20 22 63 6f 6c 3d 58 22 20 65 78  ching "col=X" ex
e070: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65  pression and the
e080: 20 63 6f 6c 75 6d 6e 20 69 73 20 6f 6e 20 74 68   column is on th
e090: 65 20 73 61 6d 65 20 74 61 62 6c 65 20 61 73 20  e same table as 
e0a0: 70 49 64 78 2c 0a 20 20 2a 2a 20 73 65 74 20 74  pIdx,.  ** set t
e0b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
e0c0: 20 62 69 74 20 69 6e 20 76 61 72 69 61 62 6c 65   bit in variable
e0d0: 20 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 66 6f   mask..  */.  fo
e0e0: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
e0f0: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
e100: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
e110: 70 54 65 72 6d 3b 0a 20 20 20 20 45 78 70 72 20  pTerm;.    Expr 
e120: 2a 70 20 3d 20 70 44 69 73 74 69 6e 63 74 2d 3e  *p = pDistinct->
e130: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
e140: 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  if( p->op!=TK_CO
e150: 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
e160: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
e170: 64 54 65 72 6d 28 70 57 43 2c 20 70 2d 3e 69 54  dTerm(pWC, p->iT
e180: 61 62 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  able, p->iColumn
e190: 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57  , ~(Bitmask)0, W
e1a0: 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_EQ, 0);.    if
e1b0: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ( pTerm ){.     
e1c0: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
e1d0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
e1e0: 43 6f 6c 6c 53 65 71 20 2a 70 31 20 3d 20 73 71  CollSeq *p1 = sq
e1f0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
e200: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
e210: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d  , pX->pLeft, pX-
e220: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
e230: 43 6f 6c 6c 53 65 71 20 2a 70 32 20 3d 20 73 71  CollSeq *p2 = sq
e240: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
e250: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
e260: 20 20 20 69 66 28 20 70 31 3d 3d 70 32 20 29 20     if( p1==p2 ) 
e270: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
e280: 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c      if( p->iTabl
e290: 65 21 3d 62 61 73 65 20 29 20 72 65 74 75 72 6e  e!=base ) return
e2a0: 20 30 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   0;.    mask |= 
e2b0: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c  (((Bitmask)1) <<
e2c0: 20 69 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28   i);.  }..  for(
e2d0: 69 3d 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b 20 26  i=nEqCol; mask &
e2e0: 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  & i<pIdx->nColum
e2f0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
e300: 20 69 45 78 70 72 20 3d 20 66 69 6e 64 49 6e 64   iExpr = findInd
e310: 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44  exCol(pParse, pD
e320: 69 73 74 69 6e 63 74 2c 20 62 61 73 65 2c 20 70  istinct, base, p
e330: 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  Idx, i);.    if(
e340: 20 69 45 78 70 72 3c 30 20 29 20 62 72 65 61 6b   iExpr<0 ) break
e350: 3b 0a 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28  ;.    mask &= ~(
e360: 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20  ((Bitmask)1) << 
e370: 69 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  iExpr);.  }..  r
e380: 65 74 75 72 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b  eturn (mask==0);
e390: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
e3a0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  n true if the DI
e3b0: 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f  STINCT expressio
e3c0: 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  n-list passed as
e3d0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
e3e0: 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64  ent.** is redund
e3f0: 61 6e 74 2e 20 41 20 44 49 53 54 49 4e 43 54 20  ant. A DISTINCT 
e400: 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e  list is redundan
e410: 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  t if the databas
e420: 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  e contains a.** 
e430: 55 4e 49 51 55 45 20 69 6e 64 65 78 20 74 68 61  UNIQUE index tha
e440: 74 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  t guarantees tha
e450: 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
e460: 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62  the query will b
e470: 65 20 64 69 73 74 69 6e 63 74 0a 2a 2a 20 61 6e  e distinct.** an
e480: 79 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  yway..*/.static 
e490: 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65  int isDistinctRe
e4a0: 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65  dundant(.  Parse
e4b0: 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 72 63 4c   *pParse,.  SrcL
e4c0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 0a 20  ist *pTabList,. 
e4d0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
e4e0: 43 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  C,.  ExprList *p
e4f0: 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20 54 61  Distinct.){.  Ta
e500: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
e510: 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
e520: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e530: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69              .  i
e540: 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20  nt iBase;..  /* 
e550: 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65  If there is more
e560: 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20   than one table 
e570: 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e  or sub-select in
e580: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
e590: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75   of.  ** this qu
e5a0: 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  ery, then it wil
e5b0: 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
e5c0: 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74  e to show that t
e5d0: 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a  he DISTINCT .  *
e5e0: 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75  * clause is redu
e5f0: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ndant. */.  if( 
e600: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d  pTabList->nSrc!=
e610: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
e620: 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74  iBase = pTabList
e630: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[0].iCursor;.
e640: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
e650: 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20  t->a[0].pTab;.. 
e660: 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   /* If any of th
e670: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73  e expressions is
e680: 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f   an IPK column o
e690: 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74  n table iBase, t
e6a0: 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a  hen return .  **
e6b0: 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65   true. Note: The
e6c0: 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61   (p->iTable==iBa
e6d0: 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73  se) part of this
e6e0: 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c   test may be fal
e6f0: 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63  se if the.  ** c
e700: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73  urrent SELECT is
e710: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
e720: 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  b-query..  */.  
e730: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74  for(i=0; i<pDist
e740: 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  inct->nExpr; i++
e750: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
e760: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d   pDistinct->a[i]
e770: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
e780: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
e790: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
e7a0: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
e7b0: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
e7c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
e7d0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
e7e0: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
e7f0: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
e800: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
e810: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
e820: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
e830: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
e840: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
e850: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
e860: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
e870: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
e880: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
e890: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
e8a0: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
e8b0: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
e8c0: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
e8d0: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
e8e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e8f0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
e900: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
e910: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
e920: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
e930: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
e940: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
e950: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
e960: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
e970: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
e980: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
e990: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
e9a0: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
e9b0: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
e9c0: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
e9d0: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
e9e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e9f0: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
ea00: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
ea10: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
ea20: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
ea30: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
ea40: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
ea50: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ea60: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ea70: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
ea80: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
ea90: 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  E_None ) continu
eaa0: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
eab0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
eac0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
ead0: 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
eae0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
eaf0: 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d   if( 0==findTerm
eb00: 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f  (pWC, iBase, iCo
eb10: 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  l, ~(Bitmask)0, 
eb20: 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a  WO_EQ, pIdx) ){.
eb30: 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
eb40: 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43  Col = findIndexC
eb50: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
eb60: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
eb70: 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  x, i);.        i
eb80: 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20  f( iIdxCol<0 || 
eb90: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  pTab->aCol[pIdx-
eba0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f  >aiColumn[i]].no
ebb0: 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
ebc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ebd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ebe0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
ebf0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
ec00: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
ec10: 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61  ndex implies tha
ec20: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  t the DISTINCT q
ec30: 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64 75  ualifier is redu
ec40: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  ndant. */.      
ec50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ec60: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
ec70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
ec80: 65 20 61 20 63 72 75 64 65 20 65 73 74 69 6d 61  e a crude estima
ec90: 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69  te of the logari
eca0: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
ecb0: 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72   value..** The r
ecc0: 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20  esults need not 
ecd0: 62 65 20 65 78 61 63 74 2e 20 20 54 68 69 73 20  be exact.  This 
ece0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
ecf0: 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74   estimating.** t
ed00: 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66  he total cost of
ed10: 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72   performing oper
ed20: 61 74 69 6f 6e 73 20 77 69 74 68 20 4f 28 6c 6f  ations with O(lo
ed30: 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a  gN) or O(NlogN).
ed40: 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20  ** complexity.  
ed50: 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73  Because N is jus
ed60: 74 20 61 20 67 75 65 73 73 2c 20 69 74 20 69 73  t a guess, it is
ed70: 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65 64   no great traged
ed80: 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20  y if.** logN is 
ed90: 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f  a little off..*/
eda0: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65  .static double e
edb0: 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b  stLog(double N){
edc0: 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d  .  double logN =
edd0: 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d   1;.  double x =
ede0: 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e   10;.  while( N>
edf0: 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d  x ){.    logN +=
ee00: 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b   1;.    x *= 10;
ee10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f  .  }.  return lo
ee20: 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f  gN;.}../*.** Two
ee30: 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72   routines for pr
ee40: 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  inting the conte
ee50: 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33  nt of an sqlite3
ee60: 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73  _index_info.** s
ee70: 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20  tructure.  Used 
ee80: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
ee90: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20  debugging only. 
eea0: 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53   If neither.** S
eeb0: 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51  QLITE_TEST or SQ
eec0: 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64  LITE_DEBUG are d
eed0: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  efined, then the
eee0: 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61  se routines.** a
eef0: 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69  re no-ops..*/.#i
ef00: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ef10: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
ef20: 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
ef30: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
ef40: 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
ef50: 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74  IDX_INPUTS(sqlit
ef60: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
ef70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
ef80: 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
ef90: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
efa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
efb0: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
efc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
efd0: 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73  ugPrintf("  cons
efe0: 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d  traint[%d]: col=
eff0: 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d  %d termid=%d op=
f000: 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22  %d usabled=%d\n"
f010: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
f020: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
f030: 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  t[i].iColumn,.  
f040: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
f050: 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
f060: 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  et,.       p->aC
f070: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c  onstraint[i].op,
f080: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
f090: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
f0a0: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
f0b0: 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b  ; i<p->nOrderBy;
f0c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
f0d0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
f0e0: 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f   orderby[%d]: co
f0f0: 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c  l=%d desc=%d\n",
f100: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
f110: 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
f120: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
f130: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
f140: 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  desc);.  }.}.sta
f150: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
f160: 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74  DX_OUTPUTS(sqlit
f170: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
f180: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
f190: 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54  ( !sqlite3WhereT
f1a0: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
f1b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f1c0: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
f1d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
f1e0: 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67  ugPrintf("  usag
f1f0: 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25  e[%d]: argvIdx=%
f200: 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20  d omit=%d\n",.  
f210: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
f220: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
f230: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c  ge[i].argvIndex,
f240: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
f250: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
f260: 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mit);.  }.  sqli
f270: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f280: 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20    idxNum=%d\n", 
f290: 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71  p->idxNum);.  sq
f2a0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f2b0: 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22  ("  idxStr=%s\n"
f2c0: 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  , p->idxStr);.  
f2d0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f2e0: 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e  tf("  orderByCon
f2f0: 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e  sumed=%d\n", p->
f300: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
f310: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
f320: 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
f330: 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70  tedCost=%g\n", p
f340: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
f350: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
f360: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
f370: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
f380: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
f390: 41 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  A).#endif../* .*
f3a0: 2a 20 52 65 71 75 69 72 65 64 20 62 65 63 61 75  * Required becau
f3b0: 73 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 69  se bestIndex() i
f3c0: 73 20 63 61 6c 6c 65 64 20 62 79 20 62 65 73 74  s called by best
f3d0: 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 29 20  OrClauseIndex() 
f3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f3f0: 62 65 73 74 49 6e 64 65 78 28 57 68 65 72 65 42  bestIndex(WhereB
f400: 65 73 74 49 64 78 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  estIdx*);../*.**
f410: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
f420: 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 61  tempts to find a
f430: 6e 20 73 63 61 6e 6e 69 6e 67 20 73 74 72 61 74  n scanning strat
f440: 65 67 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  egy that can be 
f450: 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70 74 69  used .** to opti
f460: 6d 69 7a 65 20 61 6e 20 27 4f 52 27 20 65 78 70  mize an 'OR' exp
f470: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
f480: 70 61 72 74 20 6f 66 20 61 20 57 48 45 52 45 20  part of a WHERE 
f490: 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 54  clause. .**.** T
f4a0: 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  he table associa
f4b0: 74 65 64 20 77 69 74 68 20 46 52 4f 4d 20 63 6c  ted with FROM cl
f4c0: 61 75 73 65 20 74 65 72 6d 20 70 53 72 63 20 6d  ause term pSrc m
f4d0: 61 79 20 62 65 20 65 69 74 68 65 72 20 61 0a 2a  ay be either a.*
f4e0: 2a 20 72 65 67 75 6c 61 72 20 42 2d 54 72 65 65  * regular B-Tree
f4f0: 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74   table or a virt
f500: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
f510: 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 4f 72  atic void bestOr
f520: 43 6c 61 75 73 65 49 6e 64 65 78 28 57 68 65 72  ClauseIndex(Wher
f530: 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 23 69  eBestIdx *p){.#i
f540: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f550: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
f560: 4e 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  N.  WhereClause 
f570: 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20 20  *pWC = p->pWC;  
f580: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f590: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
f5a0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
f5b0: 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d  _item *pSrc = p-
f5c0: 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65 20 46 52  >pSrc; /* The FR
f5d0: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
f5e0: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f  o search */.  co
f5f0: 6e 73 74 20 69 6e 74 20 69 43 75 72 20 3d 20 70  nst int iCur = p
f600: 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20  Src->iCursor;   
f610: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
f620: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 20 2a   of the table  *
f630: 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d 61 73  /.  const Bitmas
f640: 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d  k maskSrc = getM
f650: 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
f660: 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20 42 69  t, iCur);  /* Bi
f670: 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63 20 2a  tmask for pSrc *
f680: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20  /.  WhereTerm * 
f690: 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d 20 26  const pWCEnd = &
f6a0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
f6b0: 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  m];        /* En
f6c0: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
f6d0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
f6e0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
f6f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
f700: 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
f710: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
f720: 0a 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61  .  /* The OR-cla
f730: 75 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  use optimization
f740: 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 69   is disallowed i
f750: 66 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  f the INDEXED BY
f760: 20 6f 72 0a 20 20 2a 2a 20 4e 4f 54 20 49 4e 44   or.  ** NOT IND
f770: 45 58 45 44 20 63 6c 61 75 73 65 73 20 61 72 65  EXED clauses are
f780: 20 75 73 65 64 20 6f 72 20 69 66 20 74 68 65 20   used or if the 
f790: 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 62  WHERE_AND_ONLY b
f7a0: 69 74 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20  it is set. */.  
f7b0: 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
f7c0: 65 78 65 64 20 7c 7c 20 70 53 72 63 2d 3e 70 49  exed || pSrc->pI
f7d0: 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 72  ndex!=0 ){.    r
f7e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
f7f0: 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73   pWC->wctrlFlags
f800: 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   & WHERE_AND_ONL
f810: 59 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  Y ){.    return;
f820: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
f830: 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
f840: 73 65 20 74 65 72 6d 73 20 66 6f 72 20 61 20 75  se terms for a u
f850: 73 61 62 6c 65 20 57 4f 5f 4f 52 20 74 65 72 6d  sable WO_OR term
f860: 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d  . */.  for(pTerm
f870: 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
f880: 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
f890: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
f8a0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52  eOperator==WO_OR
f8b0: 20 0a 20 20 20 20 20 26 26 20 28 28 70 54 65 72   .     && ((pTer
f8c0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e  m->prereqAll & ~
f8d0: 6d 61 73 6b 53 72 63 29 20 26 20 70 2d 3e 6e 6f  maskSrc) & p->no
f8e0: 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20  tReady)==0.     
f8f0: 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
f900: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
f910: 26 20 6d 61 73 6b 53 72 63 29 21 3d 30 20 0a 20  & maskSrc)!=0 . 
f920: 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
f930: 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
f940: 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
f950: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
f960: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
f970: 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
f980: 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
f990: 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
f9a0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
f9b0: 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  erm;.      int f
f9c0: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
f9d0: 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 64 6f 75  TI_OR;.      dou
f9e0: 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a  ble rTotal = 0;.
f9f0: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f        double nRo
fa00: 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74  w = 0;.      Bit
fa10: 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 20  mask used = 0;. 
fa20: 20 20 20 20 20 57 68 65 72 65 42 65 73 74 49 64       WhereBestId
fa30: 78 20 73 42 4f 49 3b 0a 0a 20 20 20 20 20 20 73  x sBOI;..      s
fa40: 42 4f 49 20 3d 20 2a 70 3b 0a 20 20 20 20 20 20  BOI = *p;.      
fa50: 73 42 4f 49 2e 70 4f 72 64 65 72 42 79 20 3d 20  sBOI.pOrderBy = 
fa60: 30 3b 0a 20 20 20 20 20 20 73 42 4f 49 2e 70 44  0;.      sBOI.pD
fa70: 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
fa80: 20 20 20 73 42 4f 49 2e 70 70 49 64 78 49 6e 66     sBOI.ppIdxInf
fa90: 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  o = 0;.      for
faa0: 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
fab0: 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43  a; pOrTerm<pOrWC
fac0: 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  End; pOrTerm++){
fad0: 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
fae0: 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d  ACE(("... Multi-
faf0: 69 6e 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67  index OR testing
fb00: 20 66 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20   for term %d of 
fb10: 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20  %d....\n", .    
fb20: 20 20 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d        (pOrTerm -
fb30: 20 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65   pOrWC->a), (pTe
fb40: 72 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20  rm - pWC->a).   
fb50: 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20       ));.       
fb60: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f   if( pOrTerm->eO
fb70: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20  perator==WO_AND 
fb80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 42 4f  ){.          sBO
fb90: 49 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d  I.pWC = &pOrTerm
fba0: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
fbb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
fbc0: 49 6e 64 65 78 28 26 73 42 4f 49 29 3b 0a 20 20  Index(&sBOI);.  
fbd0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
fbe0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
fbf0: 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20  sor==iCur ){.   
fc00: 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
fc10: 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  se tempWC;.     
fc20: 20 20 20 20 20 74 65 6d 70 57 43 2e 70 50 61 72       tempWC.pPar
fc30: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
fc40: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
fc50: 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  WC.pMaskSet = pW
fc60: 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20  C->pMaskSet;.   
fc70: 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f         tempWC.pO
fc80: 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
fc90: 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20        tempWC.op 
fca0: 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
fcb0: 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70      tempWC.a = p
fcc0: 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  OrTerm;.        
fcd0: 20 20 74 65 6d 70 57 43 2e 77 63 74 72 6c 46 6c    tempWC.wctrlFl
fce0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ags = 0;.       
fcf0: 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
fd00: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
fd10: 42 4f 49 2e 70 57 43 20 3d 20 26 74 65 6d 70 57  BOI.pWC = &tempW
fd20: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  C;.          bes
fd30: 74 49 6e 64 65 78 28 26 73 42 4f 49 29 3b 0a 20  tIndex(&sBOI);. 
fd40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
fd50: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
fd60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fd70: 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 42      rTotal += sB
fd80: 4f 49 2e 63 6f 73 74 2e 72 43 6f 73 74 3b 0a 20  OI.cost.rCost;. 
fd90: 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73         nRow += s
fda0: 42 4f 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52  BOI.cost.plan.nR
fdb0: 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73 65 64  ow;.        used
fdc0: 20 7c 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 75 73   |= sBOI.cost.us
fdd0: 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
fde0: 72 54 6f 74 61 6c 3e 3d 70 2d 3e 63 6f 73 74 2e  rTotal>=p->cost.
fdf0: 72 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20  rCost ) break;. 
fe00: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
fe10: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
fe20: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
fe30: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 63   increase the sc
fe40: 61 6e 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75  an cost to accou
fe50: 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  nt .      ** for
fe60: 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
fe70: 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20   sort. */.      
fe80: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  if( p->pOrderBy!
fe90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 48  =0 ){.        WH
fea0: 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73  ERETRACE(("... s
feb0: 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73  orting increases
fec0: 20 4f 52 20 63 6f 73 74 20 25 2e 39 67 20 74 6f   OR cost %.9g to
fed0: 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20   %.9g\n",.      
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 54                rT
fef0: 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f  otal, rTotal+nRo
ff00: 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 29 29  w*estLog(nRow)))
ff10: 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c  ;.        rTotal
ff20: 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28   += nRow*estLog(
ff30: 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  nRow);.      }..
ff40: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
ff50: 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67  cost of scanning
ff60: 20 75 73 69 6e 67 20 74 68 69 73 20 4f 52 20 74   using this OR t
ff70: 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61  erm for optimiza
ff80: 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  tion is.      **
ff90: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 63   less than the c
ffa0: 75 72 72 65 6e 74 20 63 6f 73 74 20 73 74 6f 72  urrent cost stor
ffb0: 65 64 20 69 6e 20 70 43 6f 73 74 2c 20 72 65 70  ed in pCost, rep
ffc0: 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
ffd0: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 43  s.      ** of pC
ffe0: 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48  ost. */.      WH
fff0: 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d  ERETRACE(("... m
10000 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f  ulti-index OR co
10010 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39  st=%.9g nrow=%.9
10020 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52  g\n", rTotal, nR
10030 6f 77 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ow));.      if( 
10040 72 54 6f 74 61 6c 3c 70 2d 3e 63 6f 73 74 2e 72  rTotal<p->cost.r
10050 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
10060 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20  p->cost.rCost = 
10070 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20  rTotal;.        
10080 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20 3d 20 75  p->cost.used = u
10090 73 65 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  sed;.        p->
100a0 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d  cost.plan.nRow =
100b0 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70   nRow;.        p
100c0 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53  ->cost.plan.nOBS
100d0 61 74 20 3d 20 70 2d 3e 69 20 3f 20 70 2d 3e 61  at = p->i ? p->a
100e0 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c  Level[p->i-1].pl
100f0 61 6e 2e 6e 4f 42 53 61 74 20 3a 20 30 3b 0a 20  an.nOBSat : 0;. 
10100 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70         p->cost.p
10110 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c  lan.wsFlags = fl
10120 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ags;.        p->
10130 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 54 65 72  cost.plan.u.pTer
10140 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
10150 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
10160 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10170 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
10180 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66  ON */.}..#ifndef
10190 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
101a0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
101b0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
101c0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
101d0 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73  se term pTerm is
101e0 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65   of a form where
101f0 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20   it.** could be 
10200 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
10210 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72  ex to access pSr
10220 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61  c, assuming an a
10230 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e  ppropriate.** in
10240 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a  dex existed..*/.
10250 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43  static int termC
10260 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20  anDriveIndex(.  
10270 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
10280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10290 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
102a0 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  erm to check */.
102b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
102c0 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
102d0 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65   /* Table we are
102e0 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73   trying to acces
102f0 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  s */.  Bitmask n
10300 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20  otReady         
10310 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
10320 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f  in outer loops o
10330 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b  f the join */.){
10340 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69  .  char aff;.  i
10350 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
10360 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72  rsor!=pSrc->iCur
10370 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  sor ) return 0;.
10380 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
10390 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20  erator!=WO_EQ ) 
103a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
103b0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
103c0 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
103d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
103e0 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
103f0 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
10400 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
10410 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
10420 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
10430 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
10440 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
10450 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
10460 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
10470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10480 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
10490 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
104a0 20 70 6c 61 6e 20 66 6f 72 20 70 53 72 63 20 73   plan for pSrc s
104b0 70 65 63 69 66 69 65 64 20 69 6e 20 70 43 6f 73  pecified in pCos
104c0 74 20 69 73 20 61 20 66 75 6c 6c 20 74 61 62 6c  t is a full tabl
104d0 65 20 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e  e scan.** and in
104e0 64 65 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73  dexing is allows
104f0 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f   (if there is no
10500 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
10510 75 73 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70  use) and it.** p
10520 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74  ossible to const
10530 72 75 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74  ruct a transient
10540 20 69 6e 64 65 78 20 74 68 61 74 20 77 6f 75 6c   index that woul
10550 64 20 70 65 72 66 6f 72 6d 20 62 65 74 74 65 72  d perform better
10560 0a 2a 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c 20  .** than a full 
10570 74 61 62 6c 65 20 73 63 61 6e 20 65 76 65 6e 20  table scan even 
10580 77 68 65 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  when the cost of
10590 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68   constructing th
105a0 65 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61  e index.** is ta
105b0 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  ken into account
105c0 2c 20 74 68 65 6e 20 61 6c 74 65 72 20 74 68 65  , then alter the
105d0 20 71 75 65 72 79 20 70 6c 61 6e 20 74 6f 20 75   query plan to u
105e0 73 65 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69  se the.** transi
105f0 65 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ent index..*/.st
10600 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 41 75  atic void bestAu
10610 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 57 68 65  tomaticIndex(Whe
10620 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20  reBestIdx *p){. 
10630 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
10640 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20   p->pParse;     
10650 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
10660 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10670 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
10680 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20 20 20  pWC = p->pWC;   
10690 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
106a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
106b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
106c0 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d  _item *pSrc = p-
106d0 3e 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  >pSrc;  /* The F
106e0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
106f0 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 64  to search */.  d
10700 6f 75 62 6c 65 20 6e 54 61 62 6c 65 52 6f 77 3b  ouble nTableRow;
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20       /* Rows in 
10730 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65 20  the input table 
10740 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e  */.  double logN
10750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
10770 67 28 6e 54 61 62 6c 65 52 6f 77 29 20 2a 2f 0a  g(nTableRow) */.
10780 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 54 65 6d    double costTem
10790 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIdx;         /*
107a0 20 70 65 72 2d 71 75 65 72 79 20 63 6f 73 74 20   per-query cost 
107b0 6f 66 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  of the transient
107c0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
107d0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
107e0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
107f0 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
10800 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
10810 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
10820 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
10830 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
10840 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
10850 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
10860 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 74 20 6d    /* Table tht m
10870 69 67 68 74 20 62 65 20 69 6e 64 65 78 65 64 20  ight be indexed 
10880 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  */..  if( pParse
10890 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3c 3d 28 64  ->nQueryLoop<=(d
108a0 6f 75 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 2f  ouble)1 ){.    /
108b0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  * There is no po
108c0 69 6e 74 20 69 6e 20 62 75 69 6c 64 69 6e 67 20  int in building 
108d0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
108e0 65 78 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ex for a single 
108f0 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75  scan */.    retu
10900 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  rn;.  }.  if( (p
10910 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
10920 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   & SQLITE_AutoIn
10930 64 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  dex)==0 ){.    /
10940 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69  * Automatic indi
10950 63 65 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  ces are disabled
10960 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 2a 2f 0a   at run-time */.
10970 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10980 20 20 69 66 28 20 28 70 2d 3e 63 6f 73 74 2e 70    if( (p->cost.p
10990 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
109a0 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
109b0 29 21 3d 30 0a 20 20 20 26 26 20 28 70 2d 3e 63  )!=0.   && (p->c
109c0 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
109d0 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f 53   & WHERE_COVER_S
109e0 43 41 4e 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  CAN)==0.  ){.   
109f0 20 2f 2a 20 57 65 20 61 6c 72 65 61 64 79 20 68   /* We already h
10a00 61 76 65 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66  ave some kind of
10a10 20 69 6e 64 65 78 20 69 6e 20 75 73 65 20 66 6f   index in use fo
10a20 72 20 74 68 69 73 20 71 75 65 72 79 2e 20 2a 2f  r this query. */
10a30 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10a40 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74  .  if( pSrc->not
10a50 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20 2f  Indexed ){.    /
10a60 2a 20 54 68 65 20 4e 4f 54 20 49 4e 44 45 58 45  * The NOT INDEXE
10a70 44 20 63 6c 61 75 73 65 20 61 70 70 65 61 72 73  D clause appears
10a80 20 69 6e 20 74 68 65 20 53 51 4c 2e 20 2a 2f 0a   in the SQL. */.
10a90 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10aa0 20 20 69 66 28 20 70 53 72 63 2d 3e 69 73 43 6f    if( pSrc->isCo
10ab0 72 72 65 6c 61 74 65 64 20 29 7b 0a 20 20 20 20  rrelated ){.    
10ac0 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20 69 73  /* The source is
10ad0 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
10ae0 62 2d 71 75 65 72 79 2e 20 4e 6f 20 70 6f 69 6e  b-query. No poin
10af0 74 20 69 6e 20 69 6e 64 65 78 69 6e 67 20 69 74  t in indexing it
10b00 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
10b10 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
10b20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
10b30 6f 70 20 3e 3d 20 28 64 6f 75 62 6c 65 29 31 20  op >= (double)1 
10b40 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53  );.  pTable = pS
10b50 72 63 2d 3e 70 54 61 62 3b 0a 20 20 6e 54 61 62  rc->pTab;.  nTab
10b60 6c 65 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d 3e  leRow = pTable->
10b70 6e 52 6f 77 45 73 74 3b 0a 20 20 6c 6f 67 4e 20  nRowEst;.  logN 
10b80 3d 20 65 73 74 4c 6f 67 28 6e 54 61 62 6c 65 52  = estLog(nTableR
10b90 6f 77 29 3b 0a 20 20 63 6f 73 74 54 65 6d 70 49  ow);.  costTempI
10ba0 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e 54 61  dx = 2*logN*(nTa
10bb0 62 6c 65 52 6f 77 2f 70 50 61 72 73 65 2d 3e 6e  bleRow/pParse->n
10bc0 51 75 65 72 79 4c 6f 6f 70 20 2b 20 31 29 3b 0a  QueryLoop + 1);.
10bd0 20 20 69 66 28 20 63 6f 73 74 54 65 6d 70 49 64    if( costTempId
10be0 78 3e 3d 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74  x>=p->cost.rCost
10bf0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63   ){.    /* The c
10c00 6f 73 74 20 6f 66 20 63 72 65 61 74 69 6e 67 20  ost of creating 
10c10 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
10c20 62 6c 65 20 77 6f 75 6c 64 20 62 65 20 67 72 65  ble would be gre
10c30 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a  ater than.    **
10c40 20 64 6f 69 6e 67 20 74 68 65 20 66 75 6c 6c 20   doing the full 
10c50 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20  table scan */.  
10c60 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
10c70 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
10c80 6e 79 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70  ny equality comp
10c90 61 72 69 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a 20  arison term */. 
10ca0 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
10cb0 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
10cc0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
10cd0 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
10ce0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
10cf0 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
10d00 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
10d10 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 29 20 29  , p->notReady) )
10d20 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  {.      WHERETRA
10d30 43 45 28 28 22 61 75 74 6f 2d 69 6e 64 65 78 20  CE(("auto-index 
10d40 72 65 64 75 63 65 73 20 63 6f 73 74 20 66 72 6f  reduces cost fro
10d50 6d 20 25 2e 31 66 20 74 6f 20 25 2e 31 66 5c 6e  m %.1f to %.1f\n
10d60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10d70 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72         p->cost.r
10d80 43 6f 73 74 2c 20 63 6f 73 74 54 65 6d 70 49 64  Cost, costTempId
10d90 78 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f  x));.      p->co
10da0 73 74 2e 72 43 6f 73 74 20 3d 20 63 6f 73 74 54  st.rCost = costT
10db0 65 6d 70 49 64 78 3b 0a 20 20 20 20 20 20 70 2d  empIdx;.      p-
10dc0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 20  >cost.plan.nRow 
10dd0 3d 20 6c 6f 67 4e 20 2b 20 31 3b 0a 20 20 20 20  = logN + 1;.    
10de0 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77    p->cost.plan.w
10df0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 54  sFlags = WHERE_T
10e00 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  EMP_INDEX;.     
10e10 20 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20 3d 20   p->cost.used = 
10e20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
10e30 68 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ht;.      break;
10e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
10e50 73 65 0a 23 20 64 65 66 69 6e 65 20 62 65 73 74  se.# define best
10e60 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 41  AutomaticIndex(A
10e70 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23  )  /* no-op */.#
10e80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10e90 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
10ea0 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  NDEX */...#ifnde
10eb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10ec0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
10ed0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
10ee0 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
10ef0 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
10f00 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  for an automatic
10f10 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f   index.** and to
10f20 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72   set up the Wher
10f30 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c  eLevel object pL
10f40 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65  evel so that the
10f50 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
10f60 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20  ** makes use of 
10f70 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
10f80 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
10f90 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74  oid constructAut
10fa0 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
10fb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10fd0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
10fe0 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
10ff0 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
11000 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
11010 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
11020 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
11030 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
11040 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
11050 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  to get the next 
11060 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
11070 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
11080 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
11090 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
110a0 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
110b0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
110c0 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20   *pLevel        
110d0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69    /* Write new i
110e0 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ndex here */.){.
110f0 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20    int nColumn;  
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11110 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
11120 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  ns in the constr
11130 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  ucted index */. 
11140 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
11150 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
11160 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
11170 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
11180 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
11190 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
111a0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
111b0 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ->a[] */.  int n
111c0 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
111d0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
111e0 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20  f memory needed 
111f0 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e  for pIdx */.  In
11200 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
11210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
11220 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 74  ect describing t
11230 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  he transient ind
11240 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20      /* Prepared 
11270 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
11280 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
11290 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20    int addrInit; 
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
112b0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
112c0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62  initialization b
112d0 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20  ypass jump */.  
112e0 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
112f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11300 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
11310 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79 49  ndexed */.  KeyI
11320 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20 20  nfo *pKeyinfo;  
11330 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69          /* Key i
11340 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
11350 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a 20  he index */   . 
11360 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11380 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  Top of the index
11390 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20   fill loop */.  
113a0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
113b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
113c0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
113d0 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  an index record 
113e0 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74   /* Column count
11410 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  er */.  int i;  
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11440 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42  ter */.  int mxB
11450 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  itCol;          
11460 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
11470 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e  column in pSrc->
11480 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c  colUsed */.  Col
11490 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
114a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
114b0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
114c0 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  o on a column */
114d0 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
114e0 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
114f0 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
11500 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
11510 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
11520 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
11530 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
11540 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
11550 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20  olumns */..  /* 
11560 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
11570 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63   skip over the c
11580 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74  reation and init
11590 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
115a0 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74  e.  ** transient
115b0 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e   index on 2nd an
115c0 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65  d subsequent ite
115d0 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  rations of the l
115e0 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50  oop. */.  v = pP
115f0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
11600 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
11610 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69   addrInit = sqli
11620 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
11630 73 65 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  se);..  /* Count
11640 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
11650 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c  olumns that will
11660 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
11670 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20   index.  ** and 
11680 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48  used to match WH
11690 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
116a0 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c  raints */.  nCol
116b0 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  umn = 0;.  pTabl
116c0 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
116d0 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d    pWCEnd = &pWC-
116e0 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  >a[pWC->nTerm];.
116f0 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
11700 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
11710 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
11720 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
11730 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
11740 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
11750 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
11760 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
11770 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
11780 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
11790 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
117a0 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b  =BMS ? ((Bitmask
117b0 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28  )1)<<(BMS-1) : (
117c0 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f  (Bitmask)1)<<iCo
117d0 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  l;.      testcas
117e0 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  e( iCol==BMS );.
117f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11800 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
11810 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
11820 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
11830 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
11840 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  ++;.        idxC
11850 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
11860 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11870 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
11880 6e 3e 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d  n>0 );.  pLevel-
11890 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43 6f 6c  >plan.nEq = nCol
118a0 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  umn;..  /* Count
118b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
118c0 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
118d0 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61  s needed to crea
118e0 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69  te a.  ** coveri
118f0 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f  ng index.  A "co
11900 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73  vering index" is
11910 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
11920 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a  ontains all.  **
11930 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
11940 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
11950 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63  query.  With a c
11960 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74  overing index, t
11970 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
11980 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65   table never nee
11990 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  ds to be accesse
119a0 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e  d.  Automatic in
119b0 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  dices must.  ** 
119c0 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  be a covering in
119d0 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20  dex because the 
119e0 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62  index will not b
119f0 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65  e updated if the
11a00 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
11a10 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64  able changes and
11a20 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
11a30 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68  able cannot both
11a40 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66   be used.  ** if
11a50 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20   they go out of 
11a60 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74  sync..  */.  ext
11a70 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63  raCols = pSrc->c
11a80 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f  olUsed & (~idxCo
11a90 6c 73 20 7c 20 28 28 28 42 69 74 6d 61 73 6b 29  ls | (((Bitmask)
11aa0 31 29 3c 3c 28 42 4d 53 2d 31 29 29 29 3b 0a 20  1)<<(BMS-1)));. 
11ab0 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70 54 61   mxBitCol = (pTa
11ac0 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53  ble->nCol >= BMS
11ad0 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54  -1) ? BMS-1 : pT
11ae0 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65  able->nCol;.  te
11af0 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
11b00 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
11b10 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
11b20 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29  e->nCol==BMS-2 )
11b30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  ;.  for(i=0; i<m
11b40 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
11b50 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
11b60 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   & (((Bitmask)1)
11b70 3c 3c 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b  <<i) ) nColumn++
11b80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
11b90 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42  ->colUsed & (((B
11ba0 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
11bb0 31 29 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 75  1)) ){.    nColu
11bc0 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43  mn += pTable->nC
11bd0 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20  ol - BMS + 1;.  
11be0 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  }.  pLevel->plan
11bf0 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
11c00 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
11c10 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
11c20 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  O_EQ;..  /* Cons
11c30 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
11c40 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69  object to descri
11c50 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  be this index */
11c60 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
11c70 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74  f(Index);.  nByt
11c80 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a  e += nColumn*siz
11c90 65 6f 66 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a  eof(int);     /*
11ca0 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
11cb0 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43  */.  nByte += nC
11cc0 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61  olumn*sizeof(cha
11cd0 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e  r*);   /* Index.
11ce0 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74  azColl */.  nByt
11cf0 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20  e += nColumn;   
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d10 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
11d20 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71  r */.  pIdx = sq
11d30 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
11d40 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42  o(pParse->db, nB
11d50 79 74 65 29 3b 0a 20 20 69 66 28 20 70 49 64 78  yte);.  if( pIdx
11d60 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11d70 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
11d80 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49  Idx = pIdx;.  pI
11d90 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68  dx->azColl = (ch
11da0 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20  ar**)&pIdx[1];. 
11db0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20   pIdx->aiColumn 
11dc0 3d 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61  = (int*)&pIdx->a
11dd0 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a  zColl[nColumn];.
11de0 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64    pIdx->aSortOrd
11df0 65 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d  er = (u8*)&pIdx-
11e00 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
11e10 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d  n];.  pIdx->zNam
11e20 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22  e = "auto-index"
11e30 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ;.  pIdx->nColum
11e40 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70  n = nColumn;.  p
11e50 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  Idx->pTable = pT
11e60 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  able;.  n = 0;. 
11e70 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
11e80 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
11e90 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
11ea0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
11eb0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
11ec0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
11ed0 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
11ee0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
11ef0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
11f00 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
11f10 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
11f20 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29  BMS ? ((Bitmask)
11f30 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28  1)<<(BMS-1) : ((
11f40 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c  Bitmask)1)<<iCol
11f50 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  ;.      if( (idx
11f60 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
11f70 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
11f80 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
11f90 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78  xpr;.        idx
11fa0 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
11fb0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
11fc0 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d  olumn[n] = pTerm
11fd0 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
11fe0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
11ff0 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
12000 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
12010 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
12020 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
12030 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
12040 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f  [n] = ALWAYS(pCo
12050 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  ll) ? pColl->zNa
12060 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  me : "BINARY";. 
12070 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
12080 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
12090 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d  assert( (u32)n==
120a0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
120b0 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64   );..  /* Add ad
120c0 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
120d0 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20   needed to make 
120e0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
120f0 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20  dex into.  ** a 
12100 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a  covering index *
12110 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  /.  for(i=0; i<m
12120 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  xBitCol; i++){. 
12130 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73     if( extraCols
12140 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   & (((Bitmask)1)
12150 3c 3c 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49  <<i) ){.      pI
12160 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
12170 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
12180 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
12190 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
121a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
121b0 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
121c0 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  & (((Bitmask)1)<
121d0 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20  <(BMS-1)) ){.   
121e0 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c   for(i=BMS-1; i<
121f0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
12200 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e  +){.      pIdx->
12210 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
12220 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
12230 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59  oll[n] = "BINARY
12240 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ";.      n++;.  
12250 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
12260 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  ( n==nColumn );.
12270 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
12280 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
12290 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20 3d   */.  pKeyinfo =
122a0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
122b0 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
122c0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  x);.  assert( pL
122d0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
122e0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
122f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
12300 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
12310 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43  vel->iIdxCur, nC
12320 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20  olumn+1, 0,.    
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 28 63 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c  (char*)pKeyinfo,
12350 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
12360 4f 46 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  OFF);.  VdbeComm
12370 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22  ent((v, "for %s"
12380 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
12390 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68  );..  /* Fill th
123a0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
123b0 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a  x with content *
123c0 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
123d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
123e0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c  v, OP_Rewind, pL
123f0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a  evel->iTabCur);.
12400 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
12410 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
12420 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
12430 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
12440 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c  ey(pParse, pIdx,
12450 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
12460 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b  , regRecord, 1);
12470 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12480 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
12490 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  sert, pLevel->iI
124a0 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  dxCur, regRecord
124b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
124c0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
124d0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
124e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
124f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
12500 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  t, pLevel->iTabC
12510 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a  ur, addrTop+1);.
12520 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12530 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
12540 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
12550 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
12560 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12570 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
12580 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
12590 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
125a0 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  ord);.  .  /* Ju
125b0 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
125c0 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
125d0 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
125e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
125f0 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
12600 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12610 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
12620 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
12630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12640 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
12650 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
12660 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
12670 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
12680 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
12690 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
126a0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
126b0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
126c0 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
126d0 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
126e0 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
126f0 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
12700 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
12710 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
12720 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
12730 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
12740 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
12750 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29  WhereBestIdx *p)
12760 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
12770 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 0a  e = p->pParse; .
12780 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
12790 57 43 20 3d 20 70 2d 3e 70 57 43 3b 0a 20 20 73  WC = p->pWC;.  s
127a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
127b0 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  em *pSrc = p->pS
127c0 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
127d0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
127e0 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 69 2c  rderBy;.  int i,
127f0 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
12800 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
12810 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
12820 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
12830 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
12840 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
12850 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
12860 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
12870 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
12880 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
12890 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
128a0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
128b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
128c0 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
128d0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
128e0 52 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65  Recomputing inde
128f0 78 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e  x info for %s...
12900 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
12910 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
12920 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
12930 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45   of possible WHE
12940 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
12950 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a  aints referring.
12960 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72    ** to this vir
12970 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
12980 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70  for(i=nTerm=0, p
12990 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
129a0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
129b0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
129c0 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
129d0 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
129e0 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
129f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
12a00 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
12a10 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12a20 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74  -1))==0 );.    t
12a30 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
12a40 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
12a50 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
12a60 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
12a70 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
12a80 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
12a90 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
12aa0 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  IN|WO_ISNULL) ) 
12ab0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
12ac0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
12ad0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
12ae0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
12af0 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
12b00 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
12b10 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
12b20 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
12b30 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
12b40 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
12b50 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
12b60 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
12b70 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
12b80 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
12b90 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
12ba0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
12bb0 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
12bc0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
12bd0 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
12be0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
12bf0 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
12c00 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
12c10 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
12c20 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
12c30 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
12c40 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
12c50 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
12c60 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
12c70 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
12c80 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
12c90 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
12ca0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
12cb0 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
12cc0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
12cd0 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
12ce0 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
12cf0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
12d00 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
12d10 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d30 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
12d40 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
12d50 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
12d60 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
12d80 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
12d90 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
12da0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
12db0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12dc0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12dd0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
12de0 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62  ");.    /* (doub
12df0 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
12e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
12e10 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
12e20 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12e30 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
12e40 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
12e50 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
12e60 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
12e70 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
12e80 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
12e90 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
12ea0 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
12eb0 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
12ec0 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
12ed0 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
12ee0 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
12ef0 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
12f00 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
12f10 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
12f20 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
12f30 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
12f40 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
12f50 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
12f60 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
12f70 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
12f80 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
12f90 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
12fa0 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
12fb0 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
12fc0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
12fd0 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
12fe0 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
12ff0 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
13000 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
13010 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
13020 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
13030 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
13040 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
13050 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13060 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
13070 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
13080 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
13090 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
130a0 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
130b0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
130c0 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
130d0 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
130e0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
130f0 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
13100 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
13110 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
13170 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
13180 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
13190 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
131a0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
131b0 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
131c0 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
131d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
131e0 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  rt( (pTerm->eOpe
131f0 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f  rator&(pTerm->eO
13200 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29  perator-1))==0 )
13210 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
13220 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13230 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  ==WO_IN );.    t
13240 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
13250 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
13260 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  NULL );.    if( 
13270 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13280 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e   & (WO_IN|WO_ISN
13290 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
132a0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
132b0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
132c0 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
132d0 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
132e0 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
132f0 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
13300 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
13310 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
13320 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
13330 2e 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d  .op = (u8)pTerm-
13340 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20  >eOperator;.    
13350 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73  /* The direct as
13360 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20  signment in the 
13370 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73  previous line is
13380 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62   possible only b
13390 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  ecause.    ** th
133a0 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45  e WO_ and SQLITE
133b0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
133c0 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65  T_ codes are ide
133d0 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20  ntical.  The.   
133e0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73   ** following as
133f0 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69  serts verify thi
13400 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61  s fact. */.    a
13410 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51  ssert( WO_EQ==SQ
13420 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
13430 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20  RAINT_EQ );.    
13440 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53  assert( WO_LT==S
13450 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
13460 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20  TRAINT_LT );.   
13470 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d   assert( WO_LE==
13480 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
13490 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20  STRAINT_LE );.  
134a0 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d    assert( WO_GT=
134b0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
134c0 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20  NSTRAINT_GT );. 
134d0 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45     assert( WO_GE
134e0 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
134f0 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a  ONSTRAINT_GE );.
13500 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d      assert( WO_M
13510 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ATCH==SQLITE_IND
13520 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41  EX_CONSTRAINT_MA
13530 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72  TCH );.    asser
13540 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
13550 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
13560 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
13570 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
13580 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
13590 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
135a0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
135b0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
135c0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
135d0 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
135e0 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
135f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
13600 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
13610 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
13620 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
13630 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
13640 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
13650 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
13660 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
13670 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
13680 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
13690 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
136a0 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
136b0 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
136c0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
136d0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
136e0 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
136f0 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
13700 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
13710 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
13720 69 6e 66 6f 20 70 6f 69 6e 74 65 72 20 70 61 73  info pointer pas
13730 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 61 72  sed.** as the ar
13740 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
13750 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13760 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
13770 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
13780 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
13790 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  a.** non-zero va
137a0 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
137b0 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
137c0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
137d0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74  e output.** part
137e0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
137f0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
13800 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70  ture is left pop
13810 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  ulated..**.** Wh
13820 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
13830 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
13840 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  d, it is the res
13850 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
13860 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
13870 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
13880 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e  p->idxStr if p->
13890 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
138a0 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68   indicates.** th
138b0 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69  at this is requi
138c0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
138d0 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  nt vtabBestIndex
138e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
138f0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c  Table *pTab, sql
13900 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13910 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p){.  sqlite3_v
13920 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c  tab *pVtab = sql
13930 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
13940 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d  arse->db, pTab)-
13950 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b  >pVtab;.  int i;
13960 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 57 48  .  int rc;..  WH
13970 45 52 45 54 52 41 43 45 28 28 22 78 42 65 73 74  ERETRACE(("xBest
13980 49 6e 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c  Index for %s\n",
13990 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pTab->zName));.
139a0 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55    TRACE_IDX_INPU
139b0 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56  TS(p);.  rc = pV
139c0 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42  tab->pModule->xB
139d0 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20  estIndex(pVtab, 
139e0 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  p);.  TRACE_IDX_
139f0 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69  OUTPUTS(p);..  i
13a00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13a10 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
13a20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
13a30 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
13a40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
13a50 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
13a60 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ( !pVtab->zErrMs
13a70 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
13a80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13a90 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  e, "%s", sqlite3
13aa0 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20  ErrStr(rc));.   
13ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
13ac0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13ad0 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61  arse, "%s", pVta
13ae0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
13af0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
13b00 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
13b10 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e  rMsg);.  pVtab->
13b20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20  zErrMsg = 0;..  
13b30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
13b40 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
13b50 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f  .    if( !p->aCo
13b60 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
13b70 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72  le && p->aConstr
13b80 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
13b90 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20  vIndex>0 ){.    
13ba0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13bb0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
13bc0 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20       "table %s: 
13bd0 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72  xBestIndex retur
13be0 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70  ned an invalid p
13bf0 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lan", pTab->zNam
13c00 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
13c10 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
13c20 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nErr;.}.../*.** 
13c30 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73 74  Compute the best
13c40 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72   index for a vir
13c50 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
13c60 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78  * The best index
13c70 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20   is computed by 
13c80 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
13c90 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
13ca0 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f  tual.** table mo
13cb0 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  dule.  This rout
13cc0 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  ine is really ju
13cd0 73 74 20 61 20 77 72 61 70 70 65 72 20 74 68 61  st a wrapper tha
13ce0 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65  t sets up.** the
13cf0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
13d00 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
13d10 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
13d20 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a  mmunicate with.*
13d30 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a  * xBestIndex..**
13d40 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74  .** In a join, t
13d50 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
13d60 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74  t be called mult
13d70 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74  iple times for t
13d80 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75  he.** same virtu
13d90 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73  al table.  The s
13da0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13db0 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  o structure is c
13dc0 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e  reated.** and in
13dd0 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65  itialized on the
13de0 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f   first invocatio
13df0 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20  n and reused on 
13e00 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
13e10 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20  * invocations.  
13e20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
13e30 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
13e40 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
13e50 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65  en.** code is ge
13e60 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63 65 73  nerated to acces
13e70 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  s the virtual ta
13e80 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65 49  ble.  The whereI
13e90 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20  nfoDelete() .** 
13ea0 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61  routine takes ca
13eb0 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68  re of freeing th
13ec0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
13ed0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 61  info structure a
13ee0 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64  fter.** everybod
13ef0 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 77  y has finished w
13f00 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ith it..*/.stati
13f10 63 20 76 6f 69 64 20 62 65 73 74 56 69 72 74 75  c void bestVirtu
13f20 61 6c 49 6e 64 65 78 28 57 68 65 72 65 42 65 73  alIndex(WhereBes
13f30 74 49 64 78 20 2a 70 29 7b 0a 20 20 50 61 72 73  tIdx *p){.  Pars
13f40 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
13f50 50 61 72 73 65 3b 20 20 20 20 20 20 2f 2a 20 54  Parse;      /* T
13f60 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
13f70 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
13f80 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57  use *pWC = p->pW
13f90 43 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  C;      /* The W
13fa0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
13fb0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
13fc0 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d 3e  item *pSrc = p->
13fd0 70 53 72 63 3b 20 2f 2a 20 54 68 65 20 46 52 4f  pSrc; /* The FRO
13fe0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
13ff0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62   search */.  Tab
14000 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d  le *pTab = pSrc-
14010 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >pTab;.  sqlite3
14020 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
14030 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  xInfo;.  struct 
14040 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
14050 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
14060 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
14070 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
14080 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
14090 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
140a0 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
140b0 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  , j;.  int nOrde
140c0 72 42 79 3b 0a 20 20 64 6f 75 62 6c 65 20 72 43  rBy;.  double rC
140d0 6f 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ost;..  /* Make 
140e0 73 75 72 65 20 77 73 46 6c 61 67 73 20 69 73 20  sure wsFlags is 
140f0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 73  initialized to s
14100 6f 6d 65 20 73 61 6e 65 20 76 61 6c 75 65 2e 20  ome sane value. 
14110 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
14120 65 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69  e .  ** malloc i
14130 6e 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  n allocateIndexI
14140 6e 66 6f 28 29 20 66 61 69 6c 73 20 61 6e 64 20  nfo() fails and 
14150 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
14160 74 75 72 6e 73 20 6c 65 61 76 69 6e 67 0a 20 20  turns leaving.  
14170 2a 2a 20 77 73 46 6c 61 67 73 20 69 6e 20 61 6e  ** wsFlags in an
14180 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
14190 74 61 74 65 2c 20 74 68 65 20 63 61 6c 6c 65 72  tate, the caller
141a0 20 6d 61 79 20 62 65 68 61 76 65 20 75 6e 70 72   may behave unpr
141b0 65 64 69 63 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a  edictably..  */.
141c0 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 63 6f 73    memset(&p->cos
141d0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  t, 0, sizeof(p->
141e0 63 6f 73 74 29 29 3b 0a 20 20 70 2d 3e 63 6f 73  cost));.  p->cos
141f0 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  t.plan.wsFlags =
14200 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
14210 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  BLE;..  /* If th
14220 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
14230 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68  info structure h
14240 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76  as not been prev
14250 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  iously.  ** allo
14260 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61  cated and initia
14270 6c 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c 6c 6f  lized, then allo
14280 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
14290 69 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ize it now..  */
142a0 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70  .  pIdxInfo = *p
142b0 2d 3e 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69  ->ppIdxInfo;.  i
142c0 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
142d0 7b 0a 20 20 20 20 2a 70 2d 3e 70 70 49 64 78 49  {.    *p->ppIdxI
142e0 6e 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 20 3d  nfo = pIdxInfo =
142f0 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
14300 66 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  fo(p);.  }.  if(
14310 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
14320 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
14330 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
14340 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  int, the sqlite3
14350 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
14360 63 74 75 72 65 20 74 68 61 74 20 70 49 64 78 49  cture that pIdxI
14370 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20  nfo points.  ** 
14380 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  to will have bee
14390 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65  n initialized, e
143a0 69 74 68 65 72 20 64 75 72 69 6e 67 20 74 68 65  ither during the
143b0 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74   current invocat
143c0 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69  ion or.  ** duri
143d0 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e  ng some prior in
143e0 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77  vocation.  Now w
143f0 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63  e just have to c
14400 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a  ustomize the.  *
14410 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64  * details of pId
14420 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75  xInfo for the cu
14430 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  rrent invocation
14440 20 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a   and pass it to.
14450 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e    ** xBestIndex.
14460 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  .  */..  /* The 
14470 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74  module name must
14480 20 62 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73   be defined. Als
14490 6f 2c 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74  o, by this point
144a0 20 74 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a   there must.  **
144b0 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
144c0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
144d0 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65   structure. Othe
144e0 72 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74  rwise.  ** sqlit
144f0 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
14500 61 6d 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76  ames() would hav
14510 65 20 70 69 63 6b 65 64 20 75 70 20 74 68 65 20  e picked up the 
14520 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61  error. .  */.  a
14530 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d  ssert( pTab->azM
14540 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54 61 62  oduleArg && pTab
14550 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d  ->azModuleArg[0]
14560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
14570 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70  lite3GetVTable(p
14580 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29  Parse->db, pTab)
14590 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
145a0 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e  e aConstraint[].
145b0 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e  usable fields an
145c0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c  d initialize all
145d0 20 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61   .  ** output va
145e0 72 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e  riables to zero.
145f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73  .  **.  ** aCons
14600 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20  traint[].usable 
14610 69 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73  is true for cons
14620 74 72 61 69 6e 74 73 20 77 68 65 72 65 20 74 68  traints where th
14630 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a  e right-hand.  *
14640 2a 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20  * side contains 
14650 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20  only references 
14660 74 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  to tables to the
14670 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75 72   left of the cur
14680 72 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e  rent.  ** table.
14690 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
146a0 2c 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61  , if the constra
146b0 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  int is of the fo
146c0 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
146d0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d          column =
146e0 20 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20   expr.  **.  ** 
146f0 61 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c 75  and we are evalu
14700 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68  ating a join, th
14710 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
14720 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a  t on column is .
14730 20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20    ** only valid 
14740 69 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65  if all tables re
14750 66 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72  ferenced in expr
14760 20 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65   occur to the le
14770 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  ft.  ** of the t
14780 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
14790 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  column..  **.  *
147a0 2a 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  * The aConstrain
147b0 74 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ts[] array conta
147c0 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
147d0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
147e0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72    ** on the curr
147f0 65 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74  ent table.  That
14800 20 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76   way we only hav
14810 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20  e to compute it 
14820 6f 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74  once.  ** even t
14830 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74  hough we might t
14840 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62  ry to pick the b
14850 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70  est index multip
14860 6c 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46  le times..  ** F
14870 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70 74 20  or each attempt 
14880 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e  at picking an in
14890 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f  dex, the order o
148a0 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a  f tables in the.
148b0 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20    ** join might 
148c0 62 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20  be different so 
148d0 77 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d  we have to recom
148e0 70 75 74 65 20 74 68 65 20 75 73 61 62 6c 65 20  pute the usable 
148f0 66 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74  flag.  ** each t
14900 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ime..  */.  pIdx
14910 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
14920 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
14930 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
14940 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
14950 74 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  t;.  pUsage = pI
14960 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
14970 69 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28  intUsage;.  for(
14980 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
14990 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
149a0 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
149b0 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
149c0 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
149d0 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
149e0 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43  >a[j];.    pIdxC
149f0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
14a00 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
14a10 74 26 70 2d 3e 6e 6f 74 52 65 61 64 79 29 20 3f  t&p->notReady) ?
14a20 20 30 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 6d 65   0 : 1;.  }.  me
14a30 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
14a40 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
14a50 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )*pIdxInfo->nCon
14a60 73 74 72 61 69 6e 74 29 3b 0a 20 20 69 66 28 20  straint);.  if( 
14a70 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
14a80 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20  FreeIdxStr ){.  
14a90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14aa0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
14ab0 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f  ;.  }.  pIdxInfo
14ac0 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
14ad0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
14ae0 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
14af0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
14b00 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  tr = 0;.  pIdxIn
14b10 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
14b20 6d 65 64 20 3d 20 30 3b 0a 20 20 2f 2a 20 28 28  med = 0;.  /* ((
14b30 64 6f 75 62 6c 65 29 32 29 20 49 6e 20 63 61 73  double)2) In cas
14b40 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
14b50 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e  _FLOATING_POINT.
14b60 2e 2e 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .. */.  pIdxInfo
14b70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
14b80 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
14b90 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29 3b 0a   / ((double)2);.
14ba0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64    nOrderBy = pId
14bb0 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b  xInfo->nOrderBy;
14bc0 0a 20 20 69 66 28 20 21 70 2d 3e 70 4f 72 64 65  .  if( !p->pOrde
14bd0 72 42 79 20 29 7b 0a 20 20 20 20 70 49 64 78 49  rBy ){.    pIdxI
14be0 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
14bf0 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 74  0;.  }..  if( vt
14c00 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72  abBestIndex(pPar
14c10 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e  se, pTab, pIdxIn
14c20 66 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  fo) ){.    retur
14c30 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 64 78 43 6f  n;.  }..  pIdxCo
14c40 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
14c50 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14c60 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
14c70 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
14c80 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
14c90 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
14ca0 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
14cb0 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67  f( pUsage[i].arg
14cc0 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20  vIndex>0 ){.    
14cd0 20 20 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20 7c    p->cost.used |
14ce0 3d 20 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e  = pWC->a[pIdxCon
14cf0 73 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[i].iTermOffset
14d00 5d 2e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ].prereqRight;. 
14d10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
14d20 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
14d30 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 61  DER BY clause, a
14d40 6e 64 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  nd the selected 
14d50 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
14d60 64 65 78 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  dex.  ** does no
14d70 74 20 73 61 74 69 73 66 79 20 69 74 2c 20 69 6e  t satisfy it, in
14d80 63 72 65 61 73 65 20 74 68 65 20 63 6f 73 74 20  crease the cost 
14d90 6f 66 20 74 68 65 20 73 63 61 6e 20 61 63 63 6f  of the scan acco
14da0 72 64 69 6e 67 6c 79 2e 20 54 68 69 73 0a 20 20  rdingly. This.  
14db0 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 70  ** matches the p
14dc0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 6e 6f  rocessing for no
14dd0 6e 2d 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n-virtual tables
14de0 20 69 6e 20 62 65 73 74 42 74 72 65 65 49 6e 64   in bestBtreeInd
14df0 65 78 28 29 2e 0a 20 20 2a 2f 0a 20 20 72 43 6f  ex()..  */.  rCo
14e00 73 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 65  st = pIdxInfo->e
14e10 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a 20 20  stimatedCost;.  
14e20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
14e30 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  && pIdxInfo->ord
14e40 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 3d 30 20  erByConsumed==0 
14e50 29 7b 0a 20 20 20 20 72 43 6f 73 74 20 2b 3d 20  ){.    rCost += 
14e60 65 73 74 4c 6f 67 28 72 43 6f 73 74 29 2a 72 43  estLog(rCost)*rC
14e70 6f 73 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ost;.  }..  /* T
14e80 68 65 20 63 6f 73 74 20 69 73 20 6e 6f 74 20 61  he cost is not a
14e90 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 61 72  llowed to be lar
14ea0 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ger than SQLITE_
14eb0 42 49 47 5f 44 42 4c 20 28 74 68 65 0a 20 20 2a  BIG_DBL (the.  *
14ec0 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f  * inital value o
14ed0 66 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20  f lowestCost in 
14ee0 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74  this loop. If it
14ef0 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
14f00 2a 2a 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43  ** (cost<lowestC
14f10 6f 73 74 29 20 74 65 73 74 20 62 65 6c 6f 77 20  ost) test below 
14f20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72  will never be tr
14f30 75 65 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 55  ue..  ** .  ** U
14f40 73 65 20 22 28 64 6f 75 62 6c 65 29 32 22 20 69  se "(double)2" i
14f50 6e 73 74 65 61 64 20 6f 66 20 22 32 2e 30 22 20  nstead of "2.0" 
14f60 69 6e 20 63 61 73 65 20 4f 4d 49 54 5f 46 4c 4f  in case OMIT_FLO
14f70 41 54 49 4e 47 5f 50 4f 49 4e 54 20 0a 20 20 2a  ATING_POINT .  *
14f80 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20  * is defined..  
14f90 2a 2f 0a 20 20 69 66 28 20 28 53 51 4c 49 54 45  */.  if( (SQLITE
14fa0 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c  _BIG_DBL/((doubl
14fb0 65 29 32 29 29 3c 72 43 6f 73 74 20 29 7b 0a 20  e)2))<rCost ){. 
14fc0 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74     p->cost.rCost
14fd0 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44   = (SQLITE_BIG_D
14fe0 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3b  BL/((double)2));
14ff0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
15000 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 72 43  >cost.rCost = rC
15010 6f 73 74 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f  ost;.  }.  p->co
15020 73 74 2e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49  st.plan.u.pVtabI
15030 64 78 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 20  dx = pIdxInfo;. 
15040 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6f   if( pIdxInfo->o
15050 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 29  rderByConsumed )
15060 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c  {.    p->cost.pl
15070 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
15080 45 52 45 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  ERE_ORDERED;.   
15090 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f   p->cost.plan.nO
150a0 42 53 61 74 20 3d 20 6e 4f 72 64 65 72 42 79 3b  BSat = nOrderBy;
150b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
150c0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61  >cost.plan.nOBSa
150d0 74 20 3d 20 70 2d 3e 69 20 3f 20 70 2d 3e 61 4c  t = p->i ? p->aL
150e0 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61  evel[p->i-1].pla
150f0 6e 2e 6e 4f 42 53 61 74 20 3a 20 30 3b 0a 20 20  n.nOBSat : 0;.  
15100 7d 0a 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e  }.  p->cost.plan
15110 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70 49 64 78  .nEq = 0;.  pIdx
15120 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
15130 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   nOrderBy;..  /*
15140 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 6d   Try to find a m
15150 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 61 63  ore efficient ac
15160 63 65 73 73 20 70 61 74 74 65 72 6e 20 62 79 20  cess pattern by 
15170 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69  using multiple i
15180 6e 64 65 78 65 73 0a 20 20 2a 2a 20 74 6f 20 6f  ndexes.  ** to o
15190 70 74 69 6d 69 7a 65 20 61 6e 20 4f 52 20 65 78  ptimize an OR ex
151a0 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20  pression within 
151b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
151c0 2e 20 0a 20 20 2a 2f 0a 20 20 62 65 73 74 4f 72  . .  */.  bestOr
151d0 43 6c 61 75 73 65 49 6e 64 65 78 28 70 29 3b 0a  ClauseIndex(p);.
151e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
151f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
15200 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
15210 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
15220 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT3./*.** Estima
15230 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
15240 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
15250 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
15260 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
15270 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
15280 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
15290 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
152a0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
152b0 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
152c0 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
152d0 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74  pVal.**    aStat
152e0 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
152f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
15300 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a  al to pVal.**.**
15310 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
15320 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  K on success..*/
15330 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
15340 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72  eKeyStats(.  Par
15350 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15360 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
15370 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
15380 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
15390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
153a0 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e   /* Index to con
153b0 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20  sider domain of 
153c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
153d0 75 65 20 2a 70 56 61 6c 2c 20 20 20 20 20 20 20  ue *pVal,       
153e0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e   /* Value to con
153f0 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  sider */.  int r
15400 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20  oundUp,         
15410 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20         /* Round 
15420 75 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75  up if true.  Rou
15430 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65  nd down if false
15440 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61   */.  tRowcnt *a
15450 53 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20  Stat            
15460 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20    /* OUT: stats 
15470 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
15480 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a  ){.  tRowcnt n;.
15490 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61    IndexSample *a
154a0 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 2c  Sample;.  int i,
154b0 20 65 54 79 70 65 3b 0a 20 20 69 6e 74 20 69 73   eType;.  int is
154c0 45 71 20 3d 20 30 3b 0a 20 20 69 36 34 20 76 3b  Eq = 0;.  i64 v;
154d0 0a 20 20 64 6f 75 62 6c 65 20 72 2c 20 72 53 3b  .  double r, rS;
154e0 0a 0a 20 20 61 73 73 65 72 74 28 20 72 6f 75 6e  ..  assert( roun
154f0 64 55 70 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55  dUp==0 || roundU
15500 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  p==1 );.  assert
15510 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e  ( pIdx->nSample>
15520 30 20 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d  0 );.  if( pVal=
15530 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
15540 54 45 5f 45 52 52 4f 52 3b 0a 20 20 6e 20 3d 20  TE_ERROR;.  n = 
15550 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30  pIdx->aiRowEst[0
15560 5d 3b 0a 20 20 61 53 61 6d 70 6c 65 20 3d 20 70  ];.  aSample = p
15570 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20  Idx->aSample;.  
15580 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  eType = sqlite3_
15590 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29  value_type(pVal)
155a0 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
155b0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
155c0 7b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  {.    v = sqlite
155d0 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 56  3_value_int64(pV
155e0 61 6c 29 3b 0a 20 20 20 20 72 20 3d 20 28 69 36  al);.    r = (i6
155f0 34 29 76 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  4)v;.    for(i=0
15600 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ; i<pIdx->nSampl
15610 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
15620 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
15630 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
15640 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
15650 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
15660 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f  ].eType>=SQLITE_
15670 54 45 58 54 20 29 20 62 72 65 61 6b 3b 0a 20 20  TEXT ) break;.  
15680 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
15690 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  i].eType==SQLITE
156a0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
156b0 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
156c0 69 5d 2e 75 2e 69 3e 3d 76 20 29 7b 0a 20 20 20  i].u.i>=v ){.   
156d0 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 61 53         isEq = aS
156e0 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b  ample[i].u.i==v;
156f0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
15700 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15720 20 61 73 73 65 72 74 28 20 61 53 61 6d 70 6c 65   assert( aSample
15730 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
15740 45 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20  E_FLOAT );.     
15750 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
15760 5d 2e 75 2e 72 3e 3d 72 20 29 7b 0a 20 20 20 20  ].u.r>=r ){.    
15770 20 20 20 20 20 20 69 73 45 71 20 3d 20 61 53 61        isEq = aSa
15780 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a  mple[i].u.r==r;.
15790 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
157a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
157b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
157c0 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
157d0 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
157e0 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
157f0 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a  e_double(pVal);.
15800 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15810 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  Idx->nSample; i+
15820 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
15830 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
15840 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f  SQLITE_NULL ) co
15850 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
15860 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
15870 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe>=SQLITE_TEXT 
15880 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
15890 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
158a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
158b0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72 53 20  T ){.        rS 
158c0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72  = aSample[i].u.r
158d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
158e0 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d         rS = aSam
158f0 70 6c 65 5b 69 5d 2e 75 2e 69 3b 0a 20 20 20 20  ple[i].u.i;.    
15900 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 53    }.      if( rS
15910 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=r ){.        i
15920 73 45 71 20 3d 20 72 53 3d 3d 72 3b 0a 20 20 20  sEq = rS==r;.   
15930 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15940 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
15950 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c  e if( eType==SQL
15960 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
15970 69 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 61  i = 0;.    if( a
15980 53 61 6d 70 6c 65 5b 30 5d 2e 65 54 79 70 65 3d  Sample[0].eType=
15990 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69  =SQLITE_NULL ) i
159a0 73 45 71 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  sEq = 1;.  }else
159b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 54  {.    assert( eT
159c0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
159d0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
159e0 45 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 66 6f  E_BLOB );.    fo
159f0 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
15a00 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
15a10 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
15a20 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  i].eType==SQLITE
15a30 5f 54 45 58 54 20 7c 7c 20 61 53 61 6d 70 6c 65  _TEXT || aSample
15a40 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
15a50 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20  E_BLOB ){.      
15a60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
15a70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
15a80 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  <pIdx->nSample )
15a90 7b 20 20 20 20 20 20 0a 20 20 20 20 20 20 73 71  {      .      sq
15aa0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
15ab0 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f  se->db;.      Co
15ac0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
15ad0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b      const u8 *z;
15ae0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
15af0 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b  ==SQLITE_BLOB ){
15b00 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f  .        z = (co
15b10 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33  nst u8 *)sqlite3
15b20 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c  _value_blob(pVal
15b30 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  );.        pColl
15b40 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
15b50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15b60 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51  ( pColl->enc==SQ
15b70 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20  LITE_UTF8 );.   
15b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15b90 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
15ba0 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
15bb0 73 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  se, SQLITE_UTF8,
15bc0 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c   0, *pIdx->azCol
15bd0 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
15be0 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pColl==0 ){.    
15bf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15c00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
15c10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d     }.        z =
15c20 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c   (const u8 *)sql
15c30 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
15c40 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  al, pColl->enc);
15c50 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 20  .        if( !z 
15c60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
15c70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15c80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15c90 20 20 20 20 61 73 73 65 72 74 28 20 7a 20 26 26      assert( z &&
15ca0 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
15cb0 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d  >xCmp );.      }
15cc0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
15cd0 65 33 56 61 6c 75 65 42 79 74 65 73 28 70 56 61  e3ValueBytes(pVa
15ce0 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  l, pColl->enc);.
15cf0 20 20 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69    .      for(; i
15d00 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
15d10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
15d20 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t c;.        int
15d30 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d 20 61   eSampletype = a
15d40 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b  Sample[i].eType;
15d50 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 53 61  .        if( eSa
15d60 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20 29  mpletype<eType )
15d70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
15d80 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79     if( eSamplety
15d90 70 65 21 3d 65 54 79 70 65 20 29 20 62 72 65 61  pe!=eType ) brea
15da0 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  k;.#ifndef SQLIT
15db0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
15dc0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e       if( pColl->
15dd0 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc!=SQLITE_UTF8
15de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
15df0 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20  t nSample;.     
15e00 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d 70       char *zSamp
15e10 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  le = sqlite3Utf8
15e20 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20 20  to16(.          
15e30 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65      db, pColl->e
15e40 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  nc, aSample[i].u
15e50 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  .z, aSample[i].n
15e60 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20  Byte, &nSample. 
15e70 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
15e80 20 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d 70        if( !zSamp
15e90 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
15ea0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
15eb0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
15ec0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15ed0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15ee0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15ef0 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e       c = pColl->
15f00 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
15f10 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d  r, nSample, zSam
15f20 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20  ple, n, z);.    
15f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
15f40 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29  ree(db, zSample)
15f50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
15f60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
15f70 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70  .          c = p
15f80 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
15f90 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70 6c 65  ->pUser, aSample
15fa0 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70  [i].nByte, aSamp
15fb0 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29  le[i].u.z, n, z)
15fc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15fd0 20 20 20 20 69 66 28 20 63 3e 3d 30 20 29 7b 0a      if( c>=0 ){.
15fe0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
15ff0 3d 30 20 29 20 69 73 45 71 20 3d 20 31 3b 0a 20  =0 ) isEq = 1;. 
16000 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
16010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16020 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
16030 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
16040 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74   aSample[i] is t
16050 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
16060 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
16070 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75  than.  ** or equ
16080 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20  al to pVal.  Or 
16090 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  if i==pIdx->nSam
160a0 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61  ple, then all sa
160b0 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20  mples are less. 
160c0 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20   ** than pVal.  
160d0 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70  If aSample[i]==p
160e0 56 61 6c 2c 20 74 68 65 6e 20 69 73 45 71 3d 3d  Val, then isEq==
160f0 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  1..  */.  if( is
16100 45 71 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Eq ){.    assert
16110 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
16120 65 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30  e );.    aStat[0
16130 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  ] = aSample[i].n
16140 4c 74 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  Lt;.    aStat[1]
16150 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45   = aSample[i].nE
16160 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  q;.  }else{.    
16170 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20  tRowcnt iLower, 
16180 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20  iUpper, iGap;.  
16190 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
161a0 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a      iLower = 0;.
161b0 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
161c0 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20  Sample[0].nLt;. 
161d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
161e0 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78  iUpper = i>=pIdx
161f0 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 20 3a 20  ->nSample ? n : 
16200 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a  aSample[i].nLt;.
16210 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
16220 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20  Sample[i-1].nEq 
16230 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  + aSample[i-1].n
16240 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  Lt;.    }.    aS
16250 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61  tat[1] = pIdx->a
16260 76 67 45 71 3b 0a 20 20 20 20 69 66 28 20 69 4c  vgEq;.    if( iL
16270 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a  ower>=iUpper ){.
16280 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a        iGap = 0;.
16290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
162a0 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d   iGap = iUpper -
162b0 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20   iLower;.    }. 
162c0 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29     if( roundUp )
162d0 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28  {.      iGap = (
162e0 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d  iGap*2)/3;.    }
162f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
16300 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d   = iGap/3;.    }
16310 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
16320 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20  iLower + iGap;. 
16330 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16340 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
16350 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
16360 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT3 */../*.**
16370 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   If expression p
16380 45 78 70 72 20 72 65 70 72 65 73 65 6e 74 73 20  Expr represents 
16390 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c  a literal value,
163a0 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
163b0 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74  t to.** an sqlit
163c0 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
163d0 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
163e0 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69  e same value, wi
163f0 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61  th affinity.** a
16400 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74  ff applied to it
16410 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  , before returni
16420 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ng. It is the re
16430 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
16440 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74  the .** caller t
16450 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
16460 65 61 73 65 20 74 68 69 73 20 73 74 72 75 63 74  ease this struct
16470 75 72 65 20 62 79 20 70 61 73 73 69 6e 67 20 69  ure by passing i
16480 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  t to .** sqlite3
16490 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a  ValueFree()..**.
164a0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
164b0 74 20 70 61 72 73 65 20 69 73 20 61 20 72 65 63  t parse is a rec
164c0 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52  ompile (sqlite3R
164d0 65 70 72 65 70 61 72 65 28 29 29 20 61 6e 64 20  eprepare()) and 
164e0 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53  pExpr.** is an S
164f0 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  QL variable that
16500 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
16510 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
16520 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20  bound to it,.** 
16530 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
16540 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
16550 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  e containing thi
16560 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77  s value, again w
16570 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  ith.** affinity 
16580 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69  aff applied to i
16590 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  t, instead..**.*
165a0 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20  * If neither of 
165b0 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c  the above apply,
165c0 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c   set *pp to NULL
165d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
165e0 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
165f0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
16600 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
16610 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65  ITE_OK..*/.#ifde
16620 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
16630 53 54 41 54 33 0a 73 74 61 74 69 63 20 69 6e 74  STAT3.static int
16640 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a   valueFromExpr(.
16650 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
16660 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
16670 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73   .  u8 aff, .  s
16680 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
16690 70 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  p.){.  if( pExpr
166a0 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
166b0 45 0a 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e  E.   || (pExpr->
166c0 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
166d0 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54  && pExpr->op2==T
166e0 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20 20 29 7b  K_VARIABLE).  ){
166f0 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20 3d 20  .    int iVar = 
16700 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
16710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
16720 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
16730 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a  ->pVdbe, iVar);.
16740 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65      *pp = sqlite
16750 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 70 50  3VdbeGetValue(pP
16760 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
16770 2c 20 69 56 61 72 2c 20 61 66 66 29 3b 0a 20 20  , iVar, aff);.  
16780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16790 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
167a0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f   sqlite3ValueFro
167b0 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  mExpr(pParse->db
167c0 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f  , pExpr, SQLITE_
167d0 55 54 46 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a  UTF8, aff, pp);.
167e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
167f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
16800 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74   used to estimat
16810 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
16820 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
16830 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  e visited.** by 
16840 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65  scanning an inde
16850 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66  x for a range of
16860 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e   values. The ran
16870 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75  ge may have an u
16880 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61  pper.** bound, a
16890 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72   lower bound, or
168a0 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45   both. The WHERE
168b0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
168c0 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72  at set the upper
168d0 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  .** and lower bo
168e0 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65  unds are represe
168f0 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61  nted by pLower a
16900 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63  nd pUpper respec
16910 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65  tively. For.** e
16920 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
16930 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73   that index p is
16940 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a   on t1(a):.**.**
16950 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
16960 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
16970 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20   < ? ....**     
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16990 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c  _____|   |_____|
169a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
169b0 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
169c0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
169e0 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a  wer    pUpper.**
169f0 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66  .** If either of
16a00 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f   the upper or lo
16a10 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74  wer bound is not
16a20 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e   present, then N
16a30 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e  ULL is passed in
16a40 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65  .** place of the
16a50 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
16a60 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
16a70 54 68 65 20 6e 45 71 20 70 61 72 61 6d 65 74 65  The nEq paramete
16a80 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20  r is passed the 
16a90 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69 6e 64  index of the ind
16aa0 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63  ex column subjec
16ab0 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67  t to the.** rang
16ac0 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72  e constraint. Or
16ad0 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20  , equivalently, 
16ae0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 71  the number of eq
16af0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16b00 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20  ts.** optimized 
16b10 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20  by the proposed 
16b20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20  index scan. For 
16b30 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
16b40 67 20 69 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20  g index p is.** 
16b50 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64  on t1(a, b), and
16b60 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69   the SQL query i
16b70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
16b80 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
16b90 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44   ? AND b > ? AND
16ba0 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   b < ? ....**.**
16bb0 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64   then nEq should
16bc0 20 62 65 20 70 61 73 73 65 64 20 74 68 65 20 76   be passed the v
16bd0 61 6c 75 65 20 31 20 28 61 73 20 74 68 65 20 72  alue 1 (as the r
16be0 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
16bf0 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73  column,.** b, is
16c00 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74   the second left
16c10 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
16c20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20  the index). Or, 
16c30 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
16c40 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
16c50 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
16c60 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
16c70 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68  *.** then nEq sh
16c80 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 30  ould be passed 0
16c90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
16ca0 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 61 6e  rned value is an
16cb0 20 69 6e 74 65 67 65 72 20 64 69 76 69 73 6f 72   integer divisor
16cc0 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 65   to reduce the e
16cd0 73 74 69 6d 61 74 65 64 0a 2a 2a 20 73 65 61 72  stimated.** sear
16ce0 63 68 20 73 70 61 63 65 2e 20 20 41 20 72 65 74  ch space.  A ret
16cf0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31 20 6d  urn value of 1 m
16d00 65 61 6e 73 20 74 68 61 74 20 72 61 6e 67 65 20  eans that range 
16d10 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a  constraints are.
16d20 2a 2a 20 6e 6f 20 68 65 6c 70 20 61 74 20 61 6c  ** no help at al
16d30 6c 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c  l.  A return val
16d40 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 72 61  ue of 2 means ra
16d50 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
16d60 61 72 65 0a 2a 2a 20 65 78 70 65 63 74 65 64 20  are.** expected 
16d70 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65  to reduce the se
16d80 61 72 63 68 20 73 70 61 63 65 20 62 79 20 68 61  arch space by ha
16d90 6c 66 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  lf.  And so fort
16da0 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  h....**.** In th
16db0 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c  e absence of sql
16dc0 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a  ite_stat3 ANALYZ
16dd0 45 20 64 61 74 61 2c 20 65 61 63 68 20 72 61 6e  E data, each ran
16de0 67 65 20 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a  ge inequality.**
16df0 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
16e00 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
16e10 61 63 74 6f 72 20 6f 66 20 34 2e 20 20 48 65 6e  actor of 4.  Hen
16e20 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73  ce a single cons
16e30 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20  traint (x>?).** 
16e40 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72 65 74  results in a ret
16e50 75 72 6e 20 6f 66 20 34 20 61 6e 64 20 61 20 72  urn of 4 and a r
16e60 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
16e70 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
16e80 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65  sults.** in a re
16e90 74 75 72 6e 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73  turn of 16..*/.s
16ea0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
16eb0 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50  angeScanEst(.  P
16ec0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
16ed0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
16ee0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
16ef0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
16f00 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
16f10 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
16f20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
16f30 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f  ange-compared co
16f40 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69  lumn; "x" */.  i
16f50 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20  nt nEq,         
16f60 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74      /* index int
16f70 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74  o p->aCol[] of t
16f80 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65  he range-compare
16f90 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68  d column */.  Wh
16fa0 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
16fb0 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
16fc0 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
16fd0 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
16fe0 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
16ff0 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
17000 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
17010 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
17020 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
17030 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
17040 64 6f 75 62 6c 65 20 2a 70 52 61 6e 67 65 44 69  double *pRangeDi
17050 76 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 64 75  v   /* OUT: Redu
17060 63 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  ce search space 
17070 62 79 20 74 68 69 73 20 64 69 76 69 73 6f 72 20  by this divisor 
17080 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
17090 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
170a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
170b0 45 5f 53 54 41 54 33 0a 0a 20 20 69 66 28 20 6e  E_STAT3..  if( n
170c0 45 71 3d 3d 30 20 26 26 20 70 2d 3e 6e 53 61 6d  Eq==0 && p->nSam
170d0 70 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ple ){.    sqlit
170e0 65 33 5f 76 61 6c 75 65 20 2a 70 52 61 6e 67 65  e3_value *pRange
170f0 56 61 6c 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74  Val;.    tRowcnt
17100 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
17110 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 20   tRowcnt iUpper 
17120 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  = p->aiRowEst[0]
17130 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b  ;.    tRowcnt a[
17140 32 5d 3b 0a 20 20 20 20 75 38 20 61 66 66 20 3d  2];.    u8 aff =
17150 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c   p->pTable->aCol
17160 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d  [p->aiColumn[0]]
17170 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20  .affinity;..    
17180 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
17190 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
171a0 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  = pLower->pExpr-
171b0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72  >pRight;.      r
171c0 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  c = valueFromExp
171d0 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
171e0 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c   aff, &pRangeVal
171f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17200 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74   pLower->eOperat
17210 6f 72 3d 3d 57 4f 5f 47 54 20 7c 7c 20 70 4c 6f  or==WO_GT || pLo
17220 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  wer->eOperator==
17230 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69  WO_GE );.      i
17240 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17250 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65  .       && where
17260 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
17270 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 30   p, pRangeVal, 0
17280 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  , a)==SQLITE_OK.
17290 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
172a0 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a   iLower = a[0];.
172b0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77          if( pLow
172c0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  er->eOperator==W
172d0 4f 5f 47 54 20 29 20 69 4c 6f 77 65 72 20 2b 3d  O_GT ) iLower +=
172e0 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   a[1];.      }. 
172f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
17300 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29  eFree(pRangeVal)
17310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17320 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17330 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20   pUpper ){.     
17340 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
17350 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
17360 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  ight;.      rc =
17370 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70   valueFromExpr(p
17380 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66  Parse, pExpr, af
17390 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a  f, &pRangeVal);.
173a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55        assert( pU
173b0 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  pper->eOperator=
173c0 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55 70 70 65 72  =WO_LT || pUpper
173d0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
173e0 4c 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LE );.      if( 
173f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
17400 20 20 20 20 20 26 26 20 77 68 65 72 65 4b 65 79       && whereKey
17410 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
17420 20 70 52 61 6e 67 65 56 61 6c 2c 20 31 2c 20 61   pRangeVal, 1, a
17430 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
17440 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 55     ){.        iU
17450 70 70 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  pper = a[0];.   
17460 20 20 20 20 20 69 66 28 20 70 55 70 70 65 72 2d       if( pUpper-
17470 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
17480 45 20 29 20 69 55 70 70 65 72 20 2b 3d 20 61 5b  E ) iUpper += a[
17490 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1];.      }.    
174a0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
174b0 65 65 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20  ee(pRangeVal);. 
174c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
174d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
174e0 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3c 3d      if( iUpper<=
174f0 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
17500 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28    *pRangeDiv = (
17510 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45  double)p->aiRowE
17520 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  st[0];.      }el
17530 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 61  se{.        *pRa
17540 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65  ngeDiv = (double
17550 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f  )p->aiRowEst[0]/
17560 28 64 6f 75 62 6c 65 29 28 69 55 70 70 65 72 20  (double)(iUpper 
17570 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20  - iLower);.     
17580 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54 52   }.      WHERETR
17590 41 43 45 28 28 22 72 61 6e 67 65 20 73 63 61 6e  ACE(("range scan
175a0 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75   regions: %u..%u
175b0 20 20 64 69 76 3d 25 67 5c 6e 22 2c 0a 20 20 20    div=%g\n",.   
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
175d0 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32  u32)iLower, (u32
175e0 29 69 55 70 70 65 72 2c 20 2a 70 52 61 6e 67 65  )iUpper, *pRange
175f0 44 69 76 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Div));.      ret
17600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17610 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
17620 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
17630 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
17640 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
17650 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
17660 45 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69  ETER(nEq);.#endi
17670 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77  f.  assert( pLow
17680 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a  er || pUpper );.
17690 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28    *pRangeDiv = (
176a0 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69 66 28 20  double)1;.  if( 
176b0 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65  pLower && (pLowe
176c0 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  r->wtFlags & TER
176d0 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70  M_VNULL)==0 ) *p
176e0 52 61 6e 67 65 44 69 76 20 2a 3d 20 28 64 6f 75  RangeDiv *= (dou
176f0 62 6c 65 29 34 3b 0a 20 20 69 66 28 20 70 55 70  ble)4;.  if( pUp
17700 70 65 72 20 29 20 2a 70 52 61 6e 67 65 44 69 76  per ) *pRangeDiv
17710 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b 0a 20   *= (double)4;. 
17720 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
17730 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17740 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20  BLE_STAT3./*.** 
17750 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
17760 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
17770 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
17780 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
17790 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
177a0 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64  aint x=VALUE and
177b0 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55   where that VALU
177c0 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74  E occurs in.** t
177d0 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  he histogram dat
177e0 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  a.  This only wo
177f0 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68  rks when x is th
17800 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63  e left-most.** c
17810 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65  olumn of an inde
17820 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  x and sqlite_sta
17830 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
17840 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a  a is available.*
17850 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78  * for that index
17860 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e  .  When pExpr==N
17870 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
17880 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
17890 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20  .** "x IS NULL" 
178a0 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41  instead of "x=VA
178b0 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  LUE"..**.** Writ
178c0 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
178d0 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
178e0 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
178f0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
17900 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
17910 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
17920 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
17930 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
17940 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
17950 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17960 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
17970 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
17980 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
17990 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
179a0 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
179b0 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
179c0 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
179d0 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
179e0 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
179f0 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
17a00 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
17a10 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
17a20 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
17a30 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
17a40 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45  tatic int whereE
17a50 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50  qualScanEst(.  P
17a60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
17a70 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
17a80 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
17a90 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
17aa0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
17ab0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
17ac0 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20  whose left-most 
17ad0 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20  column is pTerm 
17ae0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
17af0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  ,         /* Exp
17b00 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55  ression for VALU
17b10 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45  E in the x=VALUE
17b20 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
17b30 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20   double *pnRow  
17b40 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
17b50 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
17b60 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
17b70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ){.  sqlite3_val
17b80 75 65 20 2a 70 52 68 73 20 3d 20 30 3b 20 20 2f  ue *pRhs = 0;  /
17b90 2a 20 56 41 4c 55 45 20 6f 6e 20 72 69 67 68 74  * VALUE on right
17ba0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 70 54  -hand side of pT
17bb0 65 72 6d 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b  erm */.  u8 aff;
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bd0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66     /* Column aff
17be0 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72  inity */.  int r
17bf0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
17c00 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
17c10 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
17c20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32  */.  tRowcnt a[2
17c30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
17c40 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  * Statistics */.
17c50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53  .  assert( p->aS
17c60 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  ample!=0 );.  as
17c70 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65  sert( p->nSample
17c80 3e 30 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d  >0 );.  aff = p-
17c90 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
17ca0 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66  >aiColumn[0]].af
17cb0 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 70 45  finity;.  if( pE
17cc0 78 70 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  xpr ){.    rc = 
17cd0 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  valueFromExpr(pP
17ce0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66  arse, pExpr, aff
17cf0 2c 20 26 70 52 68 73 29 3b 0a 20 20 20 20 69 66  , &pRhs);.    if
17d00 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
17d10 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61  eEqualScanEst_ca
17d20 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ncel;.  }else{. 
17d30 20 20 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65     pRhs = sqlite
17d40 33 56 61 6c 75 65 4e 65 77 28 70 50 61 72 73 65  3ValueNew(pParse
17d50 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->db);.  }.  if(
17d60 20 70 52 68 73 3d 3d 30 20 29 20 72 65 74 75 72   pRhs==0 ) retur
17d70 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
17d80 44 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4b  D;.  rc = whereK
17d90 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
17da0 70 2c 20 70 52 68 73 2c 20 30 2c 20 61 29 3b 0a  p, pRhs, 0, a);.
17db0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17dc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 57 48 45 52 45  _OK ){.    WHERE
17dd0 54 52 41 43 45 28 28 22 65 71 75 61 6c 69 74 79  TRACE(("equality
17de0 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
17df0 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29  d\n", (int)a[1])
17e00 29 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20  );.    *pnRow = 
17e10 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45  a[1];.  }.whereE
17e20 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
17e30 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  el:.  sqlite3Val
17e40 75 65 46 72 65 65 28 70 52 68 73 29 3b 0a 20 20  ueFree(pRhs);.  
17e50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
17e60 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
17e70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17e80 54 33 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  T3) */..#ifdef S
17e90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17ea0 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T3./*.** Estimat
17eb0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
17ec0 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
17ed0 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
17ee0 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e   on.** an IN con
17ef0 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68  straint where th
17f00 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
17f10 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
17f20 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73  ator.** is a lis
17f30 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78  t of values.  Ex
17f40 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
17f50 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28      WHERE x IN (
17f60 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57  1,2,3,4).**.** W
17f70 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
17f80 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
17f90 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
17fa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
17fb0 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
17fc0 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
17fd0 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
17fe0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
17ff0 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
18000 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18010 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
18020 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
18030 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
18040 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
18050 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
18060 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
18070 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
18080 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
18090 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
180a0 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
180b0 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
180c0 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
180d0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
180e0 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
180f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
18100 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50  reInScanEst(.  P
18110 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18120 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
18130 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
18140 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
18150 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
18160 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
18170 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20  whose left-most 
18180 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20  column is pTerm 
18190 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
181a0 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
181b0 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
181c0 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
181d0 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
181e0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52  */.  double *pnR
181f0 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ow        /* Wri
18200 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
18210 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
18220 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
18230 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
18240 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
18250 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
18260 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 45 73 74  */.  double nEst
18270 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18280 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
18290 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ws for a single 
182a0 74 65 72 6d 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  term */.  double
182b0 20 6e 52 6f 77 45 73 74 20 3d 20 28 64 6f 75 62   nRowEst = (doub
182c0 6c 65 29 30 3b 20 2f 2a 20 4e 65 77 20 65 73 74  le)0; /* New est
182d0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
182e0 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  ber of rows */. 
182f0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
18300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18310 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
18320 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53  .  assert( p->aS
18330 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f  ample!=0 );.  fo
18340 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
18350 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d  E_OK && i<pList-
18360 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
18370 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f    nEst = p->aiRo
18380 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20  wEst[0];.    rc 
18390 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
183a0 45 73 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  Est(pParse, p, p
183b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
183c0 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52  , &nEst);.    nR
183d0 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20  owEst += nEst;. 
183e0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
183f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
18400 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61  ( nRowEst > p->a
18410 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f  iRowEst[0] ) nRo
18420 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45  wEst = p->aiRowE
18430 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f  st[0];.    *pnRo
18440 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
18450 20 57 48 45 52 45 54 52 41 43 45 28 28 22 49 4e   WHERETRACE(("IN
18460 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65   row estimate: e
18470 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73  st=%g\n", nRowEs
18480 74 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t));.  }.  retur
18490 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
184a0 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
184b0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 2a  _ENABLE_STAT3) *
184c0 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  /../*.** Check t
184d0 6f 20 73 65 65 20 69 66 20 63 6f 6c 75 6d 6e 20  o see if column 
184e0 69 43 6f 6c 20 6f 66 20 74 68 65 20 74 61 62 6c  iCol of the tabl
184f0 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 54  e with cursor iT
18500 61 62 20 77 69 6c 6c 20 61 70 70 65 61 72 0a 2a  ab will appear.*
18510 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
18520 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  r according to t
18530 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79  he current query
18540 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   plan..**.** Ret
18550 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  urn values:.**.*
18560 2a 20 20 20 20 30 20 20 20 69 43 6f 6c 20 69 73  *    0   iCol is
18570 20 6e 6f 74 20 6f 72 64 65 72 65 64 0a 2a 2a 20   not ordered.** 
18580 20 20 20 31 20 20 20 69 43 6f 6c 20 68 61 73 20     1   iCol has 
18590 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 76 61  only a single va
185a0 6c 75 65 0a 2a 2a 20 20 20 20 32 20 20 20 69 43  lue.**    2   iC
185b0 6f 6c 20 69 73 20 69 6e 20 41 53 43 20 6f 72 64  ol is in ASC ord
185c0 65 72 0a 2a 2a 20 20 20 20 33 20 20 20 69 43 6f  er.**    3   iCo
185d0 6c 20 69 73 20 69 6e 20 44 45 53 43 20 6f 72 64  l is in DESC ord
185e0 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  er.*/.static int
185f0 20 69 73 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e   isOrderedColumn
18600 28 0a 20 20 57 68 65 72 65 42 65 73 74 49 64 78  (.  WhereBestIdx
18610 20 2a 70 2c 0a 20 20 69 6e 74 20 69 54 61 62 2c   *p,.  int iTab,
18620 0a 20 20 69 6e 74 20 69 43 6f 6c 0a 29 7b 0a 20  .  int iCol.){. 
18630 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 57 68 65   int i, j;.  Whe
18640 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
18650 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e  = &p->aLevel[p->
18660 69 2d 31 5d 3b 0a 20 20 49 6e 64 65 78 20 2a 70  i-1];.  Index *p
18670 49 64 78 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72  Idx;.  u8 sortOr
18680 64 65 72 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  der;.  for(i=p->
18690 69 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  i-1; i>=0; i--, 
186a0 70 4c 65 76 65 6c 2d 2d 29 7b 0a 20 20 20 20 69  pLevel--){.    i
186b0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  f( pLevel->iTabC
186c0 75 72 21 3d 69 54 61 62 20 29 20 63 6f 6e 74 69  ur!=iTab ) conti
186d0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  nue;.    if( (pL
186e0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
186f0 67 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55  gs & WHERE_ALL_U
18700 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20  NIQUE)!=0 ){.   
18710 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
18720 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
18730 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
18740 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
18750 45 52 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  ERED)!=0 );.    
18760 69 66 28 20 28 70 49 64 78 20 3d 20 70 4c 65 76  if( (pIdx = pLev
18770 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 29  el->plan.u.pIdx)
18780 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
18790 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
187a0 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30     sortOrder = 0
187b0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
187c0 73 65 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  se( (pLevel->pla
187d0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
187e0 45 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29 3b  E_REVERSE)!=0 );
187f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18800 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49        int n = pI
18810 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
18820 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
18830 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
18840 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64     if( iCol==pId
18850 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29  x->aiColumn[j] )
18860 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
18870 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
18880 3d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =n ) return 0;. 
18890 20 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72         sortOrder
188a0 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
188b0 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
188c0 74 65 73 74 63 61 73 65 28 20 28 70 4c 65 76 65  testcase( (pLeve
188d0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
188e0 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
188f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  !=0 );.      }. 
18900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18910 69 66 28 20 69 43 6f 6c 21 3d 28 2d 31 29 20 29  if( iCol!=(-1) )
18920 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
18930 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a   sortOrder = 0;.
18940 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18950 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
18960 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45  Flags & WHERE_RE
18970 56 45 52 53 45 29 21 3d 30 20 29 3b 0a 20 20 20  VERSE)!=0 );.   
18980 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76   }.    if( (pLev
18990 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
189a0 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   & WHERE_REVERSE
189b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
189c0 73 65 72 74 28 20 73 6f 72 74 4f 72 64 65 72 3d  sert( sortOrder=
189d0 3d 30 20 7c 7c 20 73 6f 72 74 4f 72 64 65 72 3d  =0 || sortOrder=
189e0 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =1 );.      test
189f0 63 61 73 65 28 20 73 6f 72 74 4f 72 64 65 72 3d  case( sortOrder=
18a00 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 6f 72 74  =1 );.      sort
18a10 4f 72 64 65 72 20 3d 20 31 20 2d 20 73 6f 72 74  Order = 1 - sort
18a20 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Order;.    }.   
18a30 20 72 65 74 75 72 6e 20 73 6f 72 74 4f 72 64 65   return sortOrde
18a40 72 2b 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r+2;.  }.  retur
18a50 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
18a60 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64  is routine decid
18a70 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62  es if pIdx can b
18a80 65 20 75 73 65 64 20 74 6f 20 73 61 74 69 73 66  e used to satisf
18a90 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  y the ORDER BY.*
18aa0 2a 20 63 6c 61 75 73 65 2c 20 65 69 74 68 65 72  * clause, either
18ab0 20 69 6e 20 77 68 6f 6c 65 20 6f 72 20 69 6e 20   in whole or in 
18ac0 70 61 72 74 2e 20 20 54 68 65 20 72 65 74 75 72  part.  The retur
18ad0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 0a  n value is the .
18ae0 2a 2a 20 63 75 6d 75 6c 61 74 69 76 65 20 6e 75  ** cumulative nu
18af0 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18b00 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18b10 61 75 73 65 20 74 68 61 74 20 61 72 65 20 73 61  ause that are sa
18b20 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 74 68  tisfied.** by th
18b30 65 20 69 6e 64 65 78 20 70 49 64 78 20 61 6e 64  e index pIdx and
18b40 20 6f 74 68 65 72 20 69 6e 64 69 63 65 73 20 69   other indices i
18b50 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 0a 2a  n outer loops..*
18b60 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62  *.** The table b
18b70 65 69 6e 67 20 71 75 65 72 69 65 64 20 68 61 73  eing queried has
18b80 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72   a cursor number
18b90 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49 64   of "base".  pId
18ba0 78 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  x is the.** inde
18bb0 78 20 74 68 61 74 20 69 73 20 70 6f 73 74 75 6c  x that is postul
18bc0 61 74 65 64 20 66 6f 72 20 75 73 65 20 74 6f 20  ated for use to 
18bd0 61 63 63 65 73 73 20 74 68 65 20 74 61 62 6c 65  access the table
18be0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 2a 70 62 52  ..**.** The *pbR
18bf0 65 76 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  ev value is set 
18c00 74 6f 20 30 20 6f 72 64 65 72 20 31 20 64 65 70  to 0 order 1 dep
18c10 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
18c20 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 70 49 64 78  r or not.** pIdx
18c30 20 73 68 6f 75 6c 64 20 62 65 20 72 75 6e 20 69   should be run i
18c40 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20 6f 72  n the forward or
18c50 64 65 72 20 6f 72 20 69 6e 20 72 65 76 65 72 73  der or in revers
18c60 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  e order..*/.stat
18c70 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67  ic int isSorting
18c80 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 42 65  Index(.  WhereBe
18c90 73 74 49 64 78 20 2a 70 2c 20 20 20 20 2f 2a 20  stIdx *p,    /* 
18ca0 42 65 73 74 20 69 6e 64 65 78 20 73 65 61 72 63  Best index searc
18cb0 68 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  h context */.  I
18cc0 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
18cd0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
18ce0 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 20 2a  we are testing *
18cf0 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  /.  int base,   
18d00 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
18d10 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
18d20 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72   table to be sor
18d30 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  ted */.  int *pb
18d40 52 65 76 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Rev          /* 
18d50 53 65 74 20 74 6f 20 31 20 66 6f 72 20 72 65 76  Set to 1 for rev
18d60 65 72 73 65 2d 6f 72 64 65 72 20 73 63 61 6e 20  erse-order scan 
18d70 6f 66 20 70 49 64 78 20 2a 2f 0a 29 7b 0a 20 20  of pIdx */.){.  
18d80 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18da0 20 4e 75 6d 62 65 72 20 6f 66 20 70 49 64 78 20   Number of pIdx 
18db0 74 65 72 6d 73 20 75 73 65 64 20 2a 2f 0a 20 20  terms used */.  
18dc0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18de0 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
18df0 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66   BY terms satisf
18e00 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ied */.  int sor
18e10 74 4f 72 64 65 72 20 3d 20 32 3b 20 20 20 20 20  tOrder = 2;     
18e20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 66 6f 72         /* 0: for
18e30 77 61 72 64 2e 20 20 31 3a 20 62 61 63 6b 77 61  ward.  1: backwa
18e40 72 64 2e 20 20 32 3a 20 75 6e 6b 6e 6f 77 6e 20  rd.  2: unknown 
18e50 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
18e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18e80 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
18e90 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
18ea0 69 73 74 5f 69 74 65 6d 20 2a 70 4f 42 49 74 65  ist_item *pOBIte
18eb0 6d 3b 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74  m;/* A term of t
18ec0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18ed0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
18ee0 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
18ef0 6c 65 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  le;   /* Table t
18f00 68 61 74 20 6f 77 6e 73 20 69 6e 64 65 78 20 70  hat owns index p
18f10 49 64 78 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  Idx */.  ExprLis
18f20 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
18f30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
18f40 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
18f50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18f60 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20   = p->pParse;   
18f70 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
18f80 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
18f90 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
18fa0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
18fb0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
18fc0 20 20 69 6e 74 20 6e 50 72 69 6f 72 53 61 74 3b    int nPriorSat;
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fe0 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  /* ORDER BY term
18ff0 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 6f  s satisfied by o
19000 75 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  uter loops */.  
19010 69 6e 74 20 73 65 65 6e 52 6f 77 69 64 20 3d 20  int seenRowid = 
19020 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
19030 20 54 72 75 65 20 69 66 20 61 6e 20 4f 52 44 45   True if an ORDE
19040 52 20 42 59 20 72 6f 77 69 64 20 74 65 72 6d 20  R BY rowid term 
19050 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
19060 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 3b 20   uniqueNotNull; 
19070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 49             /* pI
19080 64 78 20 69 73 20 55 4e 49 51 55 45 20 77 69 74  dx is UNIQUE wit
19090 68 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20  h all terms are 
190a0 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 69  NOT NULL */..  i
190b0 66 28 20 70 2d 3e 69 3d 3d 30 20 29 7b 0a 20 20  f( p->i==0 ){.  
190c0 20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 30 3b    nPriorSat = 0;
190d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
190e0 72 69 6f 72 53 61 74 20 3d 20 70 2d 3e 61 4c 65  riorSat = p->aLe
190f0 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e  vel[p->i-1].plan
19100 2e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 69 66 28  .nOBSat;.    if(
19110 20 28 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69   (p->aLevel[p->i
19120 2d 31 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  -1].plan.wsFlags
19130 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44   & WHERE_ORDERED
19140 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
19150 20 54 68 69 73 20 6c 6f 6f 70 20 63 61 6e 6e 6f   This loop canno
19160 74 20 62 65 20 6f 72 64 65 72 65 64 20 75 6e 6c  t be ordered unl
19170 65 73 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74  ess the next out
19180 65 72 20 6c 6f 6f 70 20 69 73 0a 20 20 20 20 20  er loop is.     
19190 20 2a 2a 20 61 6c 73 6f 20 6f 72 64 65 72 65 64   ** also ordered
191a0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
191b0 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 20 20   nPriorSat;.    
191c0 7d 0a 20 20 20 20 69 66 28 20 4f 70 74 69 6d 69  }.    if( Optimi
191d0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
191e0 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42  b, SQLITE_OrderB
191f0 79 49 64 78 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  yIdxJoin) ){.   
19200 20 20 20 2f 2a 20 4f 6e 6c 79 20 6c 6f 6f 6b 20     /* Only look 
19210 61 74 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73  at the outer-mos
19220 74 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4f 72  t loop if the Or
19230 64 65 72 42 79 49 64 78 4a 6f 69 6e 0a 20 20 20  derByIdxJoin.   
19240 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69     ** optimizati
19250 6f 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  on is disabled *
19260 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  /.      return n
19270 50 72 69 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a  PriorSat;.    }.
19280 20 20 7d 0a 20 20 70 4f 72 64 65 72 42 79 20 3d    }.  pOrderBy =
19290 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
192a0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
192b0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 49 64  !=0 );.  if( pId
192c0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
192d0 0a 20 20 20 20 2f 2a 20 48 61 73 68 20 69 6e 64  .    /* Hash ind
192e0 69 63 65 73 20 28 69 6e 64 69 63 61 74 65 64 20  ices (indicated 
192f0 62 79 20 74 68 65 20 22 75 6e 6f 72 64 65 72 65  by the "unordere
19300 64 22 20 74 61 67 20 6f 6e 20 73 71 6c 69 74 65  d" tag on sqlite
19310 5f 73 74 61 74 31 29 20 63 61 6e 6e 6f 74 0a 20  _stat1) cannot. 
19320 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 66 6f     ** be used fo
19330 72 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 20  r sorting */.   
19340 20 72 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61   return nPriorSa
19350 74 3b 0a 20 20 7d 0a 20 20 6e 54 65 72 6d 20 3d  t;.  }.  nTerm =
19360 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
19370 3b 0a 20 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c  ;.  uniqueNotNul
19380 6c 20 3d 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  l = pIdx->onErro
19390 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 61 73  r!=OE_None;.  as
193a0 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b  sert( nTerm>0 );
193b0 0a 0a 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20  ..  /* Argument 
193c0 70 49 64 78 20 6d 75 73 74 20 65 69 74 68 65 72  pIdx must either
193d0 20 70 6f 69 6e 74 20 74 6f 20 61 20 27 72 65 61   point to a 'rea
193e0 6c 27 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 73  l' named index s
193f0 74 72 75 63 74 75 72 65 2c 20 0a 20 20 2a 2a 20  tructure, .  ** 
19400 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75  or an index stru
19410 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  cture allocated 
19420 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 62 79 20  on the stack by 
19430 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 29  bestBtreeIndex()
19440 20 74 6f 0a 20 20 2a 2a 20 72 65 70 72 65 73 65   to.  ** represe
19450 6e 74 20 74 68 65 20 72 6f 77 69 64 20 69 6e 64  nt the rowid ind
19460 65 78 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ex that is part 
19470 6f 66 20 65 76 65 72 79 20 74 61 62 6c 65 2e 20  of every table. 
19480 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49   */.  assert( pI
19490 64 78 2d 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70 49  dx->zName || (pI
194a0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26  dx->nColumn==1 &
194b0 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  & pIdx->aiColumn
194c0 5b 30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f  [0]==-1) );..  /
194d0 2a 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66  * Match terms of
194e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
194f0 61 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c  ause against col
19500 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  umns of.  ** the
19510 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
19520 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69  * Note that indi
19530 63 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e  ces have pIdx->n
19540 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63  Column regular c
19550 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a  olumns plus.  **
19560 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   one additional 
19570 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e  column containin
19580 67 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68  g the rowid.  Th
19590 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20  e rowid column. 
195a0 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78   ** of the index
195b0 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64   is also allowed
195c0 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73   to match agains
195d0 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  t the ORDER BY. 
195e0 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f   ** clause..  */
195f0 0a 20 20 6a 20 3d 20 6e 50 72 69 6f 72 53 61 74  .  j = nPriorSat
19600 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 70 4f 42 49  ;.  for(i=0,pOBI
19610 74 65 6d 3d 26 70 4f 72 64 65 72 42 79 2d 3e 61  tem=&pOrderBy->a
19620 5b 6a 5d 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20  [j]; j<nTerm && 
19630 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i<=pIdx->nColumn
19640 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
19650 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20   *pOBExpr;      
19660 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
19670 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44  ssion of the ORD
19680 45 52 20 42 59 20 70 4f 42 49 74 65 6d 20 2a 2f  ER BY pOBItem */
19690 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
196a0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oll;         /* 
196b0 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
196c0 71 75 65 6e 63 65 20 6f 66 20 70 4f 42 45 78 70  quence of pOBExp
196d0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72  r */.    int ter
196e0 6d 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20  mSortOrder;     
196f0 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66   /* Sort order f
19700 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  or this term */.
19710 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b      int iColumn;
19720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19730 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
19740 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31  f the index.  -1
19750 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20   for rowid */.  
19760 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72    int iSortOrder
19770 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 66  ;         /* 1 f
19780 6f 72 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41  or DESC, 0 for A
19790 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69  SC on the i-th i
197a0 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ndex term */.   
197b0 20 69 6e 74 20 69 73 45 71 3b 20 20 20 20 20 20   int isEq;      
197c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 6a           /* Subj
197d0 65 63 74 20 74 6f 20 61 6e 20 3d 3d 20 6f 72 20  ect to an == or 
197e0 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  IS NULL constrai
197f0 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  nt */.    int is
19800 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  Match;          
19810 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
19820 72 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  rm matches the i
19830 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ndex term */.   
19840 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
19850 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ll;      /* Name
19860 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65   of collating se
19870 71 75 65 6e 63 65 20 66 6f 72 20 69 2d 74 68 20  quence for i-th 
19880 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20  index term */.  
19890 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 43 6f    WhereTerm *pCo
198a0 6e 73 74 72 61 69 6e 74 3b 20 2f 2a 20 41 20 63  nstraint; /* A c
198b0 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65  onstraint in the
198c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
198d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
198e0 6e 65 78 74 20 74 65 72 6d 20 6f 66 20 74 68 65  next term of the
198f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19900 20 72 65 66 65 72 73 20 74 6f 20 61 6e 79 74 68   refers to anyth
19910 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20  ing other than. 
19920 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69     ** a column i
19930 6e 20 74 68 65 20 22 62 61 73 65 22 20 74 61 62  n the "base" tab
19940 6c 65 2c 20 74 68 65 6e 20 74 68 69 73 20 69 6e  le, then this in
19950 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
19960 6f 66 20 61 6e 79 0a 20 20 20 20 2a 2a 20 66 75  of any.    ** fu
19970 72 74 68 65 72 20 75 73 65 20 69 6e 20 68 61 6e  rther use in han
19980 64 6c 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  dling the ORDER 
19990 42 59 2e 20 2a 2f 0a 20 20 20 20 70 4f 42 45 78  BY. */.    pOBEx
199a0 70 72 20 3d 20 70 4f 42 49 74 65 6d 2d 3e 70 45  pr = pOBItem->pE
199b0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4f 42  xpr;.    if( pOB
199c0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
199d0 55 4d 4e 20 7c 7c 20 70 4f 42 45 78 70 72 2d 3e  UMN || pOBExpr->
199e0 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a  iTable!=base ){.
199f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19a00 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
19a10 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e  column number an
19a20 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
19a30 65 6e 63 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ence for the nex
19a40 74 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 69  t entry.    ** i
19a50 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  n the index */. 
19a60 20 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61     if( pIdx->zNa
19a70 6d 65 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43  me && i<pIdx->nC
19a80 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69  olumn ){.      i
19a90 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61  Column = pIdx->a
19aa0 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
19ab0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
19ac0 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  Idx->pTable->iPK
19ad0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  ey ){.        iC
19ae0 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
19af0 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f    }.      iSortO
19b00 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f  rder = pIdx->aSo
19b10 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
19b20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e    zColl = pIdx->
19b30 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
19b40 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d   assert( zColl!=
19b50 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
19b60 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
19b70 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72 74 4f  -1;.      iSortO
19b80 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rder = 0;.      
19b90 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  zColl = 0;.    }
19ba0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
19bb0 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
19bc0 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 63  umn number and c
19bd0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
19be0 65 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  e of the.    ** 
19bf0 69 6e 64 65 78 20 6d 61 74 63 68 20 74 68 65 20  index match the 
19c00 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e  column number an
19c10 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
19c20 65 6e 63 65 20 6f 66 20 74 68 65 20 4f 52 44 45  ence of the ORDE
19c30 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75  R BY.    ** clau
19c40 73 65 20 65 6e 74 72 79 2e 20 20 53 65 74 20 69  se entry.  Set i
19c50 73 4d 61 74 63 68 20 74 6f 20 31 20 69 66 20 74  sMatch to 1 if t
19c60 68 65 79 20 62 6f 74 68 20 6d 61 74 63 68 2e 20  hey both match. 
19c70 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 42 45 78  */.    if( pOBEx
19c80 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  pr->iColumn==iCo
19c90 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  lumn ){.      if
19ca0 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( zColl ){.     
19cb0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
19cc0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
19cd0 61 72 73 65 2c 20 70 4f 42 45 78 70 72 29 3b 0a  arse, pOBExpr);.
19ce0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
19cf0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
19d00 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
19d10 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 73 71      isMatch = sq
19d20 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
19d30 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c  ll->zName, zColl
19d40 29 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )==0;.      }els
19d50 65 7b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  e{.        isMat
19d60 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ch = 1;.      }.
19d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19d80 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
19d90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 74 65 72 6d    }..    /* term
19da0 53 6f 72 74 4f 72 64 65 72 20 69 73 20 30 20 6f  SortOrder is 0 o
19db0 72 20 31 20 66 6f 72 20 77 68 65 74 68 65 72 20  r 1 for whether 
19dc0 6f 72 20 6e 6f 74 20 74 68 65 20 61 63 63 65 73  or not the acces
19dd0 73 20 6c 6f 6f 70 20 73 68 6f 75 6c 64 0a 20 20  s loop should.  
19de0 20 20 2a 2a 20 72 75 6e 20 66 6f 72 77 61 72 64    ** run forward
19df0 20 6f 72 20 62 61 63 6b 77 61 72 64 73 20 28 72   or backwards (r
19e00 65 73 70 65 63 74 69 76 65 6c 79 29 20 69 6e 20  espectively) in 
19e10 6f 72 64 65 72 20 74 6f 20 73 61 74 69 73 66 79  order to satisfy
19e20 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 74 65   this .    ** te
19e30 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
19e40 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20  BY clause. */.  
19e50 20 20 61 73 73 65 72 74 28 20 70 4f 42 49 74 65    assert( pOBIte
19e60 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20  m->sortOrder==0 
19e70 7c 7c 20 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74  || pOBItem->sort
19e80 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20  Order==1 );.    
19e90 61 73 73 65 72 74 28 20 69 53 6f 72 74 4f 72 64  assert( iSortOrd
19ea0 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72  er==0 || iSortOr
19eb0 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65  der==1 );.    te
19ec0 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 69 53  rmSortOrder = iS
19ed0 6f 72 74 4f 72 64 65 72 20 5e 20 70 4f 42 49 74  ortOrder ^ pOBIt
19ee0 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 0a  em->sortOrder;..
19ef0 20 20 20 20 2f 2a 20 49 66 20 58 20 69 73 20 74      /* If X is t
19f00 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  he column in the
19f10 20 69 6e 64 65 78 20 61 6e 64 20 4f 52 44 45 52   index and ORDER
19f20 20 42 59 20 63 6c 61 75 73 65 2c 20 63 68 65 63   BY clause, chec
19f30 6b 20 74 6f 20 73 65 65 0a 20 20 20 20 2a 2a 20  k to see.    ** 
19f40 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
19f50 20 58 3d 20 6f 72 20 58 20 49 53 20 4e 55 4c 4c   X= or X IS NULL
19f60 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
19f70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19f80 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6e 73 74 72  . */.    pConstr
19f90 61 69 6e 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  aint = findTerm(
19fa0 70 2d 3e 70 57 43 2c 20 62 61 73 65 2c 20 69 43  p->pWC, base, iC
19fb0 6f 6c 75 6d 6e 2c 20 70 2d 3e 6e 6f 74 52 65 61  olumn, p->notRea
19fc0 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy,.            
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
19fe0 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_EQ|WO_ISNULL|W
19ff0 4f 5f 49 4e 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_IN, pIdx);.   
1a000 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
1a010 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73 45  ==0 ){.      isE
1a020 71 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  q = 0;.    }else
1a030 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
1a040 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
1a050 49 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  IN ){.      /* C
1a060 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
1a070 65 20 66 6f 72 6d 3a 20 22 58 20 49 4e 20 2e 2e  e form: "X IN ..
1a080 2e 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ." cannot be use
1a090 64 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  d with an ORDER 
1a0a0 42 59 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 61  BY.      ** beca
1a0b0 75 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  use we do not kn
1a0c0 6f 77 20 69 6e 20 77 68 61 74 20 6f 72 64 65 72  ow in what order
1a0d0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 6e 20 74   the values on t
1a0e0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
1a0f0 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  .      ** operat
1a100 6f 72 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 2a  or will occur. *
1a110 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
1a120 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f     }else if( pCo
1a130 6e 73 74 72 61 69 6e 74 2d 3e 65 4f 70 65 72 61  nstraint->eOpera
1a140 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29  tor==WO_ISNULL )
1a150 7b 0a 20 20 20 20 20 20 75 6e 69 71 75 65 4e 6f  {.      uniqueNo
1a160 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  tNull = 0;.     
1a170 20 69 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 22   isEq = 1;  /* "
1a180 58 20 49 53 20 4e 55 4c 4c 22 20 6d 65 61 6e 73  X IS NULL" means
1a190 20 58 20 68 61 73 20 6f 6e 6c 79 20 61 20 73 69   X has only a si
1a1a0 6e 67 6c 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ngle value */.  
1a1b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e    }else if( pCon
1a1c0 73 74 72 61 69 6e 74 2d 3e 70 72 65 72 65 71 52  straint->prereqR
1a1d0 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
1a1e0 20 69 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 43   isEq = 1;  /* C
1a1f0 6f 6e 73 74 72 61 69 6e 74 20 22 58 3d 63 6f 6e  onstraint "X=con
1a200 73 74 61 6e 74 22 20 6d 65 61 6e 73 20 58 20 68  stant" means X h
1a210 61 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  as only a single
1a220 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 7d 65   value */.    }e
1a230 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
1a240 2a 70 52 69 67 68 74 20 3d 20 70 43 6f 6e 73 74  *pRight = pConst
1a250 72 61 69 6e 74 2d 3e 70 45 78 70 72 2d 3e 70 52  raint->pExpr->pR
1a260 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
1a270 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  pRight->op==TK_C
1a280 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
1a290 20 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20   WHERETRACE(("  
1a2a0 20 20 20 20 20 2e 2e 20 69 73 4f 72 64 65 72 65       .. isOrdere
1a2b0 64 43 6f 6c 75 6d 6e 28 74 61 62 3d 25 64 2c 63  dColumn(tab=%d,c
1a2c0 6f 6c 3d 25 64 29 22 2c 0a 20 20 20 20 20 20 20  ol=%d)",.       
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
1a2e0 67 68 74 2d 3e 69 54 61 62 6c 65 2c 20 70 52 69  ght->iTable, pRi
1a2f0 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 29 3b 0a  ght->iColumn));.
1a300 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 69          isEq = i
1a310 73 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28 70  sOrderedColumn(p
1a320 2c 20 70 52 69 67 68 74 2d 3e 69 54 61 62 6c 65  , pRight->iTable
1a330 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  , pRight->iColum
1a340 6e 29 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52  n);.        WHER
1a350 45 54 52 41 43 45 28 28 22 20 2d 3e 20 69 73 45  ETRACE((" -> isE
1a360 71 3d 25 64 5c 6e 22 2c 20 69 73 45 71 29 29 3b  q=%d\n", isEq));
1a370 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
1a380 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
1a390 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  s of the form X=
1a3a0 59 20 77 68 65 72 65 20 59 20 69 73 20 61 6e 20  Y where Y is an 
1a3b0 6f 72 64 65 72 65 64 20 76 61 6c 75 65 0a 20 20  ordered value.  
1a3c0 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 6e 20 6f        ** in an o
1a3d0 75 74 65 72 20 6c 6f 6f 70 2c 20 74 68 65 6e 20  uter loop, then 
1a3e0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f  make sure the so
1a3f0 72 74 20 6f 72 64 65 72 20 6f 66 20 59 20 6d 61  rt order of Y ma
1a400 74 63 68 65 73 20 74 68 65 0a 20 20 20 20 20 20  tches the.      
1a410 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 20    ** sort order 
1a420 72 65 71 75 69 72 65 64 20 66 6f 72 20 58 2e 20  required for X. 
1a430 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
1a440 73 4d 61 74 63 68 20 26 26 20 69 73 45 71 3e 3d  sMatch && isEq>=
1a450 32 20 26 26 20 69 73 45 71 21 3d 70 4f 42 49 74  2 && isEq!=pOBIt
1a460 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 2b 32 20  em->sortOrder+2 
1a470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
1a480 74 63 61 73 65 28 20 69 73 45 71 3d 3d 32 20 29  tcase( isEq==2 )
1a490 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
1a4a0 63 61 73 65 28 20 69 73 45 71 3d 3d 33 20 29 3b  case( isEq==3 );
1a4b0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1a4c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a4d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a4e0 20 69 73 45 71 20 3d 20 30 3b 20 20 2f 2a 20 22   isEq = 0;  /* "
1a4f0 58 3d 65 78 70 72 22 20 70 6c 61 63 65 73 20 6e  X=expr" places n
1a500 6f 20 6f 72 64 65 72 69 6e 67 20 63 6f 6e 73 74  o ordering const
1a510 72 61 69 6e 74 73 20 6f 6e 20 58 20 2a 2f 0a 20  raints on X */. 
1a520 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a530 20 69 66 28 20 21 69 73 4d 61 74 63 68 20 29 7b   if( !isMatch ){
1a540 0a 20 20 20 20 20 20 69 66 28 20 69 73 45 71 3d  .      if( isEq=
1a550 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  =0 ){.        br
1a560 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
1a570 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  {.        contin
1a580 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
1a590 7d 65 6c 73 65 20 69 66 28 20 69 73 45 71 21 3d  }else if( isEq!=
1a5a0 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
1a5b0 6f 72 74 4f 72 64 65 72 3d 3d 32 20 29 7b 0a 20  ortOrder==2 ){. 
1a5c0 20 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72         sortOrder
1a5d0 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72   = termSortOrder
1a5e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1a5f0 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21  ( termSortOrder!
1a600 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  =sortOrder ){.  
1a610 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a620 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6a     }.    }.    j
1a630 2b 2b 3b 0a 20 20 20 20 70 4f 42 49 74 65 6d 2b  ++;.    pOBItem+
1a640 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75  +;.    if( iColu
1a650 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 65  mn<0 ){.      se
1a660 65 6e 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20  enRowid = 1;.   
1a670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
1a680 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43  lse if( pTab->aC
1a690 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  ol[iColumn].notN
1a6a0 75 6c 6c 3d 3d 30 20 26 26 20 69 73 45 71 21 3d  ull==0 && isEq!=
1a6b0 31 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  1 ){.      testc
1a6c0 61 73 65 28 20 69 73 45 71 3d 3d 30 20 29 3b 0a  ase( isEq==0 );.
1a6d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a6e0 69 73 45 71 3d 3d 32 20 29 3b 0a 20 20 20 20 20  isEq==2 );.     
1a6f0 20 74 65 73 74 63 61 73 65 28 20 69 73 45 71 3d   testcase( isEq=
1a700 3d 33 20 29 3b 0a 20 20 20 20 20 20 75 6e 69 71  =3 );.      uniq
1a710 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  ueNotNull = 0;. 
1a720 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1a730 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 66 6f  f we have not fo
1a740 75 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  und at least one
1a750 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
1a760 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 0a  hat matches the.
1a770 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
1a780 20 73 68 6f 77 20 6e 6f 20 70 72 6f 67 72 65 73   show no progres
1a790 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 42 49  s. */.  if( pOBI
1a7a0 74 65 6d 3d 3d 26 70 4f 72 64 65 72 42 79 2d 3e  tem==&pOrderBy->
1a7b0 61 5b 6e 50 72 69 6f 72 53 61 74 5d 20 29 20 72  a[nPriorSat] ) r
1a7c0 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b  eturn nPriorSat;
1a7d0 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
1a7e0 65 20 6e 65 63 65 73 73 61 72 79 20 73 63 61 6e  e necessary scan
1a7f0 20 6f 72 64 65 72 20 62 61 63 6b 20 74 6f 20 74   order back to t
1a800 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 2a  he caller */.  *
1a810 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65  pbRev = sortOrde
1a820 72 20 26 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  r & 1;..  /* If 
1a830 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
1a840 44 45 52 20 42 59 20 72 6f 77 69 64 22 20 74 65  DER BY rowid" te
1a850 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65 64 2c  rm that matched,
1a860 20 6f 72 20 69 74 20 69 73 20 6f 6e 6c 79 0a 20   or it is only. 
1a870 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   ** possible for
1a880 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 72   a single row fr
1a890 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 74 6f  om this table to
1a8a0 20 6d 61 74 63 68 2c 20 74 68 65 6e 20 73 6b 69   match, then ski
1a8b0 70 20 6f 76 65 72 0a 20 20 2a 2a 20 61 6e 79 20  p over.  ** any 
1a8c0 61 64 64 69 74 69 6f 6e 61 6c 20 4f 52 44 45 52  additional ORDER
1a8d0 20 42 59 20 74 65 72 6d 73 20 64 65 61 6c 69 6e   BY terms dealin
1a8e0 67 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  g with this tabl
1a8f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 65  e..  */.  if( se
1a900 65 6e 52 6f 77 69 64 20 7c 7c 20 28 75 6e 69 71  enRowid || (uniq
1a910 75 65 4e 6f 74 4e 75 6c 6c 20 26 26 20 69 3e 3d  ueNotNull && i>=
1a920 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  pIdx->nColumn) )
1a930 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65  {.    /* Advance
1a940 20 6a 20 6f 76 65 72 20 61 64 64 69 74 69 6f 6e   j over addition
1a950 61 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  al ORDER BY term
1a960 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1a970 68 20 62 61 73 65 20 2a 2f 0a 20 20 20 20 57 68  h base */.    Wh
1a980 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 53 20  ereMaskSet *pMS 
1a990 3d 20 70 2d 3e 70 57 43 2d 3e 70 4d 61 73 6b 53  = p->pWC->pMaskS
1a9a0 65 74 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  et;.    Bitmask 
1a9b0 6d 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 53  m = ~getMask(pMS
1a9c0 2c 20 62 61 73 65 29 3b 0a 20 20 20 20 77 68 69  , base);.    whi
1a9d0 6c 65 28 20 6a 3c 6e 54 65 72 6d 20 26 26 20 28  le( j<nTerm && (
1a9e0 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
1a9f0 4d 53 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  MS, pOrderBy->a[
1aa00 6a 5d 2e 70 45 78 70 72 29 26 6d 29 3d 3d 30 20  j].pExpr)&m)==0 
1aa10 29 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ){.      j++;.  
1aa20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1aa30 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
1aa40 64 20 74 68 65 20 62 65 73 74 20 71 75 65 72 79  d the best query
1aa50 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
1aa60 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
1aa70 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74   table.  Write t
1aa80 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79  he.** best query
1aa90 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f   plan and its co
1aaa0 73 74 20 69 6e 74 6f 20 74 68 65 20 70 2d 3e 63  st into the p->c
1aab0 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ost..**.** The l
1aac0 6f 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20  owest cost plan 
1aad0 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20  wins.  The cost 
1aae0 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1aaf0 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a  f the amount of.
1ab00 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20  ** CPU and disk 
1ab10 49 2f 4f 20 6e 65 65 64 65 64 20 74 6f 20 70 72  I/O needed to pr
1ab20 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73  ocess the reques
1ab30 74 65 64 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 46  ted result..** F
1ab40 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c  actors that infl
1ab50 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75  uence cost inclu
1ab60 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  de:.**.**    *  
1ab70 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  The estimated nu
1ab80 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
1ab90 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  t will be retrie
1aba0 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20  ved.  (The.**   
1abb0 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65      fewer the be
1abc0 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  tter.).**.**    
1abd0 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
1abe0 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f  t sorting must o
1abf0 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ccur..**.**    *
1ac00 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
1ac10 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73   there must be s
1ac20 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20  eparate lookups 
1ac30 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
1ac40 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65  index and in the
1ac50 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a   main table..**.
1ac60 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  ** If there was 
1ac70 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
1ac80 61 75 73 65 20 28 70 53 72 63 2d 3e 70 49 6e 64  ause (pSrc->pInd
1ac90 65 78 29 20 61 74 74 61 63 68 65 64 20 74 6f 20  ex) attached to 
1aca0 74 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  the table in.** 
1acb0 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1acc0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
1acd0 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69  ction only consi
1ace0 64 65 72 73 20 70 6c 61 6e 73 20 75 73 69 6e 67  ders plans using
1acf0 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20 69   the .** named i
1ad00 6e 64 65 78 2e 20 49 66 20 6e 6f 20 73 75 63 68  ndex. If no such
1ad10 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c 20   plan is found, 
1ad20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65  then the returne
1ad30 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c  d cost is.** SQL
1ad40 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20  ITE_BIG_DBL. If 
1ad50 61 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 20  a plan is found 
1ad60 74 68 61 74 20 75 73 65 73 20 74 68 65 20 6e 61  that uses the na
1ad70 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74  med index, .** t
1ad80 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20  hen the cost is 
1ad90 63 61 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68  calculated in th
1ada0 65 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a  e usual way..**.
1adb0 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45  ** If a NOT INDE
1adc0 58 45 44 20 63 6c 61 75 73 65 20 77 61 73 20 61  XED clause was a
1add0 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
1ade0 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  able .** in the 
1adf0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ae00 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65  , then no indexe
1ae10 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1ae20 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a  . However, the .
1ae30 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e  ** selected plan
1ae40 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20   may still take 
1ae50 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
1ae60 20 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20   built-in rowid 
1ae70 70 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69  primary key.** i
1ae80 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
1ae90 76 6f 69 64 20 62 65 73 74 42 74 72 65 65 49 6e  void bestBtreeIn
1aea0 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78  dex(WhereBestIdx
1aeb0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
1aec0 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
1aed0 65 3b 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69  e;  /* The parsi
1aee0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1aef0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1af00 20 3d 20 70 2d 3e 70 57 43 3b 20 20 2f 2a 20 54   = p->pWC;  /* T
1af10 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1af20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1af30 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d  ist_item *pSrc =
1af40 20 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65   p->pSrc; /* The
1af50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1af60 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
1af70 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63   int iCur = pSrc
1af80 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20  ->iCursor;   /* 
1af90 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  The cursor of th
1afa0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63  e table to be ac
1afb0 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65  cessed */.  Inde
1afc0 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
1afd0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
1afe0 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
1aff0 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
1b000 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1b010 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
1b020 66 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72  f pProbe, or zer
1b030 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20  o for IPK index 
1b040 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d  */.  int eqTermM
1b050 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1b060 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b   /* Current mask
1b070 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69   of valid equali
1b080 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
1b090 20 20 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d    int idxEqTermM
1b0a0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ask;          /*
1b0b0 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76   Index mask of v
1b0c0 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70  alid equality op
1b0d0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64  erators */.  Ind
1b0e0 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
1b0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
1b100 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
1b110 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
1b120 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  key */.  tRowcnt
1b130 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
1b140 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
1b150 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  wEst[] value for
1b160 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
1b170 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e  /.  int aiColumn
1b180 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
1b190 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
1b1a0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
1b1b0 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  Pk index */.  in
1b1c0 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20  t wsFlagMask;   
1b1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1b1e0 6f 77 65 64 20 66 6c 61 67 73 20 69 6e 20 70 2d  owed flags in p-
1b1f0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
1b200 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  g */..  /* Initi
1b210 61 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20 74  alize the cost t
1b220 6f 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20 76  o a worst-case v
1b230 61 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  alue */.  memset
1b240 28 26 70 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69  (&p->cost, 0, si
1b250 7a 65 6f 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a  zeof(p->cost));.
1b260 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20    p->cost.rCost 
1b270 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
1b280 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
1b290 53 72 63 20 74 61 62 6c 65 20 69 73 20 74 68 65  Src table is the
1b2a0 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
1b2b0 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e  a LEFT JOIN then
1b2c0 20 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a   we may not.  **
1b2d0 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 74 6f   use an index to
1b2e0 20 73 61 74 69 73 66 79 20 49 53 20 4e 55 4c 4c   satisfy IS NULL
1b2f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
1b300 74 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69  that table.  Thi
1b310 73 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73  s is.  ** becaus
1b320 65 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20  e columns might 
1b330 65 6e 64 20 75 70 20 62 65 69 6e 67 20 4e 55 4c  end up being NUL
1b340 4c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64  L if the table d
1b350 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a  oes not match -.
1b360 20 20 2a 2a 20 61 20 63 69 72 63 75 6d 73 74 61    ** a circumsta
1b370 6e 63 65 20 77 68 69 63 68 20 74 68 65 20 69 6e  nce which the in
1b380 64 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20  dex cannot help 
1b390 75 73 20 64 69 73 63 6f 76 65 72 2e 20 20 54 69  us discover.  Ti
1b3a0 63 6b 65 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f  cket #2177..  */
1b3b0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6a 6f 69  .  if( pSrc->joi
1b3c0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20  ntype & JT_LEFT 
1b3d0 29 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d  ){.    idxEqTerm
1b3e0 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
1b3f0 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  IN;.  }else{.   
1b400 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d   idxEqTermMask =
1b410 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
1b420 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69  ISNULL;.  }..  i
1b430 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
1b440 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44  ){.    /* An IND
1b450 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73  EXED BY clause s
1b460 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69  pecifies a parti
1b470 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75  cular index to u
1b480 73 65 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d  se */.    pIdx =
1b490 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
1b4a0 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 73 46 6c  pIndex;.    wsFl
1b4b0 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45  agMask = ~(WHERE
1b4c0 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
1b4d0 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20  ROWID_RANGE);.  
1b4e0 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69    eqTermMask = i
1b4f0 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20  dxEqTermMask;.  
1b500 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1b510 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
1b520 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
1b530 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
1b540 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
1b550 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
1b560 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
1b570 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
1b580 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
1b590 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
1b5a0 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
1b5b0 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
1b5c0 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
1b5d0 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
1b5e0 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
1b5f0 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
1b600 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
1b610 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
1b620 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1b630 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
1b640 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
1b650 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
1b660 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
1b670 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f  x));.    sPk.nCo
1b680 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50  lumn = 1;.    sP
1b690 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69  k.aiColumn = &ai
1b6a0 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50  ColumnPk;.    sP
1b6b0 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52  k.aiRowEst = aiR
1b6c0 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b  owEstPk;.    sPk
1b6d0 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65  .onError = OE_Re
1b6e0 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70  place;.    sPk.p
1b6f0 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
1b700 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  ab;.    aiRowEst
1b710 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54  Pk[0] = pSrc->pT
1b720 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20  ab->nRowEst;.   
1b730 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d   aiRowEstPk[1] =
1b740 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d   1;.    pFirst =
1b750 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
1b760 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72  dex;.    if( pSr
1b770 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  c->notIndexed==0
1b780 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1b790 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66   real indices of
1b7a0 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f   the table are o
1b7b0 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69  nly considered i
1b7c0 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e  f the.      ** N
1b7d0 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69  OT INDEXED quali
1b7e0 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  fier is omitted 
1b7f0 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c  from the FROM cl
1b800 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50  ause */.      sP
1b810 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74  k.pNext = pFirst
1b820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f  ;.    }.    pPro
1b830 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 20 20 77  be = &sPk;.    w
1b840 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 0a 20  sFlagMask = ~(. 
1b850 20 20 20 20 20 20 20 57 48 45 52 45 5f 43 4f 4c         WHERE_COL
1b860 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c  UMN_IN|WHERE_COL
1b870 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c  UMN_EQ|WHERE_COL
1b880 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43  UMN_NULL|WHERE_C
1b890 4f 4c 55 4d 4e 5f 52 41 4e 47 45 0a 20 20 20 20  OLUMN_RANGE.    
1b8a0 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  );.    eqTermMas
1b8b0 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b  k = WO_EQ|WO_IN;
1b8c0 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20  .    pIdx = 0;. 
1b8d0 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76   }..  /* Loop ov
1b8e0 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  er all indices l
1b8f0 6f 6f 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62  ooking for the b
1b900 65 73 74 20 6f 6e 65 20 74 6f 20 75 73 65 0a 20  est one to use. 
1b910 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f   */.  for(; pPro
1b920 62 65 3b 20 70 49 64 78 3d 70 50 72 6f 62 65 3d  be; pIdx=pProbe=
1b930 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a  pProbe->pNext){.
1b940 20 20 20 20 63 6f 6e 73 74 20 74 52 6f 77 63 6e      const tRowcn
1b950 74 20 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45  t * const aiRowE
1b960 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  st = pProbe->aiR
1b970 6f 77 45 73 74 3b 0a 20 20 20 20 57 68 65 72 65  owEst;.    Where
1b980 43 6f 73 74 20 70 63 3b 20 20 20 20 20 20 20 20  Cost pc;        
1b990 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
1b9a0 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a  f using pProbe *
1b9b0 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 67  /.    double log
1b9c0 31 30 4e 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  10N = (double)1;
1b9d0 20 20 2f 2a 20 62 61 73 65 2d 31 30 20 6c 6f 67    /* base-10 log
1b9e0 61 72 69 74 68 6d 20 6f 66 20 6e 52 6f 77 20 28  arithm of nRow (
1b9f0 69 6e 65 78 61 63 74 29 20 2a 2f 0a 0a 20 20 20  inexact) */..   
1ba00 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1ba10 67 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  g variables are 
1ba20 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20  populated based 
1ba30 6f 6e 20 74 68 65 20 70 72 6f 70 65 72 74 69 65  on the propertie
1ba40 73 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65  s of.    ** inde
1ba50 78 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  x being evaluate
1ba60 64 2e 20 54 68 65 79 20 61 72 65 20 74 68 65 6e  d. They are then
1ba70 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
1ba80 6e 65 20 74 68 65 20 65 78 70 65 63 74 65 64 0a  ne the expected.
1ba90 20 20 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20      ** cost and 
1baa0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72  number of rows r
1bab0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a  eturned..    **.
1bac0 20 20 20 20 2a 2a 20 20 70 63 2e 70 6c 61 6e 2e      **  pc.plan.
1bad0 6e 45 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20  nEq: .    **    
1bae0 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  Number of equali
1baf0 74 79 20 74 65 72 6d 73 20 74 68 61 74 20 63 61  ty terms that ca
1bb00 6e 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n be implemented
1bb10 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78   using the index
1bb20 2e 0a 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f  ..    **    In o
1bb30 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1bb40 6e 75 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61  number of initia
1bb50 6c 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  l fields in the 
1bb60 69 6e 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a  index that.    *
1bb70 2a 20 20 20 20 61 72 65 20 75 73 65 64 20 69 6e  *    are used in
1bb80 20 3d 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54   == or IN or NOT
1bb90 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
1bba0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
1bbb0 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  lause..    **.  
1bbc0 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a    **  nInMul:  .
1bbd0 20 20 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69      **    The "i
1bbe0 6e 2d 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54  n-multiplier". T
1bbf0 68 69 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61  his is an estima
1bc00 74 65 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73  te of how many s
1bc10 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a  eek operations .
1bc20 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65      **    SQLite
1bc30 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e   must perform on
1bc40 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75   the index in qu
1bc50 65 73 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  estion. For exam
1bc60 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1bc70 20 2a 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61   **    WHERE cla
1bc80 75 73 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  use is:.    **. 
1bc90 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45     **      WHERE
1bca0 20 61 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20   a IN (1, 2, 3) 
1bcb0 41 4e 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20  AND b IN (4, 5, 
1bcc0 36 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  6).    **.    **
1bcd0 20 20 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20      SQLite must 
1bce0 70 65 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70  perform 9 lookup
1bcf0 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e  s on an index on
1bd00 20 28 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d   (a, b), so nInM
1bd10 75 6c 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20  ul is .    **   
1bd20 20 73 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e   set to 9. Given
1bd30 20 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61   the same schema
1bd40 20 61 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74   and either of t
1bd50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45  he following WHE
1bd60 52 45 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c  RE .    **    cl
1bd70 61 75 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  auses:.    **.  
1bd80 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20    **      WHERE 
1bd90 61 20 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20  a =  1.    **   
1bda0 20 20 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a     WHERE a >= 2.
1bdb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1bdc0 20 6e 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74   nInMul is set t
1bdd0 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 1..    **.    
1bde0 2a 2a 20 20 20 20 49 66 20 74 68 65 72 65 20 65  **    If there e
1bdf0 78 69 73 74 73 20 61 20 57 48 45 52 45 20 74 65  xists a WHERE te
1be00 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
1be10 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
1be20 29 22 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  )", then .    **
1be30 20 20 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65      the sub-sele
1be40 63 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ct is assumed to
1be50 20 72 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20   return 25 rows 
1be60 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  for the purposes
1be70 20 6f 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64   of .    **    d
1be80 65 74 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75  etermining nInMu
1be90 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
1bea0 20 20 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20    bInEst:  .    
1beb0 2a 2a 20 20 20 20 53 65 74 20 74 6f 20 74 72 75  **    Set to tru
1bec0 65 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  e if there was a
1bed0 74 20 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49  t least one "x I
1bee0 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
1bef0 74 65 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a  term used .    *
1bf00 2a 20 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e  *    in determin
1bf10 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ing the value of
1bf20 20 6e 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74   nInMul.  Note t
1bf30 68 61 74 20 74 68 65 20 52 48 53 20 6f 66 20 74  hat the RHS of t
1bf40 68 65 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20  he.    **    IN 
1bf50 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
1bf60 20 61 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61   a SELECT, not a
1bf70 20 76 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72   value list, for
1bf80 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20   this variable. 
1bf90 20 20 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74     **    to be t
1bfa0 72 75 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rue..    **.    
1bfb0 2a 2a 20 20 72 61 6e 67 65 44 69 76 3a 0a 20 20  **  rangeDiv:.  
1bfc0 20 20 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d    **    An estim
1bfd0 61 74 65 20 6f 66 20 61 20 64 69 76 69 73 6f 72  ate of a divisor
1bfe0 20 62 79 20 77 68 69 63 68 20 74 6f 20 72 65 64   by which to red
1bff0 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
1c000 70 61 63 65 20 64 75 65 0a 20 20 20 20 2a 2a 20  pace due.    ** 
1c010 20 20 20 74 6f 20 69 6e 65 71 75 61 6c 69 74 79     to inequality
1c020 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 49   constraints.  I
1c030 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
1c040 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e   sqlite_stat3 AN
1c050 41 4c 59 5a 45 0a 20 20 20 20 2a 2a 20 20 20 20  ALYZE.    **    
1c060 64 61 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69  data, a single i
1c070 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65  nequality reduce
1c080 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
1c090 63 65 20 74 6f 20 31 2f 34 72 64 20 69 74 73 0a  ce to 1/4rd its.
1c0a0 20 20 20 20 2a 2a 20 20 20 20 6f 72 69 67 69 6e      **    origin
1c0b0 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69  al size (rangeDi
1c0c0 76 3d 3d 34 29 2e 20 20 54 77 6f 20 69 6e 65 71  v==4).  Two ineq
1c0d0 75 61 6c 69 74 69 65 73 20 72 65 64 75 63 65 20  ualities reduce 
1c0e0 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a  the search.    *
1c0f0 2a 20 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f  *    space to 1/
1c100 31 36 74 68 20 6f 66 20 69 74 73 20 6f 72 69 67  16th of its orig
1c110 69 6e 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65  inal size (range
1c120 44 69 76 3d 3d 31 36 29 2e 0a 20 20 20 20 2a 2a  Div==16)..    **
1c130 0a 20 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20  .    **  bSort: 
1c140 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f    .    **    Boo
1c150 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68  lean. True if th
1c160 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1c170 42 59 20 63 6c 61 75 73 65 20 74 68 61 74 20 77  BY clause that w
1c180 69 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a  ill require an .
1c190 20 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e      **    extern
1c1a0 61 6c 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63  al sort (i.e. sc
1c1b0 61 6e 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  anning the index
1c1c0 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
1c1d0 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a   will not .    *
1c1e0 2a 20 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f  *    correctly o
1c1f0 72 64 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20  rder records).. 
1c200 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 44     **.    **  bD
1c210 69 73 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 42  ist:.    **    B
1c220 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20  oolean. True if 
1c230 74 68 65 72 65 20 69 73 20 61 20 44 49 53 54 49  there is a DISTI
1c240 4e 43 54 20 63 6c 61 75 73 65 20 74 68 61 74 20  NCT clause that 
1c250 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20  will require an 
1c260 0a 20 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72  .    **    exter
1c270 6e 61 6c 20 62 74 72 65 65 2e 0a 20 20 20 20 2a  nal btree..    *
1c280 2a 0a 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75  *.    **  bLooku
1c290 70 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f  p: .    **    Bo
1c2a0 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 61  olean. True if a
1c2b0 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 69 73   table lookup is
1c2c0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
1c2d0 63 68 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 20  ch index entry. 
1c2e0 20 20 20 2a 2a 20 20 20 20 76 69 73 69 74 65 64     **    visited
1c2f0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1c300 73 2c 20 74 72 75 65 20 69 66 20 74 68 69 73 20  s, true if this 
1c310 69 73 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e  is not a coverin
1c320 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20  g index..    ** 
1c330 20 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79     This is alway
1c340 73 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20  s false for the 
1c350 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1c360 79 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62  y index of a tab
1c370 6c 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f  le..    **    Fo
1c380 72 20 6f 74 68 65 72 20 69 6e 64 65 78 65 73 2c  r other indexes,
1c390 20 69 74 20 69 73 20 74 72 75 65 20 75 6e 6c 65   it is true unle
1c3a0 73 73 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75 6d  ss all the colum
1c3b0 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  ns of the table.
1c3c0 20 20 20 20 2a 2a 20 20 20 20 75 73 65 64 20 62      **    used b
1c3d0 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
1c3e0 74 65 6d 65 6e 74 20 61 72 65 20 70 72 65 73 65  tement are prese
1c3f0 6e 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  nt in the index 
1c400 28 73 75 63 68 20 61 6e 0a 20 20 20 20 2a 2a 20  (such an.    ** 
1c410 20 20 20 69 6e 64 65 78 20 69 73 20 73 6f 6d 65     index is some
1c420 74 69 6d 65 73 20 64 65 73 63 72 69 62 65 64 20  times described 
1c430 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
1c440 64 65 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20 20  dex)..    **    
1c450 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76  For example, giv
1c460 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  en the index on 
1c470 28 61 2c 20 62 29 2c 20 74 68 65 20 73 65 63 6f  (a, b), the seco
1c480 6e 64 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nd of the follow
1c490 69 6e 67 20 0a 20 20 20 20 2a 2a 20 20 20 20 74  ing .    **    t
1c4a0 77 6f 20 71 75 65 72 69 65 73 20 72 65 71 75 69  wo queries requi
1c4b0 72 65 73 20 74 61 62 6c 65 20 62 2d 74 72 65 65  res table b-tree
1c4c0 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 6f 72 64 65   lookups in orde
1c4d0 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20 76 61  r to find the va
1c4e0 6c 75 65 0a 20 20 20 20 2a 2a 20 20 20 20 6f 66  lue.    **    of
1c4f0 20 63 6f 6c 75 6d 6e 20 63 2c 20 62 75 74 20 74   column c, but t
1c500 68 65 20 66 69 72 73 74 20 64 6f 65 73 20 6e 6f  he first does no
1c510 74 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e  t because column
1c520 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 20 20  s a and b are.  
1c530 20 20 2a 2a 20 20 20 20 62 6f 74 68 20 61 76 61    **    both ava
1c540 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 69 6e  ilable in the in
1c550 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
1c560 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 53  **             S
1c570 45 4c 45 43 54 20 61 2c 20 62 20 20 20 20 46 52  ELECT a, b    FR
1c580 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d  OM tbl WHERE a =
1c590 20 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   1;.    **      
1c5a0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
1c5b0 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57   b, c FROM tbl W
1c5c0 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20  HERE a = 1;.    
1c5d0 2a 2f 0a 20 20 20 20 69 6e 74 20 62 49 6e 45 73  */.    int bInEs
1c5e0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1c5f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c600 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e  "x IN (SELECT...
1c610 29 22 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69  )" seen */.    i
1c620 6e 74 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b 20 20  nt nInMul = 1;  
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c640 4e 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e  Number of distin
1c650 63 74 20 65 71 75 61 6c 69 74 69 65 73 20 74 6f  ct equalities to
1c660 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 64   lookup */.    d
1c670 6f 75 62 6c 65 20 72 61 6e 67 65 44 69 76 20 3d  ouble rangeDiv =
1c680 20 28 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a 20   (double)1;  /* 
1c690 45 73 74 69 6d 61 74 65 64 20 72 65 64 75 63 74  Estimated reduct
1c6a0 69 6f 6e 20 69 6e 20 73 65 61 72 63 68 20 73 70  ion in search sp
1c6b0 61 63 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ace */.    int n
1c6c0 42 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20  Bound = 0;      
1c6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c6e0 65 72 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  er of range cons
1c6f0 74 72 61 69 6e 74 73 20 73 65 65 6e 20 2a 2f 0a  traints seen */.
1c700 20 20 20 20 69 6e 74 20 62 53 6f 72 74 3b 20 20      int bSort;  
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c720 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 78 74    /* True if ext
1c730 65 72 6e 61 6c 20 73 6f 72 74 20 72 65 71 75 69  ernal sort requi
1c740 72 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  red */.    int b
1c750 44 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Dist;           
1c760 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c770 20 69 66 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74   if index cannot
1c780 20 68 65 6c 70 20 77 69 74 68 20 44 49 53 54 49   help with DISTI
1c790 4e 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  NCT */.    int b
1c7a0 4c 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20 20 20  Lookup = 0;     
1c7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c7c0 20 69 66 20 6e 6f 74 20 61 20 63 6f 76 65 72 69   if not a coveri
1c7d0 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
1c7e0 69 6e 74 20 6e 50 72 69 6f 72 53 61 74 3b 20 20  int nPriorSat;  
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c800 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1c810 73 61 74 69 73 66 69 65 64 20 62 79 20 6f 75 74  satisfied by out
1c820 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  er loops */.    
1c830 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c850 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
1c860 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20   BY terms */.   
1c870 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1c880 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
1c890 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
1c8a0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1c8b0 75 73 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  use */.#ifdef SQ
1c8c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1c8d0 33 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  3.    WhereTerm 
1c8e0 2a 70 46 69 72 73 74 54 65 72 6d 20 3d 20 30 3b  *pFirstTerm = 0;
1c8f0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72      /* First ter
1c900 6d 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 69  m matching the i
1c910 6e 64 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ndex */.#endif..
1c920 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
1c930 0a 20 20 20 20 20 20 22 20 20 20 25 73 28 25 73  .      "   %s(%s
1c940 29 3a 5c 6e 22 2c 0a 20 20 20 20 20 20 70 53 72  ):\n",.      pSr
1c950 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  c->pTab->zName, 
1c960 28 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e  (pIdx ? pIdx->zN
1c970 61 6d 65 20 3a 20 22 69 70 6b 22 29 0a 20 20 20  ame : "ipk").   
1c980 20 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28   ));.    memset(
1c990 26 70 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  &pc, 0, sizeof(p
1c9a0 63 29 29 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42  c));.    nOrderB
1c9b0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  y = p->pOrderBy 
1c9c0 3f 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ? p->pOrderBy->n
1c9d0 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 69 66  Expr : 0;.    if
1c9e0 28 20 70 2d 3e 69 20 29 7b 0a 20 20 20 20 20 20  ( p->i ){.      
1c9f0 6e 50 72 69 6f 72 53 61 74 20 3d 20 70 63 2e 70  nPriorSat = pc.p
1ca00 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 70 2d 3e  lan.nOBSat = p->
1ca10 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70  aLevel[p->i-1].p
1ca20 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  lan.nOBSat;.    
1ca30 20 20 62 53 6f 72 74 20 3d 20 6e 50 72 69 6f 72    bSort = nPrior
1ca40 53 61 74 3c 6e 4f 72 64 65 72 42 79 3b 0a 20 20  Sat<nOrderBy;.  
1ca50 20 20 20 20 62 44 69 73 74 20 3d 20 30 3b 0a 20      bDist = 0;. 
1ca60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ca70 6e 50 72 69 6f 72 53 61 74 20 3d 20 70 63 2e 70  nPriorSat = pc.p
1ca80 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a  lan.nOBSat = 0;.
1ca90 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20 6e 4f        bSort = nO
1caa0 72 64 65 72 42 79 3e 30 3b 0a 20 20 20 20 20 20  rderBy>0;.      
1cab0 62 44 69 73 74 20 3d 20 70 2d 3e 70 44 69 73 74  bDist = p->pDist
1cac0 69 6e 63 74 21 3d 30 3b 0a 20 20 20 20 7d 0a 0a  inct!=0;.    }..
1cad0 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65      /* Determine
1cae0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70   the values of p
1caf0 63 2e 70 6c 61 6e 2e 6e 45 71 20 61 6e 64 20 6e  c.plan.nEq and n
1cb00 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20 66 6f 72  InMul */.    for
1cb10 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d 30 3b 20  (pc.plan.nEq=0; 
1cb20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3c 70 50 72 6f  pc.plan.nEq<pPro
1cb30 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 70 63 2e  be->nColumn; pc.
1cb40 70 6c 61 6e 2e 6e 45 71 2b 2b 29 7b 0a 20 20 20  plan.nEq++){.   
1cb50 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62     int j = pProb
1cb60 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 63 2e 70  e->aiColumn[pc.p
1cb70 6c 61 6e 2e 6e 45 71 5d 3b 0a 20 20 20 20 20 20  lan.nEq];.      
1cb80 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
1cb90 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70  (pWC, iCur, j, p
1cba0 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65  ->notReady, eqTe
1cbb0 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20  rmMask, pIdx);. 
1cbc0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
1cbd0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
1cbe0 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73   pc.plan.wsFlags
1cbf0 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d   |= (WHERE_COLUM
1cc00 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  N_EQ|WHERE_ROWID
1cc10 5f 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _EQ);.      test
1cc20 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 57 43  case( pTerm->pWC
1cc30 21 3d 70 57 43 20 29 3b 0a 20 20 20 20 20 20 69  !=pWC );.      i
1cc40 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1cc50 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  tor & WO_IN ){. 
1cc60 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
1cc70 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
1cc80 72 3b 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c  r;.        pc.pl
1cc90 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1cca0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
1ccb0 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
1ccc0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ccd0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1cce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1ccf0 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  "x IN (SELECT ..
1cd00 2e 29 22 3a 20 20 41 73 73 75 6d 65 20 74 68 65  .)":  Assume the
1cd10 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
1cd20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
1cd30 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 32       nInMul *= 2
1cd40 35 3b 0a 20 20 20 20 20 20 20 20 20 20 62 49 6e  5;.          bIn
1cd50 45 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Est = 1;.       
1cd60 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
1cd70 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
1cd80 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
1cd90 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
1cda0 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
1cdb0 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
1cdc0 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20  ...)" */.       
1cdd0 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 70 45 78     nInMul *= pEx
1cde0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
1cdf0 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
1ce00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
1ce10 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1ce20 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
1ce30 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
1ce40 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
1ce50 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
1ce60 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1ce70 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
1ce80 20 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e       if( pc.plan
1ce90 2e 6e 45 71 3d 3d 30 20 26 26 20 70 50 72 6f 62  .nEq==0 && pProb
1cea0 65 2d 3e 61 53 61 6d 70 6c 65 20 29 20 70 46 69  e->aSample ) pFi
1ceb0 72 73 74 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b  rstTerm = pTerm;
1cec0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 63  .#endif.      pc
1ced0 2e 75 73 65 64 20 7c 3d 20 70 54 65 72 6d 2d 3e  .used |= pTerm->
1cee0 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
1cef0 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 49 66 20 74   }. .    /* If t
1cf00 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63  he index being c
1cf10 6f 6e 73 69 64 65 72 65 64 20 69 73 20 55 4e 49  onsidered is UNI
1cf20 51 55 45 2c 20 61 6e 64 20 74 68 65 72 65 20 69  QUE, and there i
1cf30 73 20 61 6e 20 65 71 75 61 6c 69 74 79 20 0a 20  s an equality . 
1cf40 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1cf50 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   for all columns
1cf60 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74   in the index, t
1cf70 68 65 6e 20 74 68 69 73 20 73 65 61 72 63 68 20  hen this search 
1cf80 77 69 6c 6c 20 66 69 6e 64 0a 20 20 20 20 2a 2a  will find.    **
1cf90 20 61 74 20 6d 6f 73 74 20 61 20 73 69 6e 67 6c   at most a singl
1cfa0 65 20 72 6f 77 2e 20 49 6e 20 74 68 69 73 20 63  e row. In this c
1cfb0 61 73 65 20 73 65 74 20 74 68 65 20 57 48 45 52  ase set the WHER
1cfc0 45 5f 55 4e 49 51 55 45 20 66 6c 61 67 20 74 6f  E_UNIQUE flag to
1cfd0 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74   .    ** indicat
1cfe0 65 20 74 68 69 73 20 74 6f 20 74 68 65 20 63 61  e this to the ca
1cff0 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ller..    **.   
1d000 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
1d010 66 20 74 68 65 20 73 65 61 72 63 68 20 6d 61 79  f the search may
1d020 20 66 69 6e 64 20 6d 6f 72 65 20 74 68 61 6e 20   find more than 
1d030 6f 6e 65 20 72 6f 77 2c 20 74 65 73 74 20 74 6f  one row, test to
1d040 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74   see if.    ** t
1d050 68 65 72 65 20 69 73 20 61 20 72 61 6e 67 65 20  here is a range 
1d060 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 69 6e  constraint on in
1d070 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 28 70 63  dexed column (pc
1d080 2e 70 6c 61 6e 2e 6e 45 71 2b 31 29 20 74 68 61  .plan.nEq+1) tha
1d090 74 20 63 61 6e 20 62 65 20 0a 20 20 20 20 2a 2a  t can be .    **
1d0a0 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
1d0b0 20 74 68 65 20 69 6e 64 65 78 2e 20 0a 20 20 20   the index. .   
1d0c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 2e 70   */.    if( pc.p
1d0d0 6c 61 6e 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  lan.nEq==pProbe-
1d0e0 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 50 72 6f  >nColumn && pPro
1d0f0 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  be->onError!=OE_
1d100 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 74 65  None ){.      te
1d110 73 74 63 61 73 65 28 20 70 63 2e 70 6c 61 6e 2e  stcase( pc.plan.
1d120 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1d130 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20  COLUMN_IN );.   
1d140 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2e     testcase( pc.
1d150 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1d160 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
1d170 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
1d180 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  c.plan.wsFlags &
1d190 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49   (WHERE_COLUMN_I
1d1a0 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  N|WHERE_COLUMN_N
1d1b0 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ULL))==0 ){.    
1d1c0 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
1d1d0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49  ags |= WHERE_UNI
1d1e0 51 55 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  QUE;.        if(
1d1f0 20 70 2d 3e 69 3d 3d 30 20 7c 7c 20 28 70 2d 3e   p->i==0 || (p->
1d200 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70  aLevel[p->i-1].p
1d210 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1d220 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29 21  ERE_ALL_UNIQUE)!
1d230 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1d240 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
1d250 7c 3d 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49  |= WHERE_ALL_UNI
1d260 51 55 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  QUE;.        }. 
1d270 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1d280 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
1d290 6f 72 64 65 72 65 64 3d 3d 30 20 29 7b 0a 20 20  ordered==0 ){.  
1d2a0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
1d2b0 20 6a 20 3d 20 28 70 63 2e 70 6c 61 6e 2e 6e 45   j = (pc.plan.nE
1d2c0 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q==pProbe->nColu
1d2d0 6d 6e 20 3f 20 2d 31 20 3a 20 70 50 72 6f 62 65  mn ? -1 : pProbe
1d2e0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 63 2e 70 6c  ->aiColumn[pc.pl
1d2f0 61 6e 2e 6e 45 71 5d 29 3b 0a 20 20 20 20 20 20  an.nEq]);.      
1d300 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
1d310 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f  , iCur, j, p->no
1d320 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
1d330 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  _LE|WO_GT|WO_GE,
1d340 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
1d350 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f    WhereTerm *pTo
1d360 70 2c 20 2a 70 42 74 6d 3b 0a 20 20 20 20 20 20  p, *pBtm;.      
1d370 20 20 70 54 6f 70 20 3d 20 66 69 6e 64 54 65 72    pTop = findTer
1d380 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
1d390 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  p->notReady, WO_
1d3a0 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78 29 3b  LT|WO_LE, pIdx);
1d3b0 0a 20 20 20 20 20 20 20 20 70 42 74 6d 20 3d 20  .        pBtm = 
1d3c0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1d3d0 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61  ur, j, p->notRea
1d3e0 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
1d3f0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
1d400 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
1d410 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65  t(pParse, pProbe
1d420 2c 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 2c 20 70  , pc.plan.nEq, p
1d430 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72 61 6e 67  Btm, pTop, &rang
1d440 65 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69  eDiv);.        i
1d450 66 28 20 70 54 6f 70 20 29 7b 0a 20 20 20 20 20  f( pTop ){.     
1d460 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d 20 31 3b       nBound = 1;
1d470 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c  .          pc.pl
1d480 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1d490 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
1d4a0 20 20 20 20 20 20 20 20 20 70 63 2e 75 73 65 64           pc.used
1d4b0 20 7c 3d 20 70 54 6f 70 2d 3e 70 72 65 72 65 71   |= pTop->prereq
1d4c0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
1d4d0 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 70 2d   testcase( pTop-
1d4e0 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20  >pWC!=pWC );.   
1d4f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1d500 66 28 20 70 42 74 6d 20 29 7b 0a 20 20 20 20 20  f( pBtm ){.     
1d510 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b 0a 20       nBound++;. 
1d520 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e           pc.plan
1d530 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1d540 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
1d550 20 20 20 20 20 20 20 70 63 2e 75 73 65 64 20 7c         pc.used |
1d560 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65 71 52 69  = pBtm->prereqRi
1d570 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74  ght;.          t
1d580 65 73 74 63 61 73 65 28 20 70 42 74 6d 2d 3e 70  estcase( pBtm->p
1d590 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20 20 20  WC!=pWC );.     
1d5a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 63 2e     }.        pc.
1d5b0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
1d5c0 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
1d5d0 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  NGE|WHERE_ROWID_
1d5e0 52 41 4e 47 45 29 3b 0a 20 20 20 20 20 20 7d 0a  RANGE);.      }.
1d5f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1d600 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1d610 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
1d620 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1d630 20 63 6f 6e 73 69 64 65 72 65 64 20 77 69 6c 6c   considered will
1d640 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72 61 6c 6c  .    ** naturall
1d650 79 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 74  y scan rows in t
1d660 68 65 20 72 65 71 75 69 72 65 64 20 6f 72 64 65  he required orde
1d670 72 2c 20 73 65 74 20 74 68 65 20 61 70 70 72 6f  r, set the appro
1d680 70 72 69 61 74 65 20 66 6c 61 67 73 0a 20 20 20  priate flags.   
1d690 20 2a 2a 20 69 6e 20 70 63 2e 70 6c 61 6e 2e 77   ** in pc.plan.w
1d6a0 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73  sFlags. Otherwis
1d6b0 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  e, if there is a
1d6c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1d6d0 65 20 62 75 74 0a 20 20 20 20 2a 2a 20 74 68 65  e but.    ** the
1d6e0 20 69 6e 64 65 78 20 77 69 6c 6c 20 73 63 61 6e   index will scan
1d6f0 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66 66 65   rows in a diffe
1d700 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65 74 20  rent order, set 
1d710 74 68 65 20 62 53 6f 72 74 0a 20 20 20 20 2a 2a  the bSort.    **
1d720 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20   variable.  */. 
1d730 20 20 20 69 66 28 20 62 53 6f 72 74 20 26 26 20     if( bSort && 
1d740 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20  (pSrc->jointype 
1d750 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 7b  & JT_LEFT)==0 ){
1d760 0a 20 20 20 20 20 20 69 6e 74 20 62 52 65 76 20  .      int bRev 
1d770 3d 20 32 3b 0a 20 20 20 20 20 20 57 48 45 52 45  = 2;.      WHERE
1d780 54 52 41 43 45 28 28 22 20 20 20 20 20 20 2d 2d  TRACE(("      --
1d790 3e 20 62 65 66 6f 72 65 20 69 73 53 6f 72 74 69  > before isSorti
1d7a0 6e 67 49 6e 64 65 78 3a 20 6e 50 72 69 6f 72 53  ngIndex: nPriorS
1d7b0 61 74 3d 25 64 5c 6e 22 2c 6e 50 72 69 6f 72 53  at=%d\n",nPriorS
1d7c0 61 74 29 29 3b 0a 20 20 20 20 20 20 70 63 2e 70  at));.      pc.p
1d7d0 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 69 73 53  lan.nOBSat = isS
1d7e0 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 2c 20 70  ortingIndex(p, p
1d7f0 50 72 6f 62 65 2c 20 69 43 75 72 2c 20 26 62 52  Probe, iCur, &bR
1d800 65 76 29 3b 0a 20 20 20 20 20 20 57 48 45 52 45  ev);.      WHERE
1d810 54 52 41 43 45 28 28 22 20 20 20 20 20 20 2d 2d  TRACE(("      --
1d820 3e 20 61 66 74 65 72 20 20 69 73 53 6f 72 74 69  > after  isSorti
1d830 6e 67 49 6e 64 65 78 3a 20 62 52 65 76 3d 25 64  ngIndex: bRev=%d
1d840 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c 0a 20   nOBSat=%d\n",. 
1d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d860 20 62 52 65 76 2c 20 70 63 2e 70 6c 61 6e 2e 6e   bRev, pc.plan.n
1d870 4f 42 53 61 74 29 29 3b 0a 20 20 20 20 20 20 69  OBSat));.      i
1d880 66 28 20 6e 50 72 69 6f 72 53 61 74 3c 70 63 2e  f( nPriorSat<pc.
1d890 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 7c 7c 20 28  plan.nOBSat || (
1d8a0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
1d8b0 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
1d8c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63  =0 ){.        pc
1d8d0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
1d8e0 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 3b 0a   WHERE_ORDERED;.
1d8f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d900 28 20 6e 4f 72 64 65 72 42 79 3d 3d 70 63 2e 70  ( nOrderBy==pc.p
1d910 6c 61 6e 2e 6e 4f 42 53 61 74 20 29 7b 0a 20 20  lan.nOBSat ){.  
1d920 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20 30 3b        bSort = 0;
1d930 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  .        pc.plan
1d940 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1d950 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48  E_ROWID_RANGE|WH
1d960 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1d970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d980 69 66 28 20 62 52 65 76 20 26 20 31 20 29 20 70  if( bRev & 1 ) p
1d990 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1d9a0 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b  = WHERE_REVERSE;
1d9b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1d9c0 66 20 74 68 65 72 65 20 69 73 20 61 20 44 49 53  f there is a DIS
1d9d0 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
1d9e0 61 6e 64 20 74 68 69 73 20 69 6e 64 65 78 20 77  and this index w
1d9f0 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e  ill scan rows in
1da00 0a 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 6f 66  .    ** order of
1da10 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   the DISTINCT ex
1da20 70 72 65 73 73 69 6f 6e 73 2c 20 63 6c 65 61 72  pressions, clear
1da30 20 62 44 69 73 74 20 61 6e 64 20 73 65 74 20 74   bDist and set t
1da40 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20  he appropriate. 
1da50 20 20 20 2a 2a 20 66 6c 61 67 73 20 69 6e 20 70     ** flags in p
1da60 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2e 20  c.plan.wsFlags. 
1da70 2a 2f 0a 20 20 20 20 69 66 28 20 62 44 69 73 74  */.    if( bDist
1da80 0a 20 20 20 20 20 26 26 20 69 73 44 69 73 74 69  .     && isDisti
1da90 6e 63 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  nctIndex(pParse,
1daa0 20 70 57 43 2c 20 70 50 72 6f 62 65 2c 20 69 43   pWC, pProbe, iC
1dab0 75 72 2c 20 70 2d 3e 70 44 69 73 74 69 6e 63 74  ur, p->pDistinct
1dac0 2c 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 29 0a 20  , pc.plan.nEq). 
1dad0 20 20 20 20 26 26 20 28 70 63 2e 70 6c 61 6e 2e      && (pc.plan.
1dae0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1daf0 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20  COLUMN_IN)==0.  
1db00 20 20 29 7b 0a 20 20 20 20 20 20 62 44 69 73 74    ){.      bDist
1db10 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 63 2e 70   = 0;.      pc.p
1db20 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
1db30 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1db40 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  |WHERE_COLUMN_RA
1db50 4e 47 45 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  NGE|WHERE_DISTIN
1db60 43 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CT;.    }..    /
1db70 2a 20 49 66 20 63 75 72 72 65 6e 74 6c 79 20 63  * If currently c
1db80 61 6c 63 75 6c 61 74 69 6e 67 20 74 68 65 20 63  alculating the c
1db90 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 61 6e 20  ost of using an 
1dba0 69 6e 64 65 78 20 28 6e 6f 74 20 74 68 65 20 49  index (not the I
1dbb0 50 4b 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 29  PK.    ** index)
1dbc0 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  , determine if a
1dbd0 6c 6c 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  ll required colu
1dbe0 6d 6e 20 64 61 74 61 20 6d 61 79 20 62 65 20 6f  mn data may be o
1dbf0 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20  btained without 
1dc00 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
1dc10 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 28 69 2e  e main table (i.
1dc20 65 2e 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  e. if the index 
1dc30 69 73 20 61 20 63 6f 76 65 72 69 6e 67 0a 20 20  is a covering.  
1dc40 20 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74    ** index for t
1dc50 68 69 73 20 71 75 65 72 79 29 2e 20 49 66 20 69  his query). If i
1dc60 74 20 69 73 2c 20 73 65 74 20 74 68 65 20 57 48  t is, set the WH
1dc70 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c 61  ERE_IDX_ONLY fla
1dc80 67 20 69 6e 0a 20 20 20 20 2a 2a 20 70 63 2e 70  g in.    ** pc.p
1dc90 6c 61 6e 2e 77 73 46 6c 61 67 73 2e 20 4f 74 68  lan.wsFlags. Oth
1dca0 65 72 77 69 73 65 2c 20 73 65 74 20 74 68 65 20  erwise, set the 
1dcb0 62 4c 6f 6f 6b 75 70 20 76 61 72 69 61 62 6c 65  bLookup variable
1dcc0 20 74 6f 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20   to true.  */.  
1dcd0 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
1dce0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
1dcf0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  pSrc->colUsed;. 
1dd00 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1dd10 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
1dd20 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
1dd30 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
1dd40 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
1dd50 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
1dd60 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20   x<BMS-1 ){.    
1dd70 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42        m &= ~(((B
1dd80 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20  itmask)1)<<x);. 
1dd90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dda0 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20  .      if( m==0 
1ddb0 29 7b 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c  ){.        pc.pl
1ddc0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1ddd0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
1dde0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ddf0 20 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a     bLookup = 1;.
1de00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1de10 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 45 73 74     /*.    ** Est
1de20 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
1de30 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74 70   of rows of outp
1de40 75 74 2e 20 20 46 6f 72 20 61 6e 20 22 78 20 49  ut.  For an "x I
1de50 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22 0a 20  N (SELECT...)". 
1de60 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1de70 2c 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  , do not let the
1de80 20 65 73 74 69 6d 61 74 65 20 65 78 63 65 65 64   estimate exceed
1de90 20 68 61 6c 66 20 74 68 65 20 72 6f 77 73 20 69   half the rows i
1dea0 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  n the table..   
1deb0 20 2a 2f 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e   */.    pc.plan.
1dec0 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 28  nRow = (double)(
1ded0 61 69 52 6f 77 45 73 74 5b 70 63 2e 70 6c 61 6e  aiRowEst[pc.plan
1dee0 2e 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b  .nEq] * nInMul);
1def0 0a 20 20 20 20 69 66 28 20 62 49 6e 45 73 74 20  .    if( bInEst 
1df00 26 26 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a  && pc.plan.nRow*
1df10 32 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 7b  2>aiRowEst[0] ){
1df20 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e  .      pc.plan.n
1df30 52 6f 77 20 3d 20 61 69 52 6f 77 45 73 74 5b 30  Row = aiRowEst[0
1df40 5d 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75  ]/2;.      nInMu
1df50 6c 20 3d 20 28 69 6e 74 29 28 70 63 2e 70 6c 61  l = (int)(pc.pla
1df60 6e 2e 6e 52 6f 77 20 2f 20 61 69 52 6f 77 45 73  n.nRow / aiRowEs
1df70 74 5b 70 63 2e 70 6c 61 6e 2e 6e 45 71 5d 29 3b  t[pc.plan.nEq]);
1df80 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
1df90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1dfa0 54 33 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  T3.    /* If the
1dfb0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f   constraint is o
1dfc0 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 56 41 4c  f the form x=VAL
1dfd0 55 45 20 6f 72 20 78 20 49 4e 20 28 45 31 2c 45  UE or x IN (E1,E
1dfe0 32 2c 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 61 6e  2,...).    ** an
1dff0 64 20 77 65 20 64 6f 20 6e 6f 74 20 74 68 69 6e  d we do not thin
1e000 6b 20 74 68 61 74 20 76 61 6c 75 65 73 20 6f 66  k that values of
1e010 20 78 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e   x are unique an
1e020 64 20 69 66 20 68 69 73 74 6f 67 72 61 6d 0a 20  d if histogram. 
1e030 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76     ** data is av
1e040 61 69 6c 61 62 6c 65 20 66 6f 72 20 63 6f 6c 75  ailable for colu
1e050 6d 6e 20 78 2c 20 74 68 65 6e 20 69 74 20 6d 69  mn x, then it mi
1e060 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  ght be possible.
1e070 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20 61 20      ** to get a 
1e080 62 65 74 74 65 72 20 65 73 74 69 6d 61 74 65 20  better estimate 
1e090 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
1e0a0 20 72 6f 77 73 20 62 61 73 65 64 20 6f 6e 0a 20   rows based on. 
1e0b0 20 20 20 2a 2a 20 56 41 4c 55 45 20 61 6e 64 20     ** VALUE and 
1e0c0 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20  how common that 
1e0d0 76 61 6c 75 65 20 69 73 20 61 63 63 6f 72 64 69  value is accordi
1e0e0 6e 67 20 74 6f 20 74 68 65 20 68 69 73 74 6f 67  ng to the histog
1e0f0 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ram..    */.    
1e100 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77  if( pc.plan.nRow
1e110 3e 28 64 6f 75 62 6c 65 29 31 20 26 26 20 70 63  >(double)1 && pc
1e120 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 31 0a 20 20 20  .plan.nEq==1.   
1e130 20 20 26 26 20 70 46 69 72 73 74 54 65 72 6d 21    && pFirstTerm!
1e140 3d 30 20 26 26 20 61 69 52 6f 77 45 73 74 5b 31  =0 && aiRowEst[1
1e150 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ]>1 ){.      ass
1e160 65 72 74 28 20 28 70 46 69 72 73 74 54 65 72 6d  ert( (pFirstTerm
1e170 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1e180 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57  O_EQ|WO_ISNULL|W
1e190 4f 5f 49 4e 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_IN))!=0 );.   
1e1a0 20 20 20 69 66 28 20 70 46 69 72 73 74 54 65 72     if( pFirstTer
1e1b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
1e1c0 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
1e1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1e1e0 63 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d  case( pFirstTerm
1e1f0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
1e200 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  EQ );.        te
1e210 73 74 63 61 73 65 28 20 70 46 69 72 73 74 54 65  stcase( pFirstTe
1e220 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
1e230 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
1e240 20 20 20 20 77 68 65 72 65 45 71 75 61 6c 53 63      whereEqualSc
1e250 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50  anEst(pParse, pP
1e260 72 6f 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d  robe, pFirstTerm
1e270 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
1e280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e290 20 20 20 20 20 20 20 20 20 20 20 26 70 63 2e 70             &pc.p
1e2a0 6c 61 6e 2e 6e 52 6f 77 29 3b 0a 20 20 20 20 20  lan.nRow);.     
1e2b0 20 7d 65 6c 73 65 20 69 66 28 20 62 49 6e 45 73   }else if( bInEs
1e2c0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1e2d0 61 73 73 65 72 74 28 20 70 46 69 72 73 74 54 65  assert( pFirstTe
1e2e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
1e2f0 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IN );.        
1e300 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
1e310 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70  Parse, pProbe, p
1e320 46 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70 72  FirstTerm->pExpr
1e330 2d 3e 78 2e 70 4c 69 73 74 2c 0a 20 20 20 20 20  ->x.pList,.     
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e350 20 20 26 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29    &pc.plan.nRow)
1e360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e370 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1e380 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f  _ENABLE_STAT3 */
1e390 0a 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20  ..    /* Adjust 
1e3a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
1e3b0 74 70 75 74 20 72 6f 77 73 20 61 6e 64 20 64 6f  tput rows and do
1e3c0 77 6e 77 61 72 64 20 74 6f 20 72 65 66 6c 65 63  wnward to reflec
1e3d0 74 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68  t rows.    ** th
1e3e0 61 74 20 61 72 65 20 65 78 63 6c 75 64 65 64 20  at are excluded 
1e3f0 62 79 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  by range constra
1e400 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ints..    */.   
1e410 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20   pc.plan.nRow = 
1e420 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2f 72 61 6e  pc.plan.nRow/ran
1e430 67 65 44 69 76 3b 0a 20 20 20 20 69 66 28 20 70  geDiv;.    if( p
1e440 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 31 20 29 20  c.plan.nRow<1 ) 
1e450 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 31  pc.plan.nRow = 1
1e460 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 70 65 72 69  ;..    /* Experi
1e470 6d 65 6e 74 73 20 72 75 6e 20 6f 6e 20 72 65 61  ments run on rea
1e480 6c 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  l SQLite databas
1e490 65 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  es show that the
1e4a0 20 74 69 6d 65 20 6e 65 65 64 65 64 0a 20 20 20   time needed.   
1e4b0 20 2a 2a 20 74 6f 20 64 6f 20 61 20 62 69 6e 61   ** to do a bina
1e4c0 72 79 20 73 65 61 72 63 68 20 74 6f 20 6c 6f 63  ry search to loc
1e4d0 61 74 65 20 61 20 72 6f 77 20 69 6e 20 61 20 74  ate a row in a t
1e4e0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
1e4f0 20 72 6f 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20   roughly.    ** 
1e500 6c 6f 67 31 30 28 4e 29 20 74 69 6d 65 73 20 74  log10(N) times t
1e510 68 65 20 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20  he time to move 
1e520 66 72 6f 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20  from one row to 
1e530 74 68 65 20 6e 65 78 74 20 72 6f 77 20 77 69 74  the next row wit
1e540 68 69 6e 0a 20 20 20 20 2a 2a 20 61 20 74 61 62  hin.    ** a tab
1e550 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68  le or index.  Th
1e560 65 20 61 63 74 75 61 6c 20 74 69 6d 65 73 20 63  e actual times c
1e570 61 6e 20 76 61 72 79 2c 20 77 69 74 68 20 74 68  an vary, with th
1e580 65 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a  e size of.    **
1e590 20 72 65 63 6f 72 64 73 20 62 65 69 6e 67 20 61   records being a
1e5a0 6e 20 69 6d 70 6f 72 74 61 6e 74 20 66 61 63 74  n important fact
1e5b0 6f 72 2e 20 20 42 6f 74 68 20 6d 6f 76 65 73 20  or.  Both moves 
1e5c0 61 6e 64 20 73 65 61 72 63 68 65 73 20 61 72 65  and searches are
1e5d0 0a 20 20 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77  .    ** slower w
1e5e0 69 74 68 20 6c 61 72 67 65 72 20 72 65 63 6f 72  ith larger recor
1e5f0 64 73 2c 20 70 72 65 73 75 6d 61 62 6c 79 20 62  ds, presumably b
1e600 65 63 61 75 73 65 20 66 65 77 65 72 20 72 65 63  ecause fewer rec
1e610 6f 72 64 73 20 66 69 74 0a 20 20 20 20 2a 2a 20  ords fit.    ** 
1e620 6f 6e 20 6f 6e 65 20 70 61 67 65 20 61 6e 64 20  on one page and 
1e630 68 65 6e 63 65 20 6d 6f 72 65 20 70 61 67 65 73  hence more pages
1e640 20 68 61 76 65 20 74 6f 20 62 65 20 66 65 74 63   have to be fetc
1e650 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  hed..    **.    
1e660 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63  ** The ANALYZE c
1e670 6f 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 73  ommand and the s
1e680 71 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20  qlite_stat1 and 
1e690 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62  sqlite_stat3 tab
1e6a0 6c 65 73 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  les do.    ** no
1e6b0 74 20 67 69 76 65 20 75 73 20 64 61 74 61 20 6f  t give us data o
1e6c0 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73  n the relative s
1e6d0 69 7a 65 73 20 6f 66 20 74 61 62 6c 65 20 61 6e  izes of table an
1e6e0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
1e6f0 0a 20 20 20 20 2a 2a 20 53 6f 20 74 68 69 73 20  .    ** So this 
1e700 63 6f 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 75  computation assu
1e710 6d 65 73 20 74 61 62 6c 65 20 72 65 63 6f 72 64  mes table record
1e720 73 20 61 72 65 20 61 62 6f 75 74 20 74 77 69 63  s are about twic
1e730 65 20 61 73 20 62 69 67 0a 20 20 20 20 2a 2a 20  e as big.    ** 
1e740 61 73 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  as index records
1e750 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e760 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  (pc.plan.wsFlags
1e770 26 7e 28 57 48 45 52 45 5f 52 45 56 45 52 53 45  &~(WHERE_REVERSE
1e780 7c 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 29  |WHERE_ORDERED))
1e790 3d 3d 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  ==WHERE_IDX_ONLY
1e7a0 0a 20 20 20 20 20 26 26 20 28 70 57 43 2d 3e 77  .     && (pWC->w
1e7b0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1e7c0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
1e7d0 44 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71  D)==0.     && sq
1e7e0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e7f0 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 26  g.bUseCis.     &
1e800 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
1e810 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
1e820 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64  , SQLITE_CoverId
1e830 78 53 63 61 6e 29 0a 20 20 20 20 29 7b 0a 20 20  xScan).    ){.  
1e840 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
1e850 78 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20  x is not useful 
1e860 66 6f 72 20 69 6e 64 65 78 69 6e 67 2c 20 62 75  for indexing, bu
1e870 74 20 69 74 20 69 73 20 61 20 63 6f 76 65 72 69  t it is a coveri
1e880 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ng index..      
1e890 2a 2a 20 41 20 66 75 6c 6c 2d 73 63 61 6e 20 6f  ** A full-scan o
1e8a0 66 20 74 68 65 20 69 6e 64 65 78 20 6d 69 67 68  f the index migh
1e8b0 74 20 62 65 20 61 20 6c 69 74 74 6c 65 20 66 61  t be a little fa
1e8c0 73 74 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c  ster than a full
1e8d0 2d 73 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  -scan.      ** o
1e8e0 66 20 74 68 65 20 74 61 62 6c 65 2c 20 73 6f 20  f the table, so 
1e8f0 67 69 76 65 20 74 68 69 73 20 63 61 73 65 20 61  give this case a
1e900 20 63 6f 73 74 20 73 6c 69 67 68 74 6c 79 20 6c   cost slightly l
1e910 65 73 73 20 74 68 61 6e 20 61 20 74 61 62 6c 65  ess than a table
1e920 0a 20 20 20 20 20 20 2a 2a 20 73 63 61 6e 2e 20  .      ** scan. 
1e930 2a 2f 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73  */.      pc.rCos
1e940 74 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a  t = aiRowEst[0]*
1e950 33 20 2b 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  3 + pProbe->nCol
1e960 75 6d 6e 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c  umn;.      pc.pl
1e970 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1e980 45 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 7c 57  ERE_COVER_SCAN|W
1e990 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1e9a0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
1e9b0 20 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67   (pc.plan.wsFlag
1e9c0 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
1e9d0 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20  LLSCAN)==0 ){.  
1e9e0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
1e9f0 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
1ea00 73 63 61 6e 20 69 73 20 61 20 6e 75 6d 62 65 72  scan is a number
1ea10 20 6f 66 20 6d 6f 76 65 20 6f 70 65 72 61 74 69   of move operati
1ea20 6f 6e 73 20 65 71 75 61 6c 0a 20 20 20 20 20 20  ons equal.      
1ea30 2a 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ** to the number
1ea40 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1ea50 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  table..      **.
1ea60 20 20 20 20 20 20 2a 2a 20 57 65 20 61 64 64 20        ** We add 
1ea70 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 34 78  an additional 4x
1ea80 20 70 65 6e 61 6c 74 79 20 74 6f 20 66 75 6c 6c   penalty to full
1ea90 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 20 20 54   table scans.  T
1eaa0 68 69 73 20 63 61 75 73 65 73 0a 20 20 20 20 20  his causes.     
1eab0 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 66 75 6e   ** the cost fun
1eac0 63 74 69 6f 6e 20 74 6f 20 65 72 72 20 6f 6e 20  ction to err on 
1ead0 74 68 65 20 73 69 64 65 20 6f 66 20 63 68 6f 6f  the side of choo
1eae0 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f 76  sing an index ov
1eaf0 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f  er.      ** choo
1eb00 73 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e  sing a full scan
1eb10 2e 20 20 54 68 69 73 20 34 78 20 66 75 6c 6c 2d  .  This 4x full-
1eb20 73 63 61 6e 20 70 65 6e 61 6c 74 79 20 69 73 20  scan penalty is 
1eb30 61 6e 20 61 72 67 75 61 62 6c 65 0a 20 20 20 20  an arguable.    
1eb40 20 20 2a 2a 20 64 65 63 69 73 69 6f 6e 20 61 6e    ** decision an
1eb50 64 20 6f 6e 65 20 77 68 69 63 68 20 77 65 20 65  d one which we e
1eb60 78 70 65 63 74 20 74 6f 20 72 65 76 69 73 69 74  xpect to revisit
1eb70 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1eb80 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 74   But.      ** it
1eb90 20 73 65 65 6d 73 20 74 6f 20 62 65 20 77 6f 72   seems to be wor
1eba0 6b 69 6e 67 20 77 65 6c 6c 20 65 6e 6f 75 67 68  king well enough
1ebb0 20 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a   at the moment..
1ebc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
1ebd0 63 2e 72 43 6f 73 74 20 3d 20 61 69 52 6f 77 45  c.rCost = aiRowE
1ebe0 73 74 5b 30 5d 2a 34 3b 0a 20 20 20 20 20 20 70  st[0]*4;.      p
1ebf0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  c.plan.wsFlags &
1ec00 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
1ec10 59 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  Y;.      if( pId
1ec20 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63 2e  x ){.        pc.
1ec30 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20  plan.wsFlags &= 
1ec40 7e 57 48 45 52 45 5f 4f 52 44 45 52 45 44 3b 0a  ~WHERE_ORDERED;.
1ec50 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e          pc.plan.
1ec60 6e 4f 42 53 61 74 20 3d 20 6e 50 72 69 6f 72 53  nOBSat = nPriorS
1ec70 61 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  at;.      }.    
1ec80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67  }else{.      log
1ec90 31 30 4e 20 3d 20 65 73 74 4c 6f 67 28 61 69 52  10N = estLog(aiR
1eca0 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20  owEst[0]);.     
1ecb0 20 70 63 2e 72 43 6f 73 74 20 3d 20 70 63 2e 70   pc.rCost = pc.p
1ecc0 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  lan.nRow;.      
1ecd0 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
1ece0 20 20 20 20 69 66 28 20 62 4c 6f 6f 6b 75 70 20      if( bLookup 
1ecf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1ed00 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 6c 6f 6f  For an index loo
1ed10 6b 75 70 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  kup followed by 
1ed20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a  a table lookup:.
1ed30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
1ed40 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61  nInMul index sea
1ed50 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68  rches to find th
1ed60 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
1ed70 69 6e 64 65 78 20 72 61 6e 67 65 0a 20 20 20 20  index range.    
1ed80 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77        **  + nRow
1ed90 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74   steps through t
1eda0 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
1edb0 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74 61     **  + nRow ta
1edc0 62 6c 65 20 73 65 61 72 63 68 65 73 20 74 6f 20  ble searches to 
1edd0 6c 6f 6f 6b 75 70 20 74 68 65 20 74 61 62 6c 65  lookup the table
1ede0 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
1edf0 20 72 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20   rowid.         
1ee00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63   */.          pc
1ee10 2e 72 43 6f 73 74 20 2b 3d 20 28 6e 49 6e 4d 75  .rCost += (nInMu
1ee20 6c 20 2b 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77  l + pc.plan.nRow
1ee30 29 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20  )*log10N;.      
1ee40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ee50 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 76 65     /* For a cove
1ee60 72 69 6e 67 20 69 6e 64 65 78 3a 0a 20 20 20 20  ring index:.    
1ee70 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6e 49 6e        **     nIn
1ee80 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68  Mul index search
1ee90 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69  es to find the i
1eea0 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  nitial entry .  
1eeb0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 6e          **   + n
1eec0 52 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67  Row steps throug
1eed0 68 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  h the index.    
1eee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1eef0 20 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 6e     pc.rCost += n
1ef00 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20  InMul*log10N;.  
1ef10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1ef20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1ef30 46 6f 72 20 61 20 72 6f 77 69 64 20 70 72 69 6d  For a rowid prim
1ef40 61 72 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a  ary key lookup:.
1ef50 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49          **    nI
1ef60 6e 4d 75 6c 74 20 74 61 62 6c 65 20 73 65 61 72  nMult table sear
1ef70 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65  ches to find the
1ef80 20 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 66   initial entry f
1ef90 6f 72 20 65 61 63 68 20 72 61 6e 67 65 0a 20 20  or each range.  
1efa0 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77        **  + nRow
1efb0 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74   steps through t
1efc0 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20  he table.       
1efd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 63 2e 72   */.        pc.r
1efe0 43 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c  Cost += nInMul*l
1eff0 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  og10N;.      }. 
1f000 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
1f010 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65   in the estimate
1f020 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  d cost of sortin
1f030 67 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 41  g the result.  A
1f040 63 74 75 61 6c 20 65 78 70 65 72 69 6d 65 6e 74  ctual experiment
1f050 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 61 73 75 72  al.    ** measur
1f060 65 6d 65 6e 74 73 20 6f 66 20 73 6f 72 74 69 6e  ements of sortin
1f070 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e  g performance in
1f080 20 53 51 4c 69 74 65 20 73 68 6f 77 20 74 68 61   SQLite show tha
1f090 74 20 73 6f 72 74 69 6e 67 20 74 69 6d 65 0a 20  t sorting time. 
1f0a0 20 20 20 2a 2a 20 61 64 64 73 20 43 2a 4e 2a 6c     ** adds C*N*l
1f0b0 6f 67 31 30 28 4e 29 20 74 6f 20 74 68 65 20 63  og10(N) to the c
1f0c0 6f 73 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ost, where N is 
1f0d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1f0e0 77 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  ws to be .    **
1f0f0 20 73 6f 72 74 65 64 20 61 6e 64 20 43 20 69 73   sorted and C is
1f100 20 61 20 66 61 63 74 6f 72 20 62 65 74 77 65 65   a factor betwee
1f110 6e 20 31 2e 39 35 20 61 6e 64 20 34 2e 33 2e 20  n 1.95 and 4.3. 
1f120 20 57 65 20 77 69 6c 6c 20 73 70 6c 69 74 20 74   We will split t
1f130 68 65 0a 20 20 20 20 2a 2a 20 64 69 66 66 65 72  he.    ** differ
1f140 65 6e 63 65 20 61 6e 64 20 73 65 6c 65 63 74 20  ence and select 
1f150 43 20 6f 66 20 33 2e 30 2e 0a 20 20 20 20 2a 2f  C of 3.0..    */
1f160 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 29  .    if( bSort )
1f170 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6d  {.      double m
1f180 20 3d 20 65 73 74 4c 6f 67 28 70 63 2e 70 6c 61   = estLog(pc.pla
1f190 6e 2e 6e 52 6f 77 2a 28 6e 4f 72 64 65 72 42 79  n.nRow*(nOrderBy
1f1a0 20 2d 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61   - pc.plan.nOBSa
1f1b0 74 29 2f 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20  t)/nOrderBy);.  
1f1c0 20 20 20 20 6d 20 2a 3d 20 28 64 6f 75 62 6c 65      m *= (double
1f1d0 29 28 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  )(pc.plan.nOBSat
1f1e0 20 3f 20 32 20 3a 20 33 29 3b 0a 20 20 20 20 20   ? 2 : 3);.     
1f1f0 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 70 63 2e   pc.rCost += pc.
1f200 70 6c 61 6e 2e 6e 52 6f 77 2a 6d 3b 0a 20 20 20  plan.nRow*m;.   
1f210 20 7d 0a 20 20 20 20 69 66 28 20 62 44 69 73 74   }.    if( bDist
1f220 20 29 7b 0a 20 20 20 20 20 20 70 63 2e 72 43 6f   ){.      pc.rCo
1f230 73 74 20 2b 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52  st += pc.plan.nR
1f240 6f 77 2a 65 73 74 4c 6f 67 28 70 63 2e 70 6c 61  ow*estLog(pc.pla
1f250 6e 2e 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d  n.nRow)*3;.    }
1f260 0a 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74  ..    /**** Cost
1f270 20 6f 66 20 75 73 69 6e 67 20 74 68 69 73 20 69   of using this i
1f280 6e 64 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65  ndex has now bee
1f290 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f  n computed ****/
1f2a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1f2b0 65 20 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c  e are additional
1f2c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
1f2d0 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
1f2e0 63 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65  cannot.    ** be
1f2f0 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20 63   used with the c
1f300 75 72 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75  urrent index, bu
1f310 74 20 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f  t which might lo
1f320 77 65 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  wer the number. 
1f330 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20     ** of output 
1f340 72 6f 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65  rows, adjust the
1f350 20 6e 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f   nRow value acco
1f360 72 64 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f  rdingly.  This o
1f370 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74  nly .    ** matt
1f380 65 72 73 20 69 66 20 74 68 65 20 63 75 72 72 65  ers if the curre
1f390 6e 74 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  nt index is the 
1f3a0 6c 65 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f  least costly, so
1f3b0 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20   do not bother. 
1f3c0 20 20 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20     ** with this 
1f3d0 73 74 65 70 20 69 66 20 77 65 20 61 6c 72 65 61  step if we alrea
1f3e0 64 79 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64  dy know this ind
1f3f0 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  ex will not be c
1f400 68 6f 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c  hosen..    ** Al
1f410 73 6f 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65  so, never reduce
1f420 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20   the output row 
1f430 63 6f 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73  count below 2 us
1f440 69 6e 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20  ing this step.. 
1f450 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20     **.    ** It 
1f460 69 73 20 63 72 69 74 69 63 61 6c 20 74 68 61 74  is critical that
1f470 20 74 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61   the notValid ma
1f480 73 6b 20 62 65 20 75 73 65 64 20 68 65 72 65 20  sk be used here 
1f490 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
1f4a0 2a 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d  * the notReady m
1f4b0 61 73 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75  ask.  When compu
1f4c0 74 69 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c  ting an "optimal
1f4d0 22 20 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74  " index, the not
1f4e0 52 65 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73  Ready.    ** mas
1f4f0 6b 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65  k will only have
1f500 20 6f 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74   one bit set - t
1f510 68 65 20 62 69 74 20 66 6f 72 20 74 68 65 20 63  he bit for the c
1f520 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  urrent table..  
1f530 20 20 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69    ** The notVali
1f540 64 20 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f  d mask, on the o
1f550 74 68 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79  ther hand, alway
1f560 73 20 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73  s has all bits s
1f570 65 74 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61  et for.    ** ta
1f580 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f  bles that are no
1f590 74 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  t in outer loops
1f5a0 2e 20 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69  .  If notReady i
1f5b0 73 20 75 73 65 64 20 68 65 72 65 20 69 6e 73 74  s used here inst
1f5c0 65 61 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f  ead.    ** of no
1f5d0 74 56 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f  tValid, then a o
1f5e0 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61  ptimal index tha
1f5f0 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e  t depends on inn
1f600 65 72 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20  er joins loops. 
1f610 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73     ** might be s
1f620 65 6c 65 63 74 65 64 20 65 76 65 6e 20 77 68 65  elected even whe
1f630 6e 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  n there exists a
1f640 6e 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20  n optimal index 
1f650 74 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20  that has.    ** 
1f660 6e 6f 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e  no such dependen
1f670 63 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  cy..    */.    i
1f680 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e  f( pc.plan.nRow>
1f690 32 20 26 26 20 70 63 2e 72 43 6f 73 74 3c 3d 70  2 && pc.rCost<=p
1f6a0 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a  ->cost.rCost ){.
1f6b0 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1f6e0 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
1f6f0 6e 53 6b 69 70 45 71 20 3d 20 70 63 2e 70 6c 61  nSkipEq = pc.pla
1f700 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 4e 75 6d 62  n.nEq;   /* Numb
1f710 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61  er of == constra
1f720 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a  ints to skip */.
1f730 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 52        int nSkipR
1f740 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20  ange = nBound;  
1f750 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f760 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  < constraints to
1f770 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 42   skip */.      B
1f780 69 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b 20  itmask thisTab; 
1f790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1f7a0 69 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20 2a  itmap for pSrc *
1f7b0 2f 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61 62  /..      thisTab
1f7c0 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e   = getMask(pWC->
1f7d0 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
1f7e0 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
1f7f0 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e  =pWC->a, k=pWC->
1f800 6e 54 65 72 6d 3b 20 70 63 2e 70 6c 61 6e 2e 6e  nTerm; pc.plan.n
1f810 52 6f 77 3e 32 20 26 26 20 6b 3b 20 6b 2d 2d 2c  Row>2 && k; k--,
1f820 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
1f830 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
1f840 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1f850 54 55 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  TUAL ) continue;
1f860 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
1f870 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
1f880 20 70 2d 3e 6e 6f 74 56 61 6c 69 64 29 21 3d 74   p->notValid)!=t
1f890 68 69 73 54 61 62 20 29 20 63 6f 6e 74 69 6e 75  hisTab ) continu
1f8a0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
1f8b0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1f8c0 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57  & (WO_EQ|WO_IN|W
1f8d0 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  O_ISNULL) ){.   
1f8e0 20 20 20 20 20 20 20 69 66 28 20 6e 53 6b 69 70         if( nSkip
1f8f0 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Eq ){.          
1f900 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
1f910 66 69 72 73 74 20 70 63 2e 70 6c 61 6e 2e 6e 45  first pc.plan.nE
1f920 71 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68  q equality match
1f930 65 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64  es since the ind
1f940 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ex.            *
1f950 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63  * has already ac
1f960 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73  counted for thes
1f970 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1f980 20 6e 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20   nSkipEq--;.    
1f990 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
1f9b0 6d 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e  me each addition
1f9c0 61 6c 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63  al equality matc
1f9d0 68 20 72 65 64 75 63 65 73 20 74 68 65 20 72 65  h reduces the re
1f9e0 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20  sult.           
1f9f0 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20   ** set size by 
1fa00 61 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a  a factor of 10 *
1fa10 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 63  /.            pc
1fa20 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 31 30  .plan.nRow /= 10
1fa30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1fa40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1fa50 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1fa60 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c   & (WO_LT|WO_LE|
1fa70 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a  WO_GT|WO_GE) ){.
1fa80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53            if( nS
1fa90 6b 69 70 52 61 6e 67 65 20 29 7b 0a 20 20 20 20  kipRange ){.    
1faa0 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
1fab0 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  e the first nSki
1fac0 70 52 61 6e 67 65 20 72 61 6e 67 65 20 63 6f 6e  pRange range con
1fad0 73 74 72 61 69 6e 74 73 20 73 69 6e 63 65 20 74  straints since t
1fae0 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
1faf0 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65       ** has alre
1fb00 61 64 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f  ady accounted fo
1fb10 72 20 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20  r these */.     
1fb20 20 20 20 20 20 20 20 6e 53 6b 69 70 52 61 6e 67         nSkipRang
1fb30 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  e--;.          }
1fb40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fb50 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63 68    /* Assume each
1fb60 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 61 6e 67   additional rang
1fb70 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64  e constraint red
1fb80 75 63 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  uces the result.
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1fba0 65 74 20 73 69 7a 65 20 62 79 20 61 20 66 61 63  et size by a fac
1fbb0 74 6f 72 20 6f 66 20 33 2e 20 20 49 6e 64 65 78  tor of 3.  Index
1fbc0 65 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ed range constra
1fbd0 69 6e 74 73 20 72 65 64 75 63 65 0a 20 20 20 20  ints reduce.    
1fbe0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
1fbf0 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61  earch space by a
1fc00 20 6c 61 72 67 65 72 20 66 61 63 74 6f 72 3a 20   larger factor: 
1fc10 34 2e 20 20 57 65 20 6d 61 6b 65 20 69 6e 64 65  4.  We make inde
1fc20 78 65 64 20 72 61 6e 67 65 0a 20 20 20 20 20 20  xed range.      
1fc30 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 73 65        ** more se
1fc40 6c 65 63 74 69 76 65 20 69 6e 74 65 6e 74 69 6f  lective intentio
1fc50 6e 61 6c 6c 79 20 62 65 63 61 75 73 65 20 6f 66  nally because of
1fc60 20 74 68 65 20 73 75 62 6a 65 63 74 69 76 65 20   the subjective 
1fc70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1fc80 6f 62 73 65 72 76 61 74 69 6f 6e 20 74 68 61 74  observation that
1fc90 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63   indexed range c
1fca0 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 61 6c 6c  onstraints reall
1fcb0 79 20 61 72 65 20 6d 6f 72 65 0a 20 20 20 20 20  y are more.     
1fcc0 20 20 20 20 20 20 20 2a 2a 20 73 65 6c 65 63 74         ** select
1fcd0 69 76 65 20 69 6e 20 70 72 61 63 74 69 63 65 2c  ive in practice,
1fce0 20 6f 6e 20 61 76 65 72 61 67 65 2e 20 2a 2f 0a   on average. */.
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 70 63 2e 70              pc.p
1fd00 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20  lan.nRow /= 3;. 
1fd10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fd20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
1fd30 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
1fd40 4f 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  O_NOOP ){.      
1fd50 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72      /* Any other
1fd60 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 77 65   expression lowe
1fd70 72 73 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  rs the output ro
1fd80 77 20 63 6f 75 6e 74 20 62 79 20 68 61 6c 66 20  w count by half 
1fd90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e  */.          pc.
1fda0 70 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 32 3b 0a  plan.nRow /= 2;.
1fdb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fdc0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63 2e 70  }.      if( pc.p
1fdd0 6c 61 6e 2e 6e 52 6f 77 3c 32 20 29 20 70 63 2e  lan.nRow<2 ) pc.
1fde0 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 32 3b 0a 20  plan.nRow = 2;. 
1fdf0 20 20 20 7d 0a 0a 0a 20 20 20 20 57 48 45 52 45     }...    WHERE
1fe00 54 52 41 43 45 28 28 0a 20 20 20 20 20 20 22 20  TRACE((.      " 
1fe10 20 20 20 20 20 6e 45 71 3d 25 64 20 6e 49 6e 4d       nEq=%d nInM
1fe20 75 6c 3d 25 64 20 72 61 6e 67 65 44 69 76 3d 25  ul=%d rangeDiv=%
1fe30 64 20 62 53 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b  d bSort=%d bLook
1fe40 75 70 3d 25 64 20 77 73 46 6c 61 67 73 3d 30 78  up=%d wsFlags=0x
1fe50 25 30 38 78 5c 6e 22 0a 20 20 20 20 20 20 22 20  %08x\n".      " 
1fe60 20 20 20 20 20 6e 6f 74 52 65 61 64 79 3d 30 78       notReady=0x
1fe70 25 6c 6c 78 20 6c 6f 67 31 30 4e 3d 25 2e 31 66  %llx log10N=%.1f
1fe80 20 6e 52 6f 77 3d 25 2e 31 66 20 63 6f 73 74 3d   nRow=%.1f cost=
1fe90 25 2e 31 66 5c 6e 22 0a 20 20 20 20 20 20 22 20  %.1f\n".      " 
1fea0 20 20 20 20 20 75 73 65 64 3d 30 78 25 6c 6c 78       used=0x%llx
1feb0 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c 0a 20   nOBSat=%d\n",. 
1fec0 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 45 71       pc.plan.nEq
1fed0 2c 20 6e 49 6e 4d 75 6c 2c 20 28 69 6e 74 29 72  , nInMul, (int)r
1fee0 61 6e 67 65 44 69 76 2c 20 62 53 6f 72 74 2c 20  angeDiv, bSort, 
1fef0 62 4c 6f 6f 6b 75 70 2c 20 70 63 2e 70 6c 61 6e  bLookup, pc.plan
1ff00 2e 77 73 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  .wsFlags,.      
1ff10 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 6c 6f 67  p->notReady, log
1ff20 31 30 4e 2c 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f  10N, pc.plan.nRo
1ff30 77 2c 20 70 63 2e 72 43 6f 73 74 2c 20 70 63 2e  w, pc.rCost, pc.
1ff40 75 73 65 64 2c 0a 20 20 20 20 20 20 70 63 2e 70  used,.      pc.p
1ff50 6c 61 6e 2e 6e 4f 42 53 61 74 0a 20 20 20 20 29  lan.nOBSat.    )
1ff60 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
1ff70 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  is index is the 
1ff80 62 65 73 74 20 77 65 20 68 61 76 65 20 73 65 65  best we have see
1ff90 6e 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 72  n so far, then r
1ffa0 65 63 6f 72 64 20 74 68 69 73 0a 20 20 20 20 2a  ecord this.    *
1ffb0 2a 20 69 6e 64 65 78 20 61 6e 64 20 69 74 73 20  * index and its 
1ffc0 63 6f 73 74 20 69 6e 20 74 68 65 20 70 2d 3e 63  cost in the p->c
1ffd0 6f 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 20  ost structure.. 
1ffe0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
1fff0 70 49 64 78 20 7c 7c 20 70 63 2e 70 6c 61 6e 2e  pIdx || pc.plan.
20000 77 73 46 6c 61 67 73 29 20 26 26 20 63 6f 6d 70  wsFlags) && comp
20010 61 72 65 43 6f 73 74 28 26 70 63 2c 20 26 70 2d  areCost(&pc, &p-
20020 3e 63 6f 73 74 29 20 29 7b 0a 20 20 20 20 20 20  >cost) ){.      
20030 70 2d 3e 63 6f 73 74 20 3d 20 70 63 3b 0a 20 20  p->cost = pc;.  
20040 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e      p->cost.plan
20050 2e 77 73 46 6c 61 67 73 20 26 3d 20 77 73 46 6c  .wsFlags &= wsFl
20060 61 67 4d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d  agMask;.      p-
20070 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64  >cost.plan.u.pId
20080 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a  x = pIdx;.    }.
20090 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
200a0 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
200b0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
200c0 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
200d0 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
200e0 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
200f0 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
20100 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  x ) break;..    
20110 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b 73 20 66  /* Reset masks f
20120 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  or the next inde
20130 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  x in the loop */
20140 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20  .    wsFlagMask 
20150 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f  = ~(WHERE_ROWID_
20160 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
20170 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72  ANGE);.    eqTer
20180 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72  mMask = idxEqTer
20190 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  mMask;.  }..  /*
201a0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
201b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
201c0 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f 52  and the SQLITE_R
201d0 65 76 65 72 73 65 4f 72 64 65 72 20 66 6c 61 67  everseOrder flag
201e0 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c 20 74 68  .  ** is set, th
201f0 65 6e 20 72 65 76 65 72 73 65 20 74 68 65 20 6f  en reverse the o
20200 72 64 65 72 20 74 68 61 74 20 74 68 65 20 69 6e  rder that the in
20210 64 65 78 20 77 69 6c 6c 20 62 65 20 73 63 61 6e  dex will be scan
20220 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54 68 69  ned.  ** in. Thi
20230 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 70  s is used for ap
20240 70 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e  plication testin
20250 67 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e 64 20  g, to help find 
20260 63 61 73 65 73 0a 20 20 2a 2a 20 77 68 65 72 65  cases.  ** where
20270 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 62 65 68   application beh
20280 61 76 69 6f 75 72 20 64 65 70 65 6e 64 73 20 6f  aviour depends o
20290 6e 20 74 68 65 20 28 75 6e 64 65 66 69 6e 65 64  n the (undefined
202a0 29 20 6f 72 64 65 72 20 74 68 61 74 0a 20 20 2a  ) order that.  *
202b0 2a 20 53 51 4c 69 74 65 20 6f 75 74 70 75 74 73  * SQLite outputs
202c0 20 72 6f 77 73 20 69 6e 20 69 6e 20 74 68 65 20   rows in in the 
202d0 61 62 73 65 6e 63 65 20 6f 66 20 61 6e 20 4f 52  absence of an OR
202e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
202f0 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 70 4f 72  */.  if( !p->pOr
20300 64 65 72 42 79 20 26 26 20 70 50 61 72 73 65 2d  derBy && pParse-
20310 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
20320 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
20330 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e   ){.    p->cost.
20340 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
20350 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20  WHERE_REVERSE;. 
20360 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d   }..  assert( p-
20370 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 2d  >pOrderBy || (p-
20380 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
20390 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 45 44  gs&WHERE_ORDERED
203a0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
203b0 28 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75  ( p->cost.plan.u
203c0 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70 2d 3e  .pIdx==0 || (p->
203d0 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
203e0 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  s&WHERE_ROWID_EQ
203f0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
20400 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d  ( pSrc->pIndex==
20410 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  0 .       || p->
20420 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
20430 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ==0 .       || p
20440 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49  ->cost.plan.u.pI
20450 64 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78  dx==pSrc->pIndex
20460 20 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45 54   .  );..  WHERET
20470 52 41 43 45 28 28 22 20 20 20 62 65 73 74 20 69  RACE(("   best i
20480 6e 64 65 78 20 69 73 3a 20 25 73 5c 6e 22 2c 0a  ndex is: %s\n",.
20490 20 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74           p->cost
204a0 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70  .plan.u.pIdx ? p
204b0 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49  ->cost.plan.u.pI
204c0 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b  dx->zName : "ipk
204d0 22 29 29 3b 0a 20 20 0a 20 20 62 65 73 74 4f 72  "));.  .  bestOr
204e0 43 6c 61 75 73 65 49 6e 64 65 78 28 70 29 3b 0a  ClauseIndex(p);.
204f0 20 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49    bestAutomaticI
20500 6e 64 65 78 28 70 29 3b 0a 20 20 70 2d 3e 63 6f  ndex(p);.  p->co
20510 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
20520 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d  |= eqTermMask;.}
20530 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
20540 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20   query plan for 
20550 61 63 63 65 73 73 69 6e 67 20 74 61 62 6c 65 20  accessing table 
20560 70 53 72 63 2d 3e 70 54 61 62 2e 20 57 72 69 74  pSrc->pTab. Writ
20570 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75  e the.** best qu
20580 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73  ery plan and its
20590 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57   cost into the W
205a0 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20  hereCost object 
205b0 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61 73 20  supplied .** as 
205c0 74 68 65 20 6c 61 73 74 20 70 61 72 61 6d 65 74  the last paramet
205d0 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
205e0 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61 74 65 20  n may calculate 
205f0 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a 20 62  the cost of.** b
20600 6f 74 68 20 72 65 61 6c 20 61 6e 64 20 76 69 72  oth real and vir
20610 74 75 61 6c 20 74 61 62 6c 65 20 73 63 61 6e 73  tual table scans
20620 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
20630 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74  ction does not t
20640 61 6b 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20  ake ORDER BY or 
20650 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 61 63  DISTINCT into ac
20660 63 6f 75 6e 74 2e 20 20 4e 6f 72 0a 2a 2a 20 64  count.  Nor.** d
20670 6f 65 73 20 69 74 20 72 65 6d 65 6d 62 65 72 20  oes it remember 
20680 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
20690 65 20 71 75 65 72 79 20 70 6c 61 6e 2e 20 20 41  e query plan.  A
206a0 6c 6c 20 69 74 20 64 6f 65 73 20 69 73 20 63 6f  ll it does is co
206b0 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 63 6f 73  mpute.** the cos
206c0 74 20 77 68 69 6c 65 20 64 65 74 65 72 6d 69 6e  t while determin
206d0 69 6e 67 20 69 66 20 61 6e 20 4f 52 20 6f 70 74  ing if an OR opt
206e0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 70 70  imization is app
206f0 6c 69 63 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a  licable.  The.**
20700 20 64 65 74 61 69 6c 73 20 77 69 6c 6c 20 62 65   details will be
20710 20 72 65 63 6f 6e 73 69 64 65 72 65 64 20 6c 61   reconsidered la
20720 74 65 72 20 69 66 20 74 68 65 20 6f 70 74 69 6d  ter if the optim
20730 69 7a 61 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ization is found
20740 20 74 6f 20 62 65 0a 2a 2a 20 61 70 70 6c 69 63   to be.** applic
20750 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
20760 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 57  void bestIndex(W
20770 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b  hereBestIdx *p){
20780 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20790 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
207a0 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
207b0 6c 28 70 2d 3e 70 53 72 63 2d 3e 70 54 61 62 29  l(p->pSrc->pTab)
207c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
207d0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
207e0 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d  Info = 0;.    p-
207f0 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20 26 70 49  >ppIdxInfo = &pI
20800 64 78 49 6e 66 6f 3b 0a 20 20 20 20 62 65 73 74  dxInfo;.    best
20810 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 29 3b  VirtualIndex(p);
20820 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
20830 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
20840 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Str ){.      sql
20850 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
20860 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  fo->idxStr);.   
20870 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
20880 46 72 65 65 28 70 2d 3e 70 50 61 72 73 65 2d 3e  Free(p->pParse->
20890 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  db, pIdxInfo);. 
208a0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
208b0 7b 0a 20 20 20 20 62 65 73 74 42 74 72 65 65 49  {.    bestBtreeI
208c0 6e 64 65 78 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ndex(p);.  }.}..
208d0 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20  /*.** Disable a 
208e0 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
208f0 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70  E clause.  Excep
20900 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c  t, do not disabl
20910 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66  e the term.** if
20920 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c   it controls a L
20930 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61  EFT OUTER JOIN a
20940 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72  nd it did not or
20950 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f  iginate in the O
20960 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c  N.** or USING cl
20970 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69  ause of that joi
20980 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65  n..**.** Conside
20990 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d  r the term t2.z=
209a0 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c  'ok' in the foll
209b0 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a  owing queries:.*
209c0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45  *.**   (1)  SELE
209d0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
209e0 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
209f0 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e  a=t2.x WHERE t2.
20a00 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20  z='ok'.**   (2) 
20a10 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
20a20 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
20a30 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  N t1.a=t2.x AND 
20a40 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
20a50 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3)  SELECT * FRO
20a60 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74  M t1, t2 WHERE t
20a70 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
20a80 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65  z='ok'.**.** The
20a90 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69   t2.z='ok' is di
20aa0 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e  sabled in the in
20ab0 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20   (2) because it 
20ac0 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e  originates.** in
20ad0 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20   the ON clause. 
20ae0 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73   The term is dis
20af0 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63  abled in (3) bec
20b00 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  ause it is not p
20b10 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54  art.** of a LEFT
20b20 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e   OUTER JOIN.  In
20b30 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69   (1), the term i
20b40 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a  s not disabled..
20b50 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  **.** IMPLEMENTA
20b60 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37  TION-OF: R-24597
20b70 2d 35 38 36 35 35 20 4e 6f 20 74 65 73 74 73 20  -58655 No tests 
20b80 61 72 65 20 64 6f 6e 65 20 66 6f 72 20 74 65 72  are done for ter
20b90 6d 73 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  ms that are.** c
20ba0 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74 69 73 66  ompletely satisf
20bb0 69 65 64 20 62 79 20 69 6e 64 69 63 65 73 2e 0a  ied by indices..
20bc0 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20  **.** Disabling 
20bd0 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68  a term causes th
20be0 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62  at term to not b
20bf0 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20  e tested in the 
20c00 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
20c10 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61   the join.  Disa
20c20 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69  bling is an opti
20c30 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20  mization.  When 
20c40 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66  terms are satisf
20c50 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65  ied.** by indice
20c60 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68  s, we disable th
20c70 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  em to prevent re
20c80 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e  dundant tests in
20c90 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f   the inner.** lo
20ca0 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  op.  We would ge
20cb0 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  t the correct re
20cc0 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67  sults if nothing
20cd0 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62   were ever disab
20ce0 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e  led,.** but join
20cf0 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
20d00 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68  ttle slower.  Th
20d10 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69  e trick is to di
20d20 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a  sable as much.**
20d30 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
20d40 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f  ut disabling too
20d50 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69   much.  If we di
20d60 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77  sabled in (1), w
20d70 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77  e'd get.** the w
20d80 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65  rong answer.  Se
20d90 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a  e ticket #813..*
20da0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
20db0 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c  sableTerm(WhereL
20dc0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68  evel *pLevel, Wh
20dd0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b  ereTerm *pTerm){
20de0 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20  .  if( pTerm.   
20df0 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
20e00 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
20e10 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
20e20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
20e30 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
20e40 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
20e50 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
20e60 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  in)).  ){.    pT
20e70 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
20e80 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
20e90 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  if( pTerm->iPare
20ea0 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  nt>=0 ){.      W
20eb0 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
20ec0 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e   = &pTerm->pWC->
20ed0 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  a[pTerm->iParent
20ee0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d  ];.      if( (--
20ef0 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d  pOther->nChild)=
20f00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  =0 ){.        di
20f10 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
20f20 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20  , pOther);.     
20f30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
20f40 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
20f50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
20f60 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f   to apply the co
20f70 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
20f80 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20  ring zAff.** to 
20f90 74 68 65 20 6e 20 72 65 67 69 73 74 65 72 73 20  the n registers 
20fa0 73 74 61 72 74 69 6e 67 20 61 74 20 62 61 73 65  starting at base
20fb0 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f  . .**.** As an o
20fc0 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c  ptimization, SQL
20fd0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
20fe0 72 69 65 73 20 28 77 68 69 63 68 20 61 72 65 20  ries (which are 
20ff0 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a  no-ops) at the.*
21000 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  * beginning and 
21010 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20  end of zAff are 
21020 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c  ignored.  If all
21030 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66   entries in zAff
21040 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41   are.** SQLITE_A
21050 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f  FF_NONE, then no
21060 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72   code gets gener
21070 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ated..**.** This
21080 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69   routine makes i
21090 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a  ts own copy of z
210a0 41 66 66 20 73 6f 20 74 68 61 74 20 74 68 65 20  Aff so that the 
210b0 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a  caller is free.*
210c0 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66  * to modify zAff
210d0 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
210e0 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a  ine returns..*/.
210f0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
21100 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61  ApplyAffinity(Pa
21110 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
21120 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68   base, int n, ch
21130 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62  ar *zAff){.  Vdb
21140 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
21150 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66  Vdbe;.  if( zAff
21160 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
21170 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
21180 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
21190 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
211a0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
211b0 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61  ..  /* Adjust ba
211c0 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70  se and n to skip
211d0 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46   over SQLITE_AFF
211e0 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74  _NONE entries at
211f0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
21200 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74   ** and end of t
21210 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
21220 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ng..  */.  while
21230 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d  ( n>0 && zAff[0]
21240 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
21250 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  E ){.    n--;.  
21260 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41    base++;.    zA
21270 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  ff++;.  }.  whil
21280 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e  e( n>1 && zAff[n
21290 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  -1]==SQLITE_AFF_
212a0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b  NONE ){.    n--;
212b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  .  }..  /* Code 
212c0 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
212d0 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72 65 20  opcode if there 
212e0 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74  is anything left
212f0 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28   to do. */.  if(
21300 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   n>0 ){.    sqli
21310 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21320 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61   OP_Affinity, ba
21330 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  se, n);.    sqli
21340 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
21350 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b  v, -1, zAff, n);
21360 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
21370 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
21380 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65  nge(pParse, base
21390 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , n);.  }.}.../*
213a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
213b0 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65  e for a single e
213c0 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20  quality term of 
213d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
213e0 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a  .  An equality.*
213f0 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69  * term can be ei
21400 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58  ther X=expr or X
21410 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65   IN (...).   pTe
21420 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74  rm is the term t
21430 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a  o be .** coded..
21440 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  **.** The curren
21450 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
21460 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65  constraint is le
21470 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ft in register i
21480 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  Reg..**.** For a
21490 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74   constraint of t
214a0 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20  he form X=expr, 
214b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
214c0 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  s evaluated and 
214d0 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  its.** result is
214e0 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
214f0 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61  ck.  For constra
21500 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ints of the form
21510 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74   X IN (...).** t
21520 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
21530 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20   up a loop that 
21540 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65  will iterate ove
21550 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
21560 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  X..*/.static int
21570 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
21580 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
21590 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
215a0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
215b0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
215c0 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20  pTerm,   /* The 
215d0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
215e0 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63  E clause to be c
215f0 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
21600 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a  evel *pLevel, /*
21610 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74   When level of t
21620 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77  he FROM clause w
21630 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
21640 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
21650 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
21660 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
21670 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
21680 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
21690 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
216a0 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
216b0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
216c0 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216e0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
216f0 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
21700 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
21710 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
21720 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
21730 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
21740 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
21750 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
21760 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
21770 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
21780 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
21790 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
217a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
217b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
217c0 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
217d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
217e0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
217f0 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
21800 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
21810 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
21820 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73  op *pIn;..    as
21830 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
21840 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
21850 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
21860 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
21870 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
21880 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 54  , pX, 0);.    iT
21890 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  ab = pX->iTable;
218a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
218b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
218c0 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
218d0 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
218e0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
218f0 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
21900 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
21910 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29  l->u.in.nIn==0 )
21920 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
21930 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
21940 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
21950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  );.    }.    pLe
21960 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b  vel->u.in.nIn++;
21970 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  .    pLevel->u.i
21980 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20  n.aInLoop =.    
21990 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
219a0 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65  locOrFree(pParse
219b0 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e  ->db, pLevel->u.
219c0 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20  in.aInLoop,.    
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219e0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
219f0 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  (pLevel->u.in.aI
21a00 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c  nLoop[0])*pLevel
21a10 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20  ->u.in.nIn);.   
21a20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75   pIn = pLevel->u
21a30 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20  .in.aInLoop;.   
21a40 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20   if( pIn ){.    
21a50 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d    pIn += pLevel-
21a60 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20  >u.in.nIn - 1;. 
21a70 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d       pIn->iCur =
21a80 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28   iTab;.      if(
21a90 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
21aa0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
21ab0 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
21ac0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
21ad0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
21ae0 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20  , iTab, iReg);. 
21af0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21b00 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
21b10 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
21b20 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
21b30 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52  umn, iTab, 0, iR
21b40 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
21b50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21b60 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
21b70 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65  l, iReg);.    }e
21b80 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
21b90 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b  l->u.in.nIn = 0;
21ba0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
21bb0 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
21bc0 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
21bd0 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
21be0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
21bf0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
21c00 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
21c10 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
21c20 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
21c30 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ex..**.** For ex
21c40 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
21c50 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
21c60 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
21c70 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
21c80 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
21c90 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
21ca0 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
21cb0 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
21cc0 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
21cd0 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
21ce0 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
21cf0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
21d00 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
21d10 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
21d20 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
21d30 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
21d40 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
21d50 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
21d60 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
21d70 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
21d80 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
21d90 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
21da0 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
21db0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
21dc0 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
21dd0 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
21de0 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
21df0 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
21e00 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
21e10 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
21e20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
21e30 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
21e40 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
21e50 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
21e60 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
21e70 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
21e80 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
21e90 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
21ea0 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
21eb0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
21ec0 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
21ed0 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
21ee0 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
21ef0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a  memory cell and.
21f00 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  ** compute the a
21f10 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
21f20 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
21f30 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ne always alloca
21f40 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  tes at least one
21f50 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
21f60 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
21f70 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65  index of that me
21f80 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63  mory cell. The c
21f90 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
21fa0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
21fb0 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d  ill use that mem
21fc0 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72  ory cell to stor
21fd0 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  e the terminatio
21fe0 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f  n.** key value o
21ff0 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
22000 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f  one or more IN o
22010 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c  perators appear,
22020 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
22030 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
22040 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45  an additional nE
22050 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  q memory cells f
22060 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75  or internal.** u
22070 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  se..**.** Before
22080 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41   returning, *pzA
22090 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ff is set to poi
220a0 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
220b0 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63  ontaining a.** c
220c0 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
220d0 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
220e0 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  g of the index a
220f0 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
22100 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  * sqlite3DbMallo
22110 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74  c(). Except, ent
22120 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79  ries in the copy
22130 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61   of the string a
22140 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
22150 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  h equality const
22160 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20  raints that use 
22170 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72  NONE affinity ar
22180 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49  e set to.** SQLI
22190 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69  TE_AFF_NONE. Thi
221a0 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74  s is to deal wit
221b0 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68  h SQL such as th
221c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
221d0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
221e0 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d  E t1(a TEXT PRIM
221f0 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20  ARY KEY, b);.** 
22200 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
22210 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57  M t1 AS t2, t1 W
22220 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62  HERE t1.a = t2.b
22230 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ;.**.** In the e
22240 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
22250 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29  e index on t1(a)
22260 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69   has TEXT affini
22270 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a  ty. But since.**
22280 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
22290 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61  side of the equa
222a0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
222b0 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20  (t2.b) has NONE 
222c0 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20  affinity,.** no 
222d0 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c  conversion shoul
222e0 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62  d be attempted b
222f0 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32  efore using a t2
22300 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74  .b value as part
22310 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20   of.** a key to 
22320 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  search the index
22330 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73  . Hence the firs
22340 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65  t byte in the re
22350 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a  turned affinity.
22360 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69  ** string in thi
22370 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20  s example would 
22380 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
22390 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74  _AFF_NONE..*/.st
223a0 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c  atic int codeAll
223b0 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
223c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
223d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
223e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
223f0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
22400 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
22410 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
22420 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
22430 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ing */.  WhereCl
22440 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f  ause *pWC,     /
22450 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
22460 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  se */.  Bitmask 
22470 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
22480 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20   Which parts of 
22490 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65  FROM have not ye
224a0 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a  t been coded */.
224b0 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c    int nExtraReg,
224c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
224d0 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
224e0 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
224f0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41   */.  char **pzA
22500 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ff          /* O
22510 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74  UT: Set to point
22520 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72   to affinity str
22530 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
22540 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  nEq = pLevel->pl
22550 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65  an.nEq;   /* The
22560 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
22570 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
22580 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62  to code */.  Vdb
22590 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
225a0 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
225b0 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
225c0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
225d0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
225e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
225f0 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
22600 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
22610 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d   */.  int iCur =
22620 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
22630 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
22640 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  r of the table *
22650 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
22660 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
22670 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f    /* A single co
22680 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f  nstraint term */
22690 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
226c0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
226d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
226e0 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
226f0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
22700 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
22710 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22720 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
22730 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
22740 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22760 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
22770 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
22780 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
22790 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
227a0 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
227b0 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
227c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c   */.  assert( pL
227d0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
227e0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
227f0 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 70  ED );.  pIdx = p
22800 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
22810 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  dx;..  /* Figure
22820 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65   out how many me
22830 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69  mory cells we wi
22840 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c  ll need then all
22850 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f  ocate them..  */
22860 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61  .  regBase = pPa
22870 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
22880 20 6e 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e   nReg = pLevel->
22890 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72  plan.nEq + nExtr
228a0 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
228b0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
228c0 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
228d0 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
228e0 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
228f0 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
22900 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
22910 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
22920 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
22930 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
22940 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
22950 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
22960 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
22970 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
22980 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
22990 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
229a0 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20  .    int r1;.   
229b0 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61   int k = pIdx->a
229c0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
229d0 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
229e0 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
229f0 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d  otReady, pLevel-
22a00 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70  >plan.wsFlags, p
22a10 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 70 54  Idx);.    if( pT
22a20 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
22a30 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
22a40 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e  wing true for in
22a50 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e  dices with redun
22a60 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20  dant columns. . 
22a70 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45     ** Ex: CREATE
22a80 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
22a90 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a  a,b,a); SELECT *
22aa0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
22ab0 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20  =0 AND b=0; */. 
22ac0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54     testcase( (pT
22ad0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
22ae0 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b  ERM_CODED)!=0 );
22af0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
22b00 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
22b10 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
22b20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
22b30 31 36 36 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d  1662 */.    r1 =
22b40 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
22b50 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
22b60 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73 65   pLevel, regBase
22b70 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21  +j);.    if( r1!
22b80 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20  =regBase+j ){.  
22b90 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20      if( nReg==1 
22ba0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22bb0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
22bc0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
22bd0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61  );.        regBa
22be0 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d  se = r1;.      }
22bf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
22c00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22c10 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  v, OP_SCopy, r1,
22c20 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
22c30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
22c40 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
22c50 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
22c60 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
22c70 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
22c80 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
22c90 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
22ca0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
22cb0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
22cc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
22cd0 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
22ce0 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
22cf0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
22d00 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
22d10 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
22d20 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d  gBase+j, pLevel-
22d30 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20  >addrBrk);.     
22d40 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20   if( zAff ){.   
22d50 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
22d60 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
22d70 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
22d80 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
22d90 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
22da0 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
22db0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
22dc0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
22dd0 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
22de0 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
22df0 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
22e00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
22e10 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
22e20 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
22e30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22e40 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
22e50 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
22e60 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e  regBase;.}..#ifn
22e70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22e80 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68  EXPLAIN./*.** Th
22e90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
22ea0 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61  helper for expla
22eb0 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62  inIndexRange() b
22ec0 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20  elow.**.** pStr 
22ed0 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f  holds the text o
22ee0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
22ef0 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c  that we are buil
22f00 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d  ding up one term
22f10 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20  .** at a time.  
22f20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
22f30 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  s a new term to 
22f40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65  the end of the e
22f50 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65  xpression..** Te
22f60 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65  rms are separate
22f70 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20  d by AND so add 
22f80 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66  the "AND" text f
22f90 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  or second and su
22fa0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d  bsequent.** term
22fb0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
22fc0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70  c void explainAp
22fd0 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41  pendTerm(.  StrA
22fe0 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20  ccum *pStr,     
22ff0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
23000 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ext expression b
23010 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20  eing built */.  
23020 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20  int iTerm,      
23030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23040 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72  ndex of this ter
23050 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72  m.  First is zer
23060 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  o */.  const cha
23070 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  r *zColumn,     
23080 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
23090 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  e column */.  co
230a0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20  nst char *zOp   
230b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
230c0 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
230d0 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54  r */.){.  if( iT
230e0 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72  erm ) sqlite3Str
230f0 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
23100 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
23110 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
23120 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f  Append(pStr, zCo
23130 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c  lumn, -1);.  sql
23140 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
23150 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29  nd(pStr, zOp, 1)
23160 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
23170 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
23180 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  "?", 1);.}../*.*
23190 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65  * Argument pLeve
231a0 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74  l describes a st
231b0 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e  rategy for scann
231c0 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ing table pTab. 
231d0 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
231e0 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
231f0 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
23200 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
23210 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a  g a description.
23220 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74  ** of the subset
23230 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73   of table rows s
23240 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74  canned by the st
23250 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f  rategy in the fo
23260 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20  rm of an.** SQL 
23270 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20  expression. Or, 
23280 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
23290 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73  scanned, NULL is
232a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
232b0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
232c0 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a   the query:.**.*
232d0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
232e0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41  M t1 WHERE a=1 A
232f0 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73  ND b>2;.**.** is
23300 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69   run and there i
23310 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  s an index on (a
23320 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20  , b), then this 
23330 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
23340 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d   a.** string sim
23350 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
23360 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a   "a=? AND b>?".*
23370 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
23380 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  d pointer points
23390 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   to memory obtai
233a0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
233b0 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  DbMalloc()..** I
233c0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
233d0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
233e0 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68  aller to free th
233f0 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74  e buffer when it
23400 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
23410 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
23420 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61  atic char *expla
23430 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c  inIndexRange(sql
23440 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
23450 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 54 61  evel *pLevel, Ta
23460 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 57 68  ble *pTab){.  Wh
23470 65 72 65 50 6c 61 6e 20 2a 70 50 6c 61 6e 20 3d  erePlan *pPlan =
23480 20 26 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b 0a   &pLevel->plan;.
23490 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
234a0 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70 49 64 78 3b  = pPlan->u.pIdx;
234b0 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 50 6c  .  int nEq = pPl
234c0 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74 20 69  an->nEq;.  int i
234d0 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  , j;.  Column *a
234e0 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
234f0 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d  ;.  int *aiColum
23500 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
23510 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d  lumn;.  StrAccum
23520 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71   txt;..  if( nEq
23530 3d 3d 30 20 26 26 20 28 70 50 6c 61 6e 2d 3e 77  ==0 && (pPlan->w
23540 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
23550 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
23560 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29  TOP_LIMIT))==0 )
23570 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
23580 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
23590 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20  AccumInit(&txt, 
235a0 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58  0, 0, SQLITE_MAX
235b0 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e  _LENGTH);.  txt.
235c0 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74  db = db;.  sqlit
235d0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
235e0 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b  (&txt, " (", 2);
235f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45  .  for(i=0; i<nE
23600 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70  q; i++){.    exp
23610 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
23620 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43  txt, i, aCol[aiC
23630 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c  olumn[i]].zName,
23640 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20   "=");.  }..  j 
23650 3d 20 69 3b 0a 20 20 69 66 28 20 70 50 6c 61 6e  = i;.  if( pPlan
23660 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
23670 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
23680 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
23690 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
236a0 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
236b0 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
236c0 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
236d0 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
236e0 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a  , i++, z, ">");.
236f0 20 20 7d 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d    }.  if( pPlan-
23700 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54  >wsFlags&WHERE_T
23710 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
23720 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
23730 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
23740 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
23750 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
23760 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
23770 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
23780 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d   i, z, "<");.  }
23790 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
237a0 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
237b0 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  )", 1);.  return
237c0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
237d0 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a  Finish(&txt);.}.
237e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
237f0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
23800 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79  unless currently
23810 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45   processing an E
23820 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
23830 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66  N.** command. If
23840 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67   the query being
23850 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20   compiled is an 
23860 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
23870 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  AN, a single.** 
23880 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20  record is added 
23890 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f  to the output to
238a0 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61   describe the ta
238b0 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
238c0 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e  y in .** pLevel.
238d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
238e0 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
238f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
23920 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
23930 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
23940 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
23950 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20   list this loop 
23960 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57  refers to */.  W
23970 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
23980 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
23990 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20  * Scan to write 
239a0 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  OP_Explain opcod
239b0 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  e for */.  int i
239c0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
239d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
239e0 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20  lue for "level" 
239f0 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
23a00 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
23a30 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e  or "from" column
23a40 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
23a50 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a70 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
23a80 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
23a90 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69  egin() */.){.  i
23aa0 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
23ab0 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 75 33 32  in==2 ){.    u32
23ac0 20 66 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d   flags = pLevel-
23ad0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  >plan.wsFlags;. 
23ae0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
23af0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
23b00 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
23b10 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
23b20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
23b30 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
23b40 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74  * VM being const
23b50 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71  ructed */.    sq
23b60 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23b70 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44  se->db;     /* D
23b80 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
23b90 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  /.    char *zMsg
23ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23bb0 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61      /* Text to a
23bc0 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74  dd to EQP output
23bd0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
23be0 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20 20 20 20  int64 nRow;     
23bf0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
23c00 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
23c10 20 76 69 73 69 74 65 64 20 62 79 20 73 63 61 6e   visited by scan
23c20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20   */.    int iId 
23c30 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
23c40 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20  tId;  /* Select 
23c50 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75  id (left-most ou
23c60 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a  tput column) */.
23c70 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68      int isSearch
23c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23c90 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
23ca0 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f  SEARCH. False fo
23cb0 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20 20 20 20  r SCAN. */..    
23cc0 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
23cd0 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77  _MULTI_OR) || (w
23ce0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
23cf0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29  ONETABLE_ONLY) )
23d00 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73   return;..    is
23d10 53 65 61 72 63 68 20 3d 20 28 70 4c 65 76 65 6c  Search = (pLevel
23d20 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29 0a 20 20  ->plan.nEq>0).  
23d30 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 66             || (f
23d40 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
23d50 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
23d60 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20  LIMIT))!=0.     
23d70 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72          || (wctr
23d80 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52  lFlags&(WHERE_OR
23d90 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f  DERBY_MIN|WHERE_
23da0 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a  ORDERBY_MAX));..
23db0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
23dc0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
23dd0 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45  s", isSearch?"SE
23de0 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20  ARCH":"SCAN");. 
23df0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
23e00 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
23e10 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
23e20 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
23e30 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  "%s SUBQUERY %d"
23e40 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53  , zMsg,pItem->iS
23e50 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65  electId);.    }e
23e60 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  lse{.      zMsg 
23e70 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
23e80 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
23e90 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c  TABLE %s", zMsg,
23ea0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
23eb0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
23ec0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
23ed0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
23ee0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
23ef0 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73   zMsg, "%s AS %s
23f00 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
23f10 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20  zAlias);.    }. 
23f20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
23f30 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
23f40 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
23f50 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69  *zWhere = explai
23f60 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20  nIndexRange(db, 
23f70 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d 2d 3e 70  pLevel, pItem->p
23f80 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67  Tab);.      zMsg
23f90 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
23fa0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
23fb0 20 55 53 49 4e 47 20 25 73 25 73 49 4e 44 45 58   USING %s%sINDEX
23fc0 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20 0a  %s%s%s", zMsg, .
23fd0 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
23fe0 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
23ff0 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54 49 43  NDEX)?"AUTOMATIC
24000 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20   ":""),.        
24010 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
24020 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f 56  E_IDX_ONLY)?"COV
24030 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20 20  ERING ":""),.   
24040 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
24050 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
24060 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20 20  X)?"":" "),.    
24070 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
24080 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
24090 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d 3e 70 6c  )?"": pLevel->pl
240a0 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
240b0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68  ),.          zWh
240c0 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ere.      );.   
240d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
240e0 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  (db, zWhere);.  
240f0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
24100 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
24110 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
24120 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
24130 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
24140 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
24150 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47   "%s USING INTEG
24160 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  ER PRIMARY KEY",
24170 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69   zMsg);..      i
24180 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 52  f( flags&WHERE_R
24190 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 20  OWID_EQ ){.     
241a0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
241b0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
241c0 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f  sg, "%s (rowid=?
241d0 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
241e0 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
241f0 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  s&WHERE_BOTH_LIM
24200 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f  IT)==WHERE_BOTH_
24210 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
24220 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
24230 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
24240 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41  , "%s (rowid>? A
24250 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  ND rowid<?)", zM
24260 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
24270 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
24280 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
24290 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
242a0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
242b0 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
242c0 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d>?)", zMsg);.  
242d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
242e0 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ags&WHERE_TOP_LI
242f0 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
24300 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
24310 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
24320 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20  "%s (rowid<?)", 
24330 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMsg);.      }. 
24340 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
24350 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
24360 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69  TABLE.    else i
24370 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
24380 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
24390 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
243a0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
243b0 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65  pVtabIdx = pLeve
243c0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49  l->plan.u.pVtabI
243d0 64 78 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  dx;.      zMsg =
243e0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
243f0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56  (db, zMsg, "%s V
24400 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
24410 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c  EX %d:%s", zMsg,
24420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24430 20 20 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78     pVtabIdx->idx
24440 4e 75 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e 69  Num, pVtabIdx->i
24450 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65  dxStr);.    }.#e
24460 6e 64 69 66 0a 20 20 20 20 69 66 28 20 77 63 74  ndif.    if( wct
24470 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f  rlFlags&(WHERE_O
24480 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45  RDERBY_MIN|WHERE
24490 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 20 29 7b  _ORDERBY_MAX) ){
244a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
244b0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
244c0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
244d0 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20  );.      nRow = 
244e0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
244f0 20 20 20 20 6e 52 6f 77 20 3d 20 28 73 71 6c 69      nRow = (sqli
24500 74 65 33 5f 69 6e 74 36 34 29 70 4c 65 76 65 6c  te3_int64)pLevel
24510 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20  ->plan.nRow;.   
24520 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71   }.    zMsg = sq
24530 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
24540 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25 6c  , zMsg, "%s (~%l
24550 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67 2c  ld rows)", zMsg,
24560 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69   nRow);.    sqli
24570 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
24580 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64   OP_Explain, iId
24590 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c  , iLevel, iFrom,
245a0 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
245b0 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
245c0 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
245d0 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c  OneScan(u,v,w,x,
245e0 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
245f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
24600 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  IN */.../*.** Ge
24610 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
24620 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
24630 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20   iLevel-th loop 
24640 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
24650 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  use.** implement
24660 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
24670 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74  by pWInfo..*/.st
24680 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64  atic Bitmask cod
24690 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20  eOneLoopStart(. 
246a0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
246b0 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74  fo,   /* Complet
246c0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
246d0 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  out the WHERE cl
246e0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
246f0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  evel,          /
24700 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66  * Which level of
24710 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f   pWInfo->a[] sho
24720 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a  uld be coded */.
24730 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
24740 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ,      /* One of
24750 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
24760 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
24770 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42  liteInt.h */.  B
24780 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
24790 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
247a0 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
247b0 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
247c0 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
247d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
247e0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
247f0 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
24800 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
24810 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
24820 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
24830 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
24840 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
24850 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
24860 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
24870 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
24880 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
24890 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
248a0 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
248b0 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
248c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
248d0 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
248e0 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
248f0 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
24900 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
24910 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
24920 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
24930 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
24940 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f  C;    /* Decompo
24950 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e  sition of the en
24960 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  tire WHERE claus
24970 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
24980 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
24990 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52         /* A WHER
249a0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  E clause term */
249b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
249c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
249d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
249e0 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20  ntext */.  Vdbe 
249f0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
24a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24a10 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20  e prepared stmt 
24a20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
24a30 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ons */.  struct 
24a40 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
24a50 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d  abItem;  /* FROM
24a60 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
24a70 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
24a80 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20  t addrBrk;      
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24aa0 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
24ab0 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
24ac0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
24ad0 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rCont;          
24ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
24af0 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
24b00 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c  e with next cycl
24b10 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69  e */.  int iRowi
24b20 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  dReg = 0;       
24b30 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f   /* Rowid is sto
24b40 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69  red in this regi
24b50 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72  ster, if not zer
24b60 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65  o */.  int iRele
24b70 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20  aseReg = 0;     
24b80 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
24b90 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65  r to free before
24ba0 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20   returning */.. 
24bb0 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
24bc0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20  ->pParse;.  v = 
24bd0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
24be0 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   pWC = pWInfo->p
24bf0 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  WC;.  pLevel = &
24c00 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
24c10 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  ];.  pTabItem = 
24c20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
24c30 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
24c40 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
24c50 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
24c60 0a 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65  .  bRev = (pLeve
24c70 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
24c80 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
24c90 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65  !=0;.  omitTable
24ca0 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
24cb0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
24cc0 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20  _IDX_ONLY)!=0 . 
24cd0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63            && (wc
24ce0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
24cf0 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30  _FORCE_TABLE)==0
24d00 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c  ;..  /* Create l
24d10 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62  abels for the "b
24d20 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69  reak" and "conti
24d30 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  nue" instruction
24d40 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63  s.  ** for the c
24d50 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
24d60 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f  mp to addrBrk to
24d70 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
24d80 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20  loop..  ** Jump 
24d90 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d  to cont to go im
24da0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65  mediately to the
24db0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
24dc0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70  of the.  ** loop
24dd0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
24de0 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20   there is an IN 
24df0 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73  operator, we als
24e00 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78  o have a "addrNx
24e10 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20  t" label that.  
24e20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
24e30 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
24e40 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
24e50 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
24e60 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f   ** there are no
24e70 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e   IN operators in
24e80 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
24e90 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20  , the "addrNxt" 
24ea0 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68  label.  ** is th
24eb0 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42  e same as "addrB
24ec0 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  rk"..  */.  addr
24ed0 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
24ee0 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
24ef0 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
24f00 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
24f10 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  );.  addrCont = 
24f20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
24f30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
24f40 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
24f50 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
24f60 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
24f70 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
24f80 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
24f90 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
24fa0 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  a memory cell th
24fb0 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68  at records if th
24fc0 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73  is table matches
24fd0 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   any.  ** row of
24fe0 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
24ff0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
25000 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
25010 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62  iFrom>0 && (pTab
25020 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  Item[0].jointype
25030 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
25040 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c  {.    pLevel->iL
25050 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
25060 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
25070 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25080 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
25090 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
250a0 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
250b0 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20  mment((v, "init 
250c0 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
250d0 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a  ch flag"));.  }.
250e0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
250f0 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  se of a FROM cla
25100 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70  use subquery imp
25110 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
25120 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66  -routine */.  if
25130 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43  ( pTabItem->viaC
25140 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
25150 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
25160 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
25170 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
25180 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25190 49 6e 74 65 67 65 72 2c 20 70 54 61 62 49 74 65  Integer, pTabIte
251a0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 2d 31  m->addrFillSub-1
251b0 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
251c0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73   pLevel->p2 =  s
251d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
251e0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
251f0 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62  gYield);.    Vdb
25200 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
25210 78 74 20 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75  xt row of co-rou
25220 74 69 6e 65 20 25 73 22 2c 20 70 54 61 62 49 74  tine %s", pTabIt
25230 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
25240 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
25250 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
25260 66 2c 20 72 65 67 59 69 65 6c 64 2b 31 2c 20 61  f, regYield+1, a
25270 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65  ddrBrk);.    pLe
25280 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74  vel->op = OP_Got
25290 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  o;.  }else..#ifn
252a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
252b0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
252c0 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  f(  (pLevel->pla
252d0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
252e0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
252f0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  =0 ){.    /* Cas
25300 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20  e 0:  The table 
25310 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  is a virtual-tab
25320 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69  le.  Use the VFi
25330 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20  lter and VNext. 
25340 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74     **          t
25350 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
25360 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  a..    */.    in
25370 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20  t iReg;   /* P3 
25380 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69  Value for OP_VFi
25390 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  lter */.    sqli
253a0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
253b0 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65  pVtabIdx = pLeve
253c0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49  l->plan.u.pVtabI
253d0 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e  dx;.    int nCon
253e0 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62 49  straint = pVtabI
253f0 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  dx->nConstraint;
25400 0a 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69  .    struct sqli
25410 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
25420 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61  aint_usage *aUsa
25430 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61       pVtabIdx->a
25470 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
25480 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .    const struc
25490 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
254a0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e  constraint *aCon
254b0 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20  straint =.      
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254e0 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49            pVtabI
254f0 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  dx->aConstraint;
25500 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
25510 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
25520 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73  e);.    iReg = s
25530 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
25540 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
25550 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 66  traint+2);.    f
25560 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73  or(j=1; j<=nCons
25570 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
25580 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
25590 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29  Constraint; k++)
255a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 55  {.        if( aU
255b0 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65  sage[k].argvInde
255c0 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  x==j ){.        
255d0 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
255e0 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65  onstraint[k].iTe
255f0 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
25600 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25610 6f 64 65 28 70 50 61 72 73 65 2c 20 70 57 43 2d  ode(pParse, pWC-
25620 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d  >a[iTerm].pExpr-
25630 3e 70 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b  >pRight, iReg+j+
25640 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  1);.          br
25650 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
25660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
25670 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   k==nConstraint 
25680 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
25690 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
256a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
256b0 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64  er, pVtabIdx->id
256c0 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20  xNum, iReg);.   
256d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
256e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
256f0 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a  , j-1, iReg+1);.
25700 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25710 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c  ddOp4(v, OP_VFil
25720 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ter, iCur, addrB
25730 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49  rk, iReg, pVtabI
25740 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20  dx->idxStr,.    
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64    pVtabIdx->need
25770 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20 50  ToFreeIdxStr ? P
25780 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53  4_MPRINTF : P4_S
25790 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61  TATIC);.    pVta
257a0 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65  bIdx->needToFree
257b0 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
257c0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73  for(j=0; j<nCons
257d0 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
257e0 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a      if( aUsage[j
257f0 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  ].omit ){.      
25800 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
25810 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65  onstraint[j].iTe
25820 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
25830 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
25840 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54  evel, &pWC->a[iT
25850 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  erm]);.      }. 
25860 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
25870 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
25880 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
25890 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
258a0 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
258b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
258c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
258d0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
258e0 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
258f0 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
25900 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
25910 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
25920 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
25930 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
25940 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
25950 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
25960 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
25970 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20  RE_ROWID_EQ ){. 
25980 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57     /* Case 1:  W
25990 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72  e can directly r
259a0 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
259b0 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20  e row using an. 
259c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65     **          e
259d0 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
259e0 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
259f0 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a  OWID field.  Or.
25a00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
25a10 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c  we reference mul
25a20 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67  tiple rows using
25a30 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e   a "rowid IN (..
25a40 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  .)".    **      
25a50 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
25a60 20 20 20 2a 2f 0a 20 20 20 20 69 52 65 6c 65 61     */.    iRelea
25a70 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
25a80 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
25a90 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  );.    pTerm = f
25aa0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
25ab0 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
25ac0 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29   WO_EQ|WO_IN, 0)
25ad0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
25ae0 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
25af0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
25b00 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pr!=0 );.    ass
25b10 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74  ert( pTerm->left
25b20 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
25b30 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
25b40 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
25b50 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
25b60 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
25b70 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
25b80 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
25b90 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  */.    iRowidReg
25ba0 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
25bb0 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
25bc0 6d 2c 20 70 4c 65 76 65 6c 2c 20 69 52 65 6c 65  m, pLevel, iRele
25bd0 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64  aseReg);.    add
25be0 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
25bf0 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69  ddrNxt;.    sqli
25c00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25c10 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
25c20 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78  RowidReg, addrNx
25c30 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
25c40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
25c50 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
25c60 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
25c70 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
25c80 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
25c90 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
25ca0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
25cb0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
25cc0 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c  , "pk"));.    pL
25cd0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
25ce0 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  op;.  }else if( 
25cf0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
25d00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
25d10 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  ID_RANGE ){.    
25d20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68  /* Case 2:  We h
25d30 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
25d40 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
25d50 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
25d60 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ield..    */.   
25d70 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
25d80 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73  _Noop;.    int s
25d90 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65  tart;.    int me
25da0 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20  mEndValue = 0;. 
25db0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
25dc0 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
25dd0 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
25de0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53  ble==0 );.    pS
25df0 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  tart = findTerm(
25e00 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
25e10 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
25e20 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 70 45  O_GE, 0);.    pE
25e30 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  nd = findTerm(pW
25e40 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
25e50 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
25e60 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LE, 0);.    if( 
25e70 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
25e80 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
25e90 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
25ea0 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
25eb0 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
25ec0 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
25ed0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
25ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25ef0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
25f00 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
25f10 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
25f20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
25f30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
25f40 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
25f50 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
25f60 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  dary */..      /
25f70 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
25f80 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
25f90 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
25fa0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
25fb0 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
25fc0 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
25fd0 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
25fe0 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
25ff0 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
26000 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
26010 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
26020 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
26030 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20   OP_SeekGt,.    
26040 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
26050 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
26060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
26070 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74  LT */  OP_SeekLt
26080 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
26090 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
260a0 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGe.      };.   
260b0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
260c0 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
260d0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
260e0 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
260f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
26100 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
26110 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
26120 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
26130 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
26140 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
26150 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
26160 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
26170 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  . */..      test
26180 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
26190 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
261a0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
261b0 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
261c0 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
261d0 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
261e0 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
261f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26200 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
26210 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
26220 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
26230 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
26240 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72  , pX->pRight, &r
26250 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
26260 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
26270 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70  , aMoveOp[pX->op
26280 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61  -TK_GT], iCur, a
26290 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
262a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
262b0 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
262c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
262d0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
262e0 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
262f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
26300 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
26310 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
26320 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
26330 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
26340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26350 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26360 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
26370 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
26380 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
26390 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
263a0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
263b0 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20  r *pX;.      pX 
263c0 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
263d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
263e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
263f0 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  rt( pEnd->leftCu
26400 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
26410 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
26420 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
26430 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
26440 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
26450 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45  62 */.      memE
26460 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
26470 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
26480 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
26490 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
264a0 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
264b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
264c0 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
264d0 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
264e0 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
264f0 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
26500 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
26510 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
26520 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
26530 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
26540 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
26550 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
26560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
26570 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
26580 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
26590 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
265a0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
265b0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
265c0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
265d0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
265e0 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69 66 28  = start;.    if(
265f0 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20 70 45   pStart==0 && pE
26600 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nd==0 ){.      p
26610 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
26620 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
26630 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
26640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
26650 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
26660 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
26670 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
26680 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52  Noop ){.      iR
26690 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
266a0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
266b0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
266c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
266d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
266e0 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
266f0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
26700 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
26710 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
26720 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
26730 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
26740 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
26750 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
26760 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
26770 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
26780 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
26790 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
267a0 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
267b0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
267c0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
267d0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
267e0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
267f0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
26800 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a  E_COLUMN_EQ) ){.
26810 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41      /* Case 3: A
26820 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69   scan using an i
26830 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
26840 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
26850 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79  WHERE clause may
26860 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72   contain zero or
26870 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a   more equality .
26880 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
26890 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49  erms ("==" or "I
268a0 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68  N" operators) th
268b0 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
268c0 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  N.    **        
268d0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
268e0 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
268f0 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
26900 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tain.    **     
26910 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
26920 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
26930 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
26940 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a  he indexed.    *
26950 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
26960 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
26970 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20  y follows the N 
26980 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79  equalities. Only
26990 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
269a0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
269b0 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
269c0 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
269d0 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
269e0 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
269f0 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22  he "==" and "IN"
26a00 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20   operators. For 
26a10 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
26a20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
26a30 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
26a40 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
26a50 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
26a60 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  are all .    ** 
26a70 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65          optimize
26a80 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
26a90 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
26aa0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
26ab0 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
26ac0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
26ad0 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   x=5 AND y<10.  
26ae0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
26af0 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20  x=5 AND y>5 AND 
26b00 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
26b10 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
26b20 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20  =5 AND z<=10.   
26b30 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
26b40 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d     The z<10 term
26b50 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
26b60 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  g cannot be used
26b70 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  , only.    **   
26b80 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65        the x=5 te
26b90 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rm:.    **.    *
26ba0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
26bb0 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a   AND z<10.    **
26bc0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
26bd0 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66  N may be zero if
26be0 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
26bf0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
26c00 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s..    **       
26c10 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
26c20 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
26c30 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e  straints, then N
26c40 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20   is at.    **   
26c50 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
26c60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
26c70 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
26c80 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
26c90 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
26ca0 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
26cb0 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
26cc0 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
26cd0 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
26ce0 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
26cf0 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
26d00 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
26d10 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
26d20 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
26d30 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20  R BY..    */  . 
26d40 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
26d50 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  u8 aStartOp[] = 
26d60 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
26d70 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
26d80 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
26d90 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
26da0 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
26db0 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
26dc0 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26de0 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
26df0 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
26e00 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
26e10 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c        OP_SeekGt,
26e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
26e30 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
26e40 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
26e50 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
26e60 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20      OP_SeekLt,  
26e70 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
26e80 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
26e90 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
26ea0 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
26eb0 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20    OP_SeekGe,    
26ec0 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
26ed0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
26ee0 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
26ef0 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
26f00 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20  OP_SeekLe       
26f10 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
26f20 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
26f30 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
26f40 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
26f50 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
26f60 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  u8 aEndOp[] = {.
26f70 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20        OP_Noop,  
26f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
26f90 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e   (!end_constrain
26fa0 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ts) */.      OP_
26fb0 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20  IdxGE,          
26fc0 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e    /* 1: (end_con
26fd0 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65  straints && !bRe
26fe0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  v) */.      OP_I
26ff0 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  dxLT            
27000 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
27010 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29  traints && bRev)
27020 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   */.    };.    i
27030 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
27040 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e  >plan.nEq;  /* N
27050 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
27060 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  N terms */.    i
27070 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20  nt isMinQuery = 
27080 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  0;          /* I
27090 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
270a0 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
270b0 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  n(x).. */.    in
270c0 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
270d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
270e0 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
270f0 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
27100 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  alues */.    int
27110 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
27120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
27130 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  p register */.  
27140 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
27150 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
27160 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
27170 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
27180 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
27190 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
271a0 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
271b0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
271c0 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
271d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
271e0 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
271f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
27200 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
27210 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
27220 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
27230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27240 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
27250 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
27260 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
27270 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
27280 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
27290 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
272a0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
272b0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
272c0 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
272d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
272e0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
272f0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
27300 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
27310 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
27320 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
27330 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
27340 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
27350 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
27360 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
27370 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
27380 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
27390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
273a0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
273b0 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
273c0 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
273d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273e0 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
273f0 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
27400 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27420 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
27430 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
27440 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
27450 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20  ar *zEndAff;    
27460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
27470 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
27480 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
27490 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20  nt */..    pIdx 
274a0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
274b0 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43  .pIdx;.    iIdxC
274c0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
274d0 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20 28 6e  xCur;.    k = (n
274e0 45 71 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  Eq==pIdx->nColum
274f0 6e 20 3f 20 2d 31 20 3a 20 70 49 64 78 2d 3e 61  n ? -1 : pIdx->a
27500 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3b 0a 0a  iColumn[nEq]);..
27510 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
27520 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
27530 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
27540 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
27550 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
27560 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
27570 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
27580 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
27590 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
275a0 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
275b0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
275c0 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
275d0 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
275e0 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
275f0 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
27600 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
27610 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
27620 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
27630 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
27640 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
27650 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
27660 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
27670 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
27680 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
27690 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
276a0 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
276b0 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
276c0 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
276d0 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
276e0 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 26  if( (wctrlFlags&
276f0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
27700 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  N)!=0.     && (p
27710 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
27720 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 45  ags&WHERE_ORDERE
27730 44 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78  D).     && (pIdx
27740 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20  ->nColumn>nEq). 
27750 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61     ){.      /* a
27760 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
27770 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a  >nExpr==1 ); */.
27780 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
27790 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
277a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
277b0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
277c0 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  Eq] ); */.      
277d0 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a  isMinQuery = 1;.
277e0 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
277f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
27800 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
27810 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
27820 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
27830 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
27840 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
27850 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
27860 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
27870 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
27880 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
27890 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20      pRangeEnd = 
278a0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
278b0 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
278c0 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20   (WO_LT|WO_LE), 
278d0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78  pIdx);.      nEx
278e0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
278f0 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
27900 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
27910 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
27920 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
27930 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d  Start = findTerm
27940 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
27950 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c  otReady, (WO_GT|
27960 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a 20  WO_GE), pIdx);. 
27970 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
27980 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
27990 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
279a0 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
279b0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
279c0 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
279d0 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65      ** and store
279e0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
279f0 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  hose terms in an
27a00 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
27a10 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
27a20 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a  ing at regBase..
27a30 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61      */.    regBa
27a40 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61  se = codeAllEqua
27a50 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20 20 20  lityTerms(.     
27a60 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65 76 65     pParse, pLeve
27a70 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61 64 79  l, pWC, notReady
27a80 2c 20 6e 45 78 74 72 61 52 65 67 2c 20 26 7a 53  , nExtraReg, &zS
27a90 74 61 72 74 41 66 66 0a 20 20 20 20 29 3b 0a 20  tartAff.    );. 
27aa0 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c     zEndAff = sql
27ab0 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
27ac0 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41  rse->db, zStartA
27ad0 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  ff);.    addrNxt
27ae0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
27af0 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  xt;..    /* If w
27b00 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65  e are doing a re
27b10 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e  verse order scan
27b20 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
27b30 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a   index, or.    *
27b40 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65  * a forward orde
27b50 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63  r scan on a desc
27b60 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e  ending index, in
27b70 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20  terchange the . 
27b80 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
27b90 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
27ba0 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
27bb0 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  eEnd)..    */.  
27bc0 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d    if( (nEq<pIdx-
27bd0 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76  >nColumn && bRev
27be0 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ==(pIdx->aSortOr
27bf0 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
27c00 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c  _SO_ASC)).     |
27c10 7c 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d  | (bRev && pIdx-
27c20 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20  >nColumn==nEq). 
27c30 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50     ){.      SWAP
27c40 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52  (WhereTerm *, pR
27c50 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53  angeEnd, pRangeS
27c60 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  tart);.    }..  
27c70 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
27c80 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67  geStart && pRang
27c90 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
27ca0 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
27cb0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
27cc0 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67 65  eStart && pRange
27cd0 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
27ce0 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
27cf0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
27d00 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64  End && pRangeEnd
27d10 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
27d20 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _LE );.    testc
27d30 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
27d40 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  & pRangeEnd->eOp
27d50 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
27d60 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
27d70 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
27d80 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
27d90 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
27da0 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
27db0 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
27dc0 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
27dd0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
27de0 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
27df0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
27e00 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
27e10 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
27e20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
27e30 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
27e40 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
27e50 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
27e60 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
27e70 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
27e80 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
27e90 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
27ea0 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
27eb0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
27ec0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
27ed0 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
27ee0 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
27ef0 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77   (pRangeStart->w
27f00 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
27f10 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
27f20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
27f30 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
27f40 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
27f50 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
27f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27f70 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20   zStartAff ){.  
27f80 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
27f90 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
27fa0 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
27fb0 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
27fc0 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
27fd0 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
27fe0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
27ff0 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
28000 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
28010 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
28020 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
28030 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
28040 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
28050 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
28060 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
28070 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
28080 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
28090 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
280a0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
280b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
280c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
280d0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
280e0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
280f0 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20  zStartAff[nEq]) 
28100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  ){.          zSt
28110 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
28120 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
28130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28140 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72    .      nConstr
28150 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
28160 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
28170 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
28180 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
28190 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
281a0 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  662 */.    }else
281b0 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20   if( isMinQuery 
281c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
281d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
281e0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
281f0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43  e+nEq);.      nC
28200 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
28210 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a     startEq = 0;.
28220 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73        start_cons
28230 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20  traints = 1;.   
28240 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79   }.    codeApply
28250 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
28260 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
28270 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41 66 66  raint, zStartAff
28280 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61  );.    op = aSta
28290 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73  rtOp[(start_cons
282a0 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73  traints<<2) + (s
282b0 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65  tartEq<<1) + bRe
282c0 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  v];.    assert( 
282d0 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  op!=0 );.    tes
282e0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65  tcase( op==OP_Re
282f0 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65 73 74  wind );.    test
28300 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73  case( op==OP_Las
28310 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
28320 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74  e( op==OP_SeekGt
28330 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
28340 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20  ( op==OP_SeekGe 
28350 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
28360 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29   op==OP_SeekLe )
28370 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
28380 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b  op==OP_SeekLt );
28390 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
283a0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
283b0 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
283c0 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
283d0 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f  straint);..    /
283e0 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65  * Load the value
283f0 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c   for the inequal
28400 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
28410 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
28420 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69  .    ** range (i
28430 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
28440 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
28450 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
28460 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20  angeEnd ){.     
28470 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
28480 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72  pRangeEnd->pExpr
28490 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
284a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
284b0 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  Remove(pParse, r
284c0 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a  egBase+nEq, 1);.
284d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
284e0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
284f0 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
28500 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  q);.      if( (p
28510 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
28520 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
28530 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
28540 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
28550 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
28560 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
28570 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
28580 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64  }.      if( zEnd
28590 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
285a0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
285b0 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
285c0 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d  , zEndAff[nEq])=
285d0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
285e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
285f0 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
28600 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
28610 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
28620 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
28630 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
28640 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
28650 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
28660 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
28670 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
28680 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
28690 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
286a0 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
286b0 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
286c0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
286d0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
286e0 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
286f0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
28700 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71  ght, zEndAff[nEq
28710 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
28720 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53  zEndAff[nEq] = S
28730 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
28740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28750 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65 41 70  }  .      codeAp
28760 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
28770 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71  se, regBase, nEq
28780 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20  +1, zEndAff);.  
28790 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
287a0 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
287b0 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  e( pRangeEnd->wt
287c0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
287d0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
287e0 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
287f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28800 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
28810 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  db, zStartAff);.
28820 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
28830 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 45  e(pParse->db, zE
28840 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20  ndAff);..    /* 
28850 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
28860 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76  body */.    pLev
28870 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
28880 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
28890 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  v);..    /* Chec
288a0 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
288b0 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
288c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
288d0 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20  ge. */.    op = 
288e0 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e  aEndOp[(pRangeEn
288f0 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b  d || nEq) * (1 +
28900 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73   bRev)];.    tes
28910 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f  tcase( op==OP_No
28920 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  op );.    testca
28930 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  se( op==OP_IdxGE
28940 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
28950 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  ( op==OP_IdxLT )
28960 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50  ;.    if( op!=OP
28970 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
28980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
28990 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Int(v, op, iIdxC
289a0 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67  ur, addrNxt, reg
289b0 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
289c0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
289d0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
289e0 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a   endEq!=bRev ?1:
289f0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
28a00 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69  * If there are i
28a10 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
28a20 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61  aints, check tha
28a30 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  t the value.    
28a40 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
28a50 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
28a60 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72  inequality contr
28a70 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ains is not NULL
28a80 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69  ..    ** If it i
28a90 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  s, jump to the n
28aa0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
28ab0 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a   the loop..    *
28ac0 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74  /.    r1 = sqlit
28ad0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
28ae0 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  rse);.    testca
28af0 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
28b00 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
28b10 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _BTM_LIMIT );.  
28b20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76    testcase( pLev
28b30 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
28b40 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
28b50 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  IT );.    if( (p
28b60 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
28b70 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
28b80 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
28b90 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20  _LIMIT))!=0 ){. 
28ba0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28bb0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
28bc0 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45  umn, iIdxCur, nE
28bd0 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  q, r1);.      sq
28be0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
28bf0 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31  v, OP_IsNull, r1
28c00 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  , addrCont);.   
28c10 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65   }.    sqlite3Re
28c20 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
28c30 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f  rse, r1);..    /
28c40 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65  * Seek the table
28c50 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75   cursor, if requ
28c60 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61  ired */.    disa
28c70 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
28c80 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
28c90 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
28ca0 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29  evel, pRangeEnd)
28cb0 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54  ;.    if( !omitT
28cc0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52  able ){.      iR
28cd0 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
28ce0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
28cf0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
28d00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28d10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28d20 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
28d30 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
28d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28d50 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
28d60 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
28d70 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
28d80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28d90 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43  2(v, OP_Seek, iC
28da0 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20  ur, iRowidReg); 
28db0 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65   /* Deferred see
28dc0 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  k */.    }..    
28dd0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
28de0 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
28df0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
28e00 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
28e10 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
28e20 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
28e30 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
28e40 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
28e50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28e60 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
28e70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
28e80 51 55 45 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  QUE ){.      pLe
28e90 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
28ea0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
28eb0 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
28ec0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50  Level->op = OP_P
28ed0 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rev;.    }else{.
28ee0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
28ef0 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
28f00 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  }.    pLevel->p1
28f10 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
28f20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
28f30 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
28f40 5f 43 4f 56 45 52 5f 53 43 41 4e 20 29 7b 0a 20  _COVER_SCAN ){. 
28f50 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
28f60 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
28f70 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
28f80 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
28f90 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
28fa0 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
28fb0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
28fc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28fd0 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
28fe0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
28ff0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
29000 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
29010 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
29020 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
29030 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
29040 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
29050 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
29060 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
29070 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
29080 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
29090 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
290a0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
290b0 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
290c0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
290d0 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
290e0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
290f0 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
29100 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
29110 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
29120 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
29130 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
29140 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
29150 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
29160 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
29170 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
29180 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
29190 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
291a0 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
291b0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
291c0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
291d0 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
291f0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
29200 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
29210 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
29220 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
29230 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
29240 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
29250 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
29260 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
29270 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
29280 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
29290 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
292a0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
292b0 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
292c0 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
292d0 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
292e0 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
292f0 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
29300 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
29310 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
29320 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
29330 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
29340 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
29350 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
29360 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
29370 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
29380 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
29390 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
293a0 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
293b0 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
293c0 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
293d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
293e0 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
293f0 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
29400 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
29410 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
29420 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
29430 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
29440 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
29450 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
29460 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
29470 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
29480 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
29490 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
294a0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
294b0 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
294c0 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
294d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
294e0 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
294f0 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
29500 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
29510 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
29520 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
29530 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
29540 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
29550 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
29560 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
29570 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
29580 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
29590 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
295a0 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
295b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
295c0 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
295d0 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
295e0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
295f0 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
29600 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
29610 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
29620 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c  erms */.    SrcL
29630 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
29640 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
29650 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
29660 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
29670 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  on */.    Index 
29680 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20  *pCov = 0;      
29690 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74         /* Potent
296a0 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ial covering ind
296b0 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ex (or NULL) */.
296c0 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20      int iCovCur 
296d0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
296e0 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65  ;  /* Cursor use
296f0 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e  d for index scan
29700 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20  s (if any) */.. 
29710 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e     int regReturn
29720 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
29730 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
29740 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69  Register used wi
29750 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  th OP_Gosub */. 
29760 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74     int regRowset
29770 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
29780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29790 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77  Register for Row
297a0 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Set object */.  
297b0 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
297c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
297d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
297e0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
297f0 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
29800 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c   iLoopBody = sql
29810 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
29820 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20  l(v);  /* Start 
29830 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  of loop body */.
29840 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74      int iRetInit
29850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29870 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52   Address of regR
29880 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20  eturn init */.  
29890 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65    int untestedTe
298a0 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rms = 0;        
298b0 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72       /* Some ter
298c0 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  ms not completel
298d0 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20  y tested */.    
298e0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29900 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29910 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  er */.    Expr *
29920 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20  pAndExpr = 0;   
29930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29940 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29  An ".. AND (...)
29950 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  " expression */.
29960 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
29970 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
29980 54 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Term;.    assert
29990 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
299a0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
299b0 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f  >eOperator==WO_O
299c0 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
299d0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
299e0 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21   & TERM_ORINFO)!
299f0 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20  =0 );.    pOrWc 
29a00 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
29a10 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65  nfo->wc;.    pLe
29a20 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74  vel->op = OP_Ret
29a30 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  urn;.    pLevel-
29a40 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b  >p1 = regReturn;
29a50 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20  ..    /* Set up 
29a60 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e  a new SrcList in
29a70 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69   pOrTab containi
29a80 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ng the table bei
29a90 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a  ng scanned.    *
29aa0 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69  * by this loop i
29ab0 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20  n the a[0] slot 
29ac0 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79  and all notReady
29ad0 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e   tables in a[1..
29ae0 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20  ] slots..    ** 
29af0 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65  This becomes the
29b00 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20   SrcList in the 
29b10 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74  recursive call t
29b20 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
29b30 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  gin()..    */.  
29b40 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
29b50 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20  evel>1 ){.      
29b60 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20  int nNotReady;  
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b80 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
29b90 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20  notReady tables 
29ba0 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
29bb0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72  SrcList_item *or
29bc0 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72  igSrc;     /* Or
29bd0 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74  iginal list of t
29be0 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e  ables */.      n
29bf0 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66  NotReady = pWInf
29c00 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76  o->nLevel - iLev
29c10 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f  el - 1;.      pO
29c20 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74  rTab = sqlite3St
29c30 61 63 6b 41 6c 6c 6f 63 52 61 77 28 70 50 61 72  ackAllocRaw(pPar
29c40 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
29c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c60 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54      sizeof(*pOrT
29c70 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73  ab)+ nNotReady*s
29c80 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b  izeof(pOrTab->a[
29c90 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0]));.      if( 
29ca0 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75  pOrTab==0 ) retu
29cb0 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20  rn notReady;.   
29cc0 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f     pOrTab->nAllo
29cd0 63 20 3d 20 28 69 31 36 29 28 6e 4e 6f 74 52 65  c = (i16)(nNotRe
29ce0 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ady + 1);.      
29cf0 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70  pOrTab->nSrc = p
29d00 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20  OrTab->nAlloc;. 
29d10 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54       memcpy(pOrT
29d20 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c  ab->a, pTabItem,
29d30 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65   sizeof(*pTabIte
29d40 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53  m));.      origS
29d50 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  rc = pWInfo->pTa
29d60 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  bList->a;.      
29d70 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74  for(k=1; k<=nNot
29d80 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20  Ready; k++){.   
29d90 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72       memcpy(&pOr
29da0 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67  Tab->a[k], &orig
29db0 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46  Src[pLevel[k].iF
29dc0 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72  rom], sizeof(pOr
29dd0 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20  Tab->a[k]));.   
29de0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
29df0 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70        pOrTab = p
29e00 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
29e10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
29e20 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f  nitialize the ro
29e30 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74 6f  wset register to
29e40 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41   contain NULL. A
29e50 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20  n SQL NULL is . 
29e60 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74     ** equivalent
29e70 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77   to an empty row
29e80 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  set..    **.    
29e90 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69  ** Also initiali
29ea0 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20  ze regReturn to 
29eb0 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72  contain the addr
29ec0 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72  ess of the instr
29ed0 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69  uction .    ** i
29ee0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
29ef0 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75  wing the OP_Retu
29f00 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  rn at the bottom
29f10 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68   of the loop. Th
29f20 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71  is.    ** is req
29f30 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f  uired in a few o
29f40 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e  bscure LEFT JOIN
29f50 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e   cases where con
29f60 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a  trol jumps.    *
29f70 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f  * over the top o
29f80 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20  f the loop into 
29f90 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20  the body of it. 
29fa0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
29fb0 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74   .    ** correct
29fc0 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68   response for th
29fd0 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f  e end-of-loop co
29fe0 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72  de (the OP_Retur
29ff0 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a  n) is to .    **
2a000 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
2a010 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2a020 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61  ction, just as a
2a030 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69  n OP_Next does i
2a040 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20  f.    ** called 
2a050 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  on an uninitiali
2a060 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20  zed cursor..    
2a070 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74 72  */.    if( (wctr
2a080 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
2a090 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
2a0a0 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77   ){.      regRow
2a0b0 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
2a0c0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
2a0d0 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
2a0e0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
2a0f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a100 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
2a110 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a  gRowset);.    }.
2a120 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73      iRetInit = s
2a130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a140 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2a150 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  0, regReturn);..
2a160 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72      /* If the or
2a170 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  iginal WHERE cla
2a180 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20  use is z of the 
2a190 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32  form:  (x1 OR x2
2a1a0 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20   OR ...) AND y. 
2a1b0 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65     ** Then for e
2a1c0 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76  very term xN, ev
2a1d0 61 6c 75 61 74 65 20 61 73 20 74 68 65 20 73 75  aluate as the su
2a1e0 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20  bexpression: xN 
2a1f0 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61  AND z.    ** Tha
2a200 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20  t way, terms in 
2a210 79 20 74 68 61 74 20 61 72 65 20 66 61 63 74 6f  y that are facto
2a220 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73  red into the dis
2a230 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20  junction will.  
2a240 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75    ** be picked u
2a250 70 20 62 79 20 74 68 65 20 72 65 63 75 72 73 69  p by the recursi
2a260 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ve calls to sqli
2a270 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2a280 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20  below..    **.  
2a290 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65    ** Actually, e
2a2a0 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f  ach subexpressio
2a2b0 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74  n is converted t
2a2c0 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65  o "xN AND w" whe
2a2d0 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74  re w is.    ** t
2a2e0 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22  he "interesting"
2a2f0 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65   terms of z - te
2a300 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74  rms that did not
2a310 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
2a320 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55  e.    ** ON or U
2a330 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
2a340 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20   LEFT JOIN, and 
2a350 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 75  terms that are u
2a360 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a  sable as .    **
2a370 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
2a380 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  .    if( pWC->nT
2a390 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  erm>1 ){.      i
2a3a0 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt iTerm;.      
2a3b0 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65  for(iTerm=0; iTe
2a3c0 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  rm<pWC->nTerm; i
2a3d0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
2a3e0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
2a3f0 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78  WC->a[iTerm].pEx
2a400 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
2a410 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2a420 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
2a430 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  in) ) continue;.
2a440 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43 2d          if( pWC-
2a450 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
2a460 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
2a470 4c 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29  L|TERM_ORINFO) )
2a480 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2a490 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
2a4a0 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20  Term].eOperator 
2a4b0 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63  & WO_ALL)==0 ) c
2a4c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2a4d0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
2a4e0 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
2a4f0 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
2a500 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20         pAndExpr 
2a510 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2a520 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e  (pParse->db, pAn
2a530 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  dExpr, pExpr);. 
2a540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a550 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
2a560 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
2a570 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2a580 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20  rse, TK_AND, 0, 
2a590 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20  pAndExpr, 0);.  
2a5a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2a5b0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
2a5c0 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  rWc->nTerm; ii++
2a5d0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
2a5e0 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70  rm *pOrTerm = &p
2a5f0 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  OrWc->a[ii];.   
2a600 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
2a610 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
2a620 20 7c 7c 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70   || pOrTerm->eOp
2a630 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29  erator==WO_AND )
2a640 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49  {.        WhereI
2a650 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20  nfo *pSubWInfo; 
2a660 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
2a670 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74   for single OR-t
2a680 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  erm scan */.    
2a690 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70      Expr *pOrExp
2a6a0 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  r = pOrTerm->pEx
2a6b0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
2a6c0 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
2a6d0 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
2a6e0 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72 3b  pLeft = pOrExpr;
2a6f0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45 78  .          pOrEx
2a700 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a 20  pr = pAndExpr;. 
2a710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a720 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
2a730 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
2a740 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
2a750 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
2a760 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73     pSubWInfo = s
2a770 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2a780 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c  (pParse, pOrTab,
2a790 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a   pOrExpr, 0, 0,.
2a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7b0 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d          WHERE_OM
2a7c0 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20  IT_OPEN_CLOSE | 
2a7d0 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c  WHERE_AND_ONLY |
2a7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a7f0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 46           WHERE_F
2a800 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48 45  ORCE_TABLE | WHE
2a810 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
2a820 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20  , iCovCur);.    
2a830 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
2a840 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d  WInfo || pParse-
2a850 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
2a860 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2a870 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  d );.        if(
2a880 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20   pSubWInfo ){.  
2a890 20 20 20 20 20 20 20 20 57 68 65 72 65 4c 65 76          WhereLev
2a8a0 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 20 20  el *pLvl;.      
2a8b0 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
2a8c0 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  an(.            
2a8d0 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62    pParse, pOrTab
2a8e0 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  , &pSubWInfo->a[
2a8f0 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76  0], iLevel, pLev
2a900 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20  el->iFrom, 0.   
2a910 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2a920 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2a930 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
2a940 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
2a950 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2a960 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f   iSet = ((ii==pO
2a970 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31  rWc->nTerm-1)?-1
2a980 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  :ii);.          
2a990 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
2a9a0 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
2a9b0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
2a9c0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  n(pParse, pTabIt
2a9d0 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43  em->pTab, -1, iC
2a9e0 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ur, .           
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2aa10 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20  gRowid, 0);.    
2aa20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2aa30 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
2aa40 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72  OP_RowSetTest, r
2aa50 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20  egRowset,.      
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2aa80 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2aa90 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29  r(v)+2, r, iSet)
2aaa0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2aab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2aac0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2aad0 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
2aae0 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
2aaf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ab00 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
2ab10 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
2ab20 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
2ab30 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
2ab40 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
2ab50 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
2ab60 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
2ab70 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
2ab80 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
2ab90 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
2aba0 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
2abb0 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
2abc0 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
2abd0 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
2abe0 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
2abf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2ac00 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
2ac10 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
2ac20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
2ac30 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
2ac40 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  /* If all of the
2ac50 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
2ac60 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  rms are optimize
2ac70 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
2ac80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
2ac90 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64  dex, and the ind
2aca0 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  ex is opened usi
2acb0 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73  ng the same curs
2acc0 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
2acd0 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63      ** by each c
2ace0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
2acf0 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20  ereBegin() made 
2ad00 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74  by this loop, it
2ad10 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a   may.          *
2ad20 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
2ad30 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20   use that index 
2ad40 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
2ad50 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
2ad60 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
2ad70 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  f the call to sq
2ad80 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2ad90 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64  ) above resulted
2ada0 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a   in a scan that.
2adb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
2adc0 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  s an index, and 
2add0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74  this is either t
2ade0 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e  he first OR-conn
2adf0 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20  ected term.     
2ae00 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
2ae10 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69  d or the index i
2ae20 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
2ae30 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70  at used by all p
2ae40 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
2ae50 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20    ** terms, set 
2ae60 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64  pCov to the cand
2ae70 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
2ae80 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c  ndex. Otherwise,
2ae90 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20   set .          
2aea0 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20  ** pCov to NULL 
2aeb0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
2aec0 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f   no candidate co
2aed0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c  vering index wil
2aee0 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
2aef0 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  be available..  
2af00 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2af10 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 75       pLvl = &pSu
2af20 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 3b 0a 20 20  bWInfo->a[0];.  
2af30 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 76          if( (pLv
2af40 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2af50 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2af60 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
2af70 26 20 28 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 77 73  & (pLvl->plan.ws
2af80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
2af90 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 0a 20 20 20  MP_INDEX)==0.   
2afa0 20 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d          && (ii==
2afb0 30 20 7c 7c 20 70 4c 76 6c 2d 3e 70 6c 61 6e 2e  0 || pLvl->plan.
2afc0 75 2e 70 49 64 78 3d 3d 70 43 6f 76 29 0a 20 20  u.pIdx==pCov).  
2afd0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2afe0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2aff0 4c 76 6c 2d 3e 69 49 64 78 43 75 72 3d 3d 69 43  Lvl->iIdxCur==iC
2b000 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20  ovCur );.       
2b010 20 20 20 20 20 70 43 6f 76 20 3d 20 70 4c 76 6c       pCov = pLvl
2b020 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
2b030 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2b040 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
2b050 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2b060 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
2b070 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20  Finish the loop 
2b080 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
2b090 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
2b0a0 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
2b0b0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
2b0c0 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62  te3WhereEnd(pSub
2b0d0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
2b0e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2b0f0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43      pLevel->u.pC
2b100 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20  ovidx = pCov;.  
2b110 20 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65    if( pCov ) pLe
2b120 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
2b130 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20  CovCur;.    if( 
2b140 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20  pAndExpr ){.    
2b150 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
2b160 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
2b170 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
2b180 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45  Parse->db, pAndE
2b190 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
2b1a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2b1b0 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c  eP1(v, iRetInit,
2b1c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2b1d0 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
2b1e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b1f0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
2b200 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
2b210 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
2b220 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2b230 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  v, iLoopBody);..
2b240 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2b250 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74  nLevel>1 ) sqlit
2b260 65 33 53 74 61 63 6b 46 72 65 65 28 70 50 61 72  e3StackFree(pPar
2b270 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b  se->db, pOrTab);
2b280 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74  .    if( !untest
2b290 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c  edTerms ) disabl
2b2a0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
2b2b0 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  erm);.  }else.#e
2b2c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2b2d0 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
2b2e0 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20  ION */..  {.    
2b2f0 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65 72  /* Case 5:  Ther
2b300 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
2b310 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
2b320 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
2b330 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
2b340 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
2b350 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
2b360 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
2b370 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50  8 aStep[] = { OP
2b380 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d  _Next, OP_Prev }
2b390 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
2b3a0 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d  st u8 aStart[] =
2b3b0 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50   { OP_Rewind, OP
2b3c0 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73  _Last };.    ass
2b3d0 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20  ert( bRev==0 || 
2b3e0 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61  bRev==1 );.    a
2b3f0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
2b400 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65  ==0 );.    pLeve
2b410 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52  l->op = aStep[bR
2b420 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ev];.    pLevel-
2b430 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
2b440 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b  pLevel->p2 = 1 +
2b450 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b460 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65  p2(v, aStart[bRe
2b470 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  v], iCur, addrBr
2b480 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
2b490 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
2b4a0 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
2b4b0 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52  STEP;.  }.  notR
2b4c0 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
2b4d0 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20  (pWC->pMaskSet, 
2b4e0 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73  iCur);..  /* Ins
2b4f0 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
2b500 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
2b510 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
2b520 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
2b530 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
2b540 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
2b550 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  of tables..  **.
2b560 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
2b570 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d  ION-OF: R-49525-
2b580 35 30 39 33 35 20 54 65 72 6d 73 20 74 68 61 74  50935 Terms that
2b590 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73   cannot be satis
2b5a0 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a  fied through.  *
2b5b0 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64  * the use of ind
2b5c0 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74  ices become test
2b5d0 73 20 74 68 61 74 20 61 72 65 20 65 76 61 6c 75  s that are evalu
2b5e0 61 74 65 64 20 61 67 61 69 6e 73 74 20 65 61 63  ated against eac
2b5f0 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68  h row of.  ** th
2b600 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74  e relevant input
2b610 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
2b620 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
2b630 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
2b640 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
2b650 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
2b660 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2b670 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
2b680 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
2b690 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35   /* IMP: R-30575
2b6a0 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74 65  -11662 */.    te
2b6b0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
2b6c0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
2b6d0 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  DED );.    if( p
2b6e0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
2b6f0 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
2b700 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
2b710 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
2b720 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
2b730 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
2b740 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2b750 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
2b760 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20  edTerms==0.     
2b770 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
2b780 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2b790 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
2b7a0 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20  E_ONLY)!=0 );.  
2b7b0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65      pWInfo->unte
2b7c0 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20  stedTerms = 1;. 
2b7d0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2b7e0 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54     }.    pE = pT
2b7f0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
2b800 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
2b810 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
2b820 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
2b830 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2b840 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
2b850 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
2b860 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  e;.    }.    sql
2b870 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
2b880 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72  pParse, pE, addr
2b890 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
2b8a0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54  PIFNULL);.    pT
2b8b0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
2b8c0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a  TERM_CODED;.  }.
2b8d0 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54  .  /* For a LEFT
2b8e0 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
2b8f0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
2b900 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
2b910 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61  fact that.  ** a
2b920 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
2b930 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
2b940 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
2b950 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
2b960 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
2b970 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
2b980 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
2b990 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
2b9a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2b9b0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
2b9c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b9d0 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
2b9e0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
2b9f0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2ba00 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
2ba10 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
2ba20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2ba30 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2ba40 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
2ba50 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57  WC->a, j=0; j<pW
2ba60 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
2ba70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74  Term++){.      t
2ba80 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
2ba90 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
2baa0 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d  IRTUAL );  /* IM
2bab0 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  P: R-30575-11662
2bac0 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
2bad0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
2bae0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
2baf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
2bb00 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
2bb10 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
2bb20 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
2bb30 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
2bb40 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
2bb50 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
2bb60 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2bb70 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
2bb80 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20  edTerms );.     
2bb90 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2bba0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2bbb0 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  t( pTerm->pExpr 
2bbc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2bbd0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2bbe0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
2bbf0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
2bc00 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2bc10 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
2bc20 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
2bc30 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
2bc40 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2bc50 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
2bc60 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72  eleaseReg);..  r
2bc70 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a  eturn notReady;.
2bc80 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
2bc90 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
2bca0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2bcb0 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61  variable holds a
2bcc0 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f   text descriptio
2bcd0 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20  n of query plan 
2bce0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20  generated.** by 
2bcf0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
2bd00 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
2bd10 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61  hereBegin().  Ea
2bd20 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65  ch call to Where
2bd30 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69  Begin.** overwri
2bd40 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  tes the previous
2bd50 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
2bd60 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20  ion is used for 
2bd70 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61  testing and.** a
2bd80 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
2bd90 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75  .char sqlite3_qu
2bda0 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34  ery_plan[BMS*2*4
2bdb0 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  0];  /* Text of 
2bdc0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74  the join */.stat
2bdd0 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20  ic int nQPlan = 
2bde0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2bdf0 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f  /* Next free slo
2be00 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e  w in _query_plan
2be10 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  [] */..#endif /*
2be20 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
2be30 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
2be40 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
2be50 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
2be60 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
2be70 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
2be80 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
2be90 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57  .  if( ALWAYS(pW
2bea0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74  Info) ){.    int
2beb0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
2bec0 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
2bed0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
2bee0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
2bef0 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66  o *pInfo = pWInf
2bf00 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f  o->a[i].pIdxInfo
2bf10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
2bf20 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
2bf30 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e  assert( pInfo->n
2bf40 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d  eedToFreeIdxStr=
2bf50 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
2bf60 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20 20  Failed ); */.   
2bf70 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e       if( pInfo->
2bf80 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2bf90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2bfa0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f  lite3_free(pInfo
2bfb0 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  ->idxStr);.     
2bfc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2bfd0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2bfe0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Info);.      }. 
2bff0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
2c000 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61  >a[i].plan.wsFla
2c010 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
2c020 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20  INDEX ){.       
2c030 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
2c040 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e  WInfo->a[i].plan
2c050 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 20  .u.pIdx;.       
2c060 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
2c070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
2c080 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 7a  Free(db, pIdx->z
2c090 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 20  ColAff);.       
2c0a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2c0b0 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  (db, pIdx);.    
2c0c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c0d0 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43 6c 61    }.    whereCla
2c0e0 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66 6f 2d  useClear(pWInfo-
2c0f0 3e 70 57 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pWC);.    sqlit
2c100 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
2c110 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  nfo);.  }.}.../*
2c120 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
2c130 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2c140 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
2c150 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
2c160 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
2c170 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
2c180 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2c190 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
2c1a0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
2c1b0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
2c1c0 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
2c1d0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
2c1e0 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
2c1f0 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
2c200 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
2c210 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
2c220 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
2c230 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2c240 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
2c250 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
2c260 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
2c270 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
2c280 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2c290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2c2a0 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
2c2b0 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
2c2c0 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
2c2d0 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
2c2e0 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
2c2f0 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
2c300 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
2c310 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
2c320 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
2c330 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
2c340 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
2c350 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
2c360 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
2c370 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
2c380 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
2c390 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
2c3a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
2c3b0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
2c3c0 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
2c3d0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
2c3e0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
2c3f0 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
2c400 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
2c410 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
2c420 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
2c430 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
2c440 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
2c450 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
2c460 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
2c470 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
2c480 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
2c490 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
2c4a0 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
2c4b0 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
2c4c0 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
2c4d0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2c4e0 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
2c4f0 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
2c500 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
2c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c520 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
2c530 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
2c540 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
2c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c560 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
2c570 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
2c580 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
2c590 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
2c5a0 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
2c5b0 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
2c5c0 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
2c5d0 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
2c5e0 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
2c5f0 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
2c600 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
2c610 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
2c620 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
2c630 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
2c640 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
2c650 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
2c660 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
2c670 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
2c680 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
2c690 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
2c6a0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
2c6b0 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
2c6c0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
2c6d0 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
2c6e0 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
2c6f0 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
2c700 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
2c710 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
2c720 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
2c730 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
2c740 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
2c750 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
2c760 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
2c770 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
2c780 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
2c790 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
2c7a0 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
2c7b0 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
2c7c0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
2c7d0 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
2c7e0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
2c7f0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2c800 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
2c810 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
2c820 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
2c830 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
2c840 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
2c850 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
2c860 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
2c870 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
2c880 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
2c890 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
2c8a0 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
2c8b0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
2c8c0 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
2c8d0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
2c8e0 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
2c8f0 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
2c900 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
2c910 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
2c920 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
2c930 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
2c940 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
2c950 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
2c960 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
2c970 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
2c980 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
2c990 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
2c9a0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
2c9b0 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
2c9c0 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
2c9d0 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
2c9e0 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
2c9f0 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
2ca00 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
2ca10 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
2ca20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
2ca30 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
2ca40 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
2ca50 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
2ca60 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
2ca70 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2ca80 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
2ca90 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
2caa0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2cab0 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
2cac0 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
2cad0 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
2cae0 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
2caf0 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
2cb00 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
2cb10 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
2cb20 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
2cb30 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2cb40 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
2cb50 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
2cb60 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
2cb70 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
2cb80 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
2cb90 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
2cba0 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
2cbb0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
2cbc0 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
2cbd0 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
2cbe0 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
2cbf0 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
2cc00 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
2cc10 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
2cc20 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
2cc30 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
2cc40 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
2cc50 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
2cc60 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2cc70 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
2cc80 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
2cc90 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
2cca0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
2ccb0 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
2ccc0 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
2ccd0 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
2cce0 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
2ccf0 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
2cd00 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
2cd10 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
2cd20 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
2cd30 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
2cd40 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
2cd50 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
2cd60 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
2cd70 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
2cd80 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
2cd90 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
2cda0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
2cdb0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
2cdc0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2cdd0 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65  ent,.** if there
2cde0 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
2cdf0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
2ce00 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
2ce10 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
2ce20 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
2ce30 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
2ce40 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
2ce50 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55  n pOrderBy is NU
2ce60 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
2ce70 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
2ce80 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61  d so that the na
2ce90 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64  tural output ord
2cea0 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  er of the table.
2ceb0 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65  ** scan is corre
2cec0 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  ct for the ORDER
2ced0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
2cee0 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20 75   that index is u
2cef0 73 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  sed and.** the r
2cf00 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66  eturned WhereInf
2cf10 6f 2e 6e 4f 42 53 61 74 20 66 69 65 6c 64 20 69  o.nOBSat field i
2cf20 73 20 73 65 74 20 74 6f 20 70 4f 72 64 65 72 42  s set to pOrderB
2cf30 79 2d 3e 6e 45 78 70 72 2e 20 20 54 68 69 73 0a  y->nExpr.  This.
2cf40 2a 2a 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** is an optimiz
2cf50 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65  ation that preve
2cf60 6e 74 73 20 61 6e 20 75 6e 6e 65 63 65 73 73 61  nts an unnecessa
2cf70 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72  ry sort of the r
2cf80 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 69 66 20  esult set.** if 
2cf90 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72  an index appropr
2cfa0 69 61 74 65 20 66 6f 72 20 74 68 65 20 4f 52 44  iate for the ORD
2cfb0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72  ER BY clause alr
2cfc0 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  eady exists..**.
2cfd0 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20  ** If the where 
2cfe0 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e  clause loops can
2cff0 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20  not be arranged 
2d000 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63  to provide the c
2d010 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74  orrect.** output
2d020 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 57 68 65   order, then Whe
2d030 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74 20 69 73  reInfo.nOBSat is
2d040 20 30 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f   0..*/.WhereInfo
2d050 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
2d060 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
2d070 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
2d080 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
2d090 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
2d0a0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
2d0b0 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
2d0c0 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
2d0d0 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
2d0e0 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
2d0f0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2d100 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
2d110 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
2d120 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   An ORDER BY cla
2d130 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
2d140 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
2d150 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20 73  tinct,  /* The s
2d160 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f 72 20 44  elect-list for D
2d170 49 53 54 49 4e 43 54 20 71 75 65 72 69 65 73 20  ISTINCT queries 
2d180 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75  - or NULL */.  u
2d190 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  16 wctrlFlags,  
2d1a0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
2d1b0 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
2d1c0 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
2d1d0 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
2d1e0 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20   iIdxCur        
2d1f0 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
2d200 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
2d210 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
2d220 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
2d230 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
2d240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2d250 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
2d260 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
2d270 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
2d280 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
2d290 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d2a0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
2d2b0 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
2d2c0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2d2d0 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
2d2e0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
2d2f0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
2d300 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
2d310 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2d320 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
2d330 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
2d340 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
2d350 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
2d360 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
2d370 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
2d380 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
2d390 64 20 2a 2f 0a 20 20 57 68 65 72 65 42 65 73 74  d */.  WhereBest
2d3a0 49 64 78 20 73 57 42 49 3b 20 20 20 20 20 20 20  Idx sWBI;       
2d3b0 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
2d3c0 73 65 61 72 63 68 20 63 6f 6e 74 65 78 74 20 2a  search context *
2d3d0 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
2d3e0 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
2d3f0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
2d400 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
2d410 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
2d420 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  l;        /* A s
2d430 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70  ingle level in p
2d440 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  WInfo->a[] */.  
2d450 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20  int iFrom;      
2d460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2d470 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20  rst unused FROM 
2d480 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a  clause element *
2d490 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73  /.  int andFlags
2d4a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2d4b0 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61  * AND-ed combina
2d4c0 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d  tion of all pWC-
2d4d0 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a  >a[].wtFlags */.
2d4e0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
2d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d500 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2d510 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
2d520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d530 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
2d540 69 6f 6e 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61  ion */...  /* Va
2d550 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a  riable initializ
2d560 61 74 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 73 65  ation */.  memse
2d570 74 28 26 73 57 42 49 2c 20 30 2c 20 73 69 7a 65  t(&sWBI, 0, size
2d580 6f 66 28 73 57 42 49 29 29 3b 0a 20 20 73 57 42  of(sWBI));.  sWB
2d590 49 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  I.pParse = pPars
2d5a0 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d  e;..  /* The num
2d5b0 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
2d5c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2d5d0 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
2d5e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
2d5f0 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
2d600 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
2d610 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
2d620 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
2d630 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
2d640 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
2d650 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2d660 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
2d670 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
2d680 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
2d690 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
2d6a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2d6b0 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
2d6c0 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
2d6d0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2d6e0 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
2d6f0 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
2d700 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
2d710 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  LY flag is set, 
2d720 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
2d730 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
2d740 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
2d750 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
2d760 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
2d770 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
2d780 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
2d790 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
2d7a0 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
2d7b0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2d7c0 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
2d7d0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2d7e0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
2d7f0 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
2d800 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
2d810 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
2d820 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
2d830 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
2d840 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
2d850 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
2d860 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
2d870 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
2d880 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
2d890 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
2d8a0 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
2d8b0 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
2d8c0 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
2d8d0 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
2d8e0 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
2d8f0 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
2d900 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
2d910 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
2d920 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
2d930 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
2d940 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
2d950 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
2d960 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
2d970 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
2d980 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
2d990 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
2d9a0 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ..  */.  db = pP
2d9b0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74  arse->db;.  nByt
2d9c0 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
2d9d0 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
2d9e0 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
2d9f0 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
2da00 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
2da10 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2da20 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 6e 42  ro(db, .      nB
2da30 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20  yteWInfo + .    
2da40 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c    sizeof(WhereCl
2da50 61 75 73 65 29 20 2b 0a 20 20 20 20 20 20 73 69  ause) +.      si
2da60 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65  zeof(WhereMaskSe
2da70 74 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62  t).  );.  if( db
2da80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2da90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
2daa0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2dab0 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
2dac0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
2dad0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
2dae0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
2daf0 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
2db00 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
2db10 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
2db20 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
2db30 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
2db40 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
2db50 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2db60 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20  ;.  pWInfo->pWC 
2db70 3d 20 73 57 42 49 2e 70 57 43 20 3d 20 28 57 68  = sWBI.pWC = (Wh
2db80 65 72 65 43 6c 61 75 73 65 20 2a 29 26 28 28 75  ereClause *)&((u
2db90 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79 74  8 *)pWInfo)[nByt
2dba0 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e 66  eWInfo];.  pWInf
2dbb0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  o->wctrlFlags = 
2dbc0 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57  wctrlFlags;.  pW
2dbd0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
2dbe0 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
2dbf0 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d  nQueryLoop;.  pM
2dc00 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65 4d  askSet = (WhereM
2dc10 61 73 6b 53 65 74 2a 29 26 73 57 42 49 2e 70 57  askSet*)&sWBI.pW
2dc20 43 5b 31 5d 3b 0a 20 20 73 57 42 49 2e 61 4c 65  C[1];.  sWBI.aLe
2dc30 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b  vel = pWInfo->a;
2dc40 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74  ..  /* Disable t
2dc50 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69  he DISTINCT opti
2dc60 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49  mization if SQLI
2dc70 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69  TE_DistinctOpt i
2dc80 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73  s set via.  ** s
2dc90 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c  qlite3_test_ctrl
2dca0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
2dcb0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e  _OPTIMIZATIONS,.
2dcc0 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..) */.  if( Opt
2dcd0 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
2dce0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73  d(db, SQLITE_Dis
2dcf0 74 69 6e 63 74 4f 70 74 29 20 29 20 70 44 69 73  tinctOpt) ) pDis
2dd00 74 69 6e 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  tinct = 0;..  /*
2dd10 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
2dd20 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
2dd30 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
2dd40 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
2dd50 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
2dd60 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
2dd70 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
2dd80 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
2dd90 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29  askSet(pMaskSet)
2dda0 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
2ddb0 6e 69 74 28 73 57 42 49 2e 70 57 43 2c 20 70 50  nit(sWBI.pWC, pP
2ddc0 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20  arse, pMaskSet, 
2ddd0 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 73  wctrlFlags);.  s
2dde0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
2ddf0 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
2de00 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65  pWhere);.  where
2de10 53 70 6c 69 74 28 73 57 42 49 2e 70 57 43 2c 20  Split(sWBI.pWC, 
2de20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
2de30 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38     /* IMP: R-158
2de40 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20 20  42-53296 */.    
2de50 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
2de60 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
2de70 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
2de80 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
2de90 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
2dea0 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
2deb0 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
2dec0 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
2ded0 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  thru..  */.  if(
2dee0 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61 62   pWhere && (nTab
2def0 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
2df00 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
2df10 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29  NotJoin(pWhere))
2df20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2df30 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2df40 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66  e, pWhere, pWInf
2df50 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54  o->iBreak, SQLIT
2df60 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
2df70 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
2df80 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20   }..  /* Assign 
2df90 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62  a bit from the b
2dfa0 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20  itmask to every 
2dfb0 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
2dfc0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
2dfd0 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e  ** When assignin
2dfe0 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  g bitmask values
2dff0 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   to FROM clause 
2e000 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74  cursors, it must
2e010 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73   be.  ** the cas
2e020 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74  e that if X is t
2e030 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
2e040 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61  he N-th FROM cla
2e050 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20  use term then.  
2e060 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  ** the bitmask f
2e070 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  or all FROM clau
2e080 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  se terms to the 
2e090 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68  left of the N-th
2e0a0 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58   term.  ** is (X
2e0b0 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73  -1).   An expres
2e0c0 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e  sion from the ON
2e0d0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
2e0e0 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20  T JOIN can use. 
2e0f0 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69   ** its Expr.iRi
2e100 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c  ghtJoinTable val
2e110 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62  ue to find the b
2e120 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69  itmask of the ri
2e130 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ght table.  ** o
2e140 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62  f the join.  Sub
2e150 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f  tracting one fro
2e160 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  m the right tabl
2e170 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20  e bitmask gives 
2e180 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66  a.  ** bitmask f
2e190 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
2e1a0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
2e1b0 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20   join.  Knowing 
2e1c0 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
2e1d0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2e1e0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61  to the left of a
2e1f0 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d   left join is im
2e200 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74  portant.  Ticket
2e210 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a   #3015..  **.  *
2e220 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * Configure the 
2e230 57 68 65 72 65 43 6c 61 75 73 65 2e 76 6d 61 73  WhereClause.vmas
2e240 6b 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68  k variable so th
2e250 61 74 20 62 69 74 73 20 74 68 61 74 20 63 6f 72  at bits that cor
2e260 72 65 73 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20  respond.  ** to 
2e270 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
2e280 72 73 6f 72 73 20 61 72 65 20 73 65 74 2e 20 54  rsors are set. T
2e290 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
2e2a0 65 6c 65 63 74 69 76 65 6c 79 20 64 69 73 61 62  electively disab
2e2b0 6c 65 20 0a 20 20 2a 2a 20 74 68 65 20 4f 52 2d  le .  ** the OR-
2e2c0 74 6f 2d 49 4e 20 74 72 61 6e 73 66 6f 72 6d 61  to-IN transforma
2e2d0 74 69 6f 6e 20 69 6e 20 65 78 70 72 41 6e 61 6c  tion in exprAnal
2e2e0 79 7a 65 4f 72 54 65 72 6d 28 29 2e 20 49 74 20  yzeOrTerm(). It 
2e2f0 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 0a  is not helpful .
2e300 20 20 2a 2a 20 77 69 74 68 20 76 69 72 74 75 61    ** with virtua
2e310 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
2e320 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
2e330 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
2e340 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
2e350 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
2e360 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
2e370 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
2e380 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
2e390 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
2e3a0 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
2e3b0 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
2e3c0 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
2e3d0 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
2e3e0 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
2e3f0 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  * WHERE_ONETABLE
2e400 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
2e410 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
2e420 28 20 73 57 42 49 2e 70 57 43 2d 3e 76 6d 61 73  ( sWBI.pWC->vmas
2e430 6b 3d 3d 30 20 26 26 20 70 4d 61 73 6b 53 65 74  k==0 && pMaskSet
2e440 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ->n==0 );.  for(
2e450 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
2e460 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
2e470 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
2e480 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
2e490 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
2e4a0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2e4b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2e4c0 42 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57 41  BLE.    if( ALWA
2e4d0 59 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  YS(pTabList->a[i
2e4e0 69 5d 2e 70 54 61 62 29 20 26 26 20 49 73 56 69  i].pTab) && IsVi
2e4f0 72 74 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e  rtual(pTabList->
2e500 61 5b 69 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20  a[ii].pTab) ){. 
2e510 20 20 20 20 20 73 57 42 49 2e 70 57 43 2d 3e 76       sWBI.pWC->v
2e520 6d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73  mask |= ((Bitmas
2e530 6b 29 31 20 3c 3c 20 69 69 29 3b 0a 20 20 20 20  k)1 << ii);.    
2e540 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  }.#endif.  }.#if
2e550 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a  ndef NDEBUG.  {.
2e560 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68      Bitmask toTh
2e570 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66  eLeft = 0;.    f
2e580 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
2e590 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
2e5a0 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
2e5b0 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   m = getMask(pMa
2e5c0 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
2e5d0 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
2e5e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2e5f0 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20  m-1)==toTheLeft 
2e600 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65  );.      toTheLe
2e610 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20  ft |= m;.    }. 
2e620 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2e630 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
2e640 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
2e650 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78  s.  Note that ex
2e660 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68  prAnalyze() migh
2e670 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76  t.  ** add new v
2e680 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74  irtual terms ont
2e690 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
2e6a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2e6b0 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77  We do not.  ** w
2e6c0 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74  ant to analyze t
2e6d0 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72  hese virtual ter
2e6e0 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61  ms, so start ana
2e6f0 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e  lyzing at the en
2e700 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20  d.  ** and work 
2e710 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20  forward so that 
2e720 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61  the added virtua
2e730 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65  l terms are neve
2e740 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  r processed..  *
2e750 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  /.  exprAnalyzeA
2e760 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 73 57 42  ll(pTabList, sWB
2e770 49 2e 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62  I.pWC);.  if( db
2e780 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e790 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
2e7a0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
2e7b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
2e7c0 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
2e7d0 69 66 69 65 72 2c 20 69 66 20 74 68 65 72 65 20  ifier, if there 
2e7e0 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e  is one, is redun
2e7f0 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69  dant. .  ** If i
2e800 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20 70  t is, then set p
2e810 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c  Distinct to NULL
2e820 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e 65   and WhereInfo.e
2e830 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a  Distinct to.  **
2e840 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2e850 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20 74  UNIQUE to tell t
2e860 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e  he caller to ign
2e870 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ore the DISTINCT
2e880 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 69  ..  */.  if( pDi
2e890 73 74 69 6e 63 74 20 26 26 20 69 73 44 69 73 74  stinct && isDist
2e8a0 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50  inctRedundant(pP
2e8b0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2e8c0 73 57 42 49 2e 70 57 43 2c 20 70 44 69 73 74 69  sWBI.pWC, pDisti
2e8d0 6e 63 74 29 20 29 7b 0a 20 20 20 20 70 44 69 73  nct) ){.    pDis
2e8e0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 70  tinct = 0;.    p
2e8f0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2e900 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2e910 54 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a 20  T_UNIQUE;.  }.. 
2e920 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65   /* Chose the be
2e930 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
2e940 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
2e950 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2e960 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
2e970 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20  s loop fills in 
2e980 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
2e990 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  elds:.  **.  ** 
2e9a0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49    pWInfo->a[].pI
2e9b0 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65  dx      The inde
2e9c0 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  x to use for thi
2e9d0 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c  s level of the l
2e9e0 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e  oop..  **   pWIn
2e9f0 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20  fo->a[].wsFlags 
2ea00 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67    WHERE_xxx flag
2ea10 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2ea20 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57  h pIdx.  **   pW
2ea30 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20  Info->a[].nEq   
2ea40 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
2ea50 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  f == and IN cons
2ea60 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70  traints.  **   p
2ea70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d  WInfo->a[].iFrom
2ea80 20 20 20 20 20 57 68 69 63 68 20 74 65 72 6d 20       Which term 
2ea90 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
2eaa0 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65  se is being code
2eab0 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  d.  **   pWInfo-
2eac0 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54  >a[].iTabCur   T
2ead0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
2eae0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2eaf0 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49  table.  **   pWI
2eb00 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72  nfo->a[].iIdxCur
2eb10 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
2eb20 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
2eb30 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2eb40 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57 68  a[].pTerm     Wh
2eb50 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f  en wsFlags==WO_O
2eb60 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65  R, the OR-clause
2eb70 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20   term.  **.  ** 
2eb80 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66  This loop also f
2eb90 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e  igures out the n
2eba0 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20  esting order of 
2ebb0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2ebc0 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a  OM.  ** clause..
2ebd0 20 20 2a 2f 0a 20 20 73 57 42 49 2e 6e 6f 74 56    */.  sWBI.notV
2ebe0 61 6c 69 64 20 3d 20 7e 28 42 69 74 6d 61 73 6b  alid = ~(Bitmask
2ebf0 29 30 3b 0a 20 20 73 57 42 49 2e 70 4f 72 64 65  )0;.  sWBI.pOrde
2ec00 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
2ec10 20 20 73 57 42 49 2e 6e 20 3d 20 6e 54 61 62 4c    sWBI.n = nTabL
2ec20 69 73 74 3b 0a 20 20 73 57 42 49 2e 70 44 69 73  ist;.  sWBI.pDis
2ec30 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63  tinct = pDistinc
2ec40 74 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20  t;.  andFlags = 
2ec50 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  ~0;.  WHERETRACE
2ec60 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
2ec70 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b   Start ***\n"));
2ec80 0a 20 20 66 6f 72 28 73 57 42 49 2e 69 3d 69 46  .  for(sWBI.i=iF
2ec90 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  rom=0, pLevel=pW
2eca0 49 6e 66 6f 2d 3e 61 3b 20 73 57 42 49 2e 69 3c  Info->a; sWBI.i<
2ecb0 6e 54 61 62 4c 69 73 74 3b 20 73 57 42 49 2e 69  nTabList; sWBI.i
2ecc0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
2ecd0 20 20 20 57 68 65 72 65 43 6f 73 74 20 62 65 73     WhereCost bes
2ece0 74 50 6c 61 6e 3b 20 20 20 20 20 20 20 20 20 2f  tPlan;         /
2ecf0 2a 20 4d 6f 73 74 20 65 66 66 69 63 69 65 6e 74  * Most efficient
2ed00 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66 61   plan seen so fa
2ed10 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  r */.    Index *
2ed20 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
2ed30 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
2ed40 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20  r FROM table at 
2ed50 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20  pTabItem */.    
2ed60 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
2ed70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ed80 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
2ed90 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  FROM tables */. 
2eda0 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d     int bestJ = -
2edb0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
2edc0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a  * The value of j
2edd0 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   */.    Bitmask 
2ede0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2edf0 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76      /* Bitmask v
2ee00 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65  alue for j or be
2ee10 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  stJ */.    int i
2ee20 73 4f 70 74 69 6d 61 6c 3b 20 20 20 20 20 20 20  sOptimal;       
2ee30 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2ee40 6f 72 20 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e  or for optimal/n
2ee50 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73 65 61 72 63  on-optimal searc
2ee60 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e  h */.    int nUn
2ee70 63 6f 6e 73 74 72 61 69 6e 65 64 3b 20 20 20 20  constrained;    
2ee80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
2ee90 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e  ables without IN
2eea0 44 45 58 45 44 20 42 59 20 2a 2f 0a 20 20 20 20  DEXED BY */.    
2eeb0 42 69 74 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78  Bitmask notIndex
2eec0 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ed;         /* M
2eed0 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68  ask of tables th
2eee0 61 74 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  at cannot use an
2eef0 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d   index */..    m
2ef00 65 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c  emset(&bestPlan,
2ef10 20 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50   0, sizeof(bestP
2ef20 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50  lan));.    bestP
2ef30 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49  lan.rCost = SQLI
2ef40 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20  TE_BIG_DBL;.    
2ef50 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
2ef60 20 42 65 67 69 6e 20 73 65 61 72 63 68 20 66 6f   Begin search fo
2ef70 72 20 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22  r loop %d ***\n"
2ef80 2c 20 73 57 42 49 2e 69 29 29 3b 0a 0a 20 20 20  , sWBI.i));..   
2ef90 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
2efa0 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 65   the remaining e
2efb0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ntries in the FR
2efc0 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 66 69 6e  OM clause to fin
2efd0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78  d the.    ** nex
2efe0 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54  t nested loop. T
2eff0 68 65 20 6c 6f 6f 70 20 74 65 73 74 73 20 61 6c  he loop tests al
2f000 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  l FROM clause en
2f010 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 65 69 74  tries.    ** eit
2f020 68 65 72 20 6f 6e 63 65 20 6f 72 20 74 77 69 63  her once or twic
2f030 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e. .    **.    *
2f040 2a 20 54 68 65 20 66 69 72 73 74 20 74 65 73 74  * The first test
2f050 20 69 73 20 61 6c 77 61 79 73 20 70 65 72 66 6f   is always perfo
2f060 72 6d 65 64 20 69 66 20 74 68 65 72 65 20 61 72  rmed if there ar
2f070 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 65 6e  e two or more en
2f080 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 72 65 6d  tries.    ** rem
2f090 61 69 6e 69 6e 67 20 61 6e 64 20 6e 65 76 65 72  aining and never
2f0a0 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68   performed if th
2f0b0 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
2f0c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
2f0d0 79 0a 20 20 20 20 2a 2a 20 74 6f 20 63 68 6f 6f  y.    ** to choo
2f0e0 73 65 20 66 72 6f 6d 2e 20 20 54 68 65 20 66 69  se from.  The fi
2f0f0 72 73 74 20 74 65 73 74 20 6c 6f 6f 6b 73 20 66  rst test looks f
2f100 6f 72 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20  or an "optimal" 
2f110 73 63 61 6e 2e 20 20 49 6e 0a 20 20 20 20 2a 2a  scan.  In.    **
2f120 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 61 6e   this context an
2f130 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 69 73   optimal scan is
2f140 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73 20 74   one that uses t
2f150 68 65 20 73 61 6d 65 20 73 74 72 61 74 65 67 79  he same strategy
2f160 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
2f170 67 69 76 65 6e 20 46 52 4f 4d 20 63 6c 61 75 73  given FROM claus
2f180 65 20 65 6e 74 72 79 20 61 73 20 77 6f 75 6c 64  e entry as would
2f190 20 62 65 20 73 65 6c 65 63 74 65 64 20 69 66 20   be selected if 
2f1a0 74 68 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a  the entry.    **
2f1b0 20 77 65 72 65 20 75 73 65 64 20 61 73 20 74 68   were used as th
2f1c0 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6e 65 73 74  e innermost nest
2f1d0 65 64 20 6c 6f 6f 70 2e 20 20 49 6e 20 6f 74 68  ed loop.  In oth
2f1e0 65 72 20 77 6f 72 64 73 2c 20 61 20 74 61 62 6c  er words, a tabl
2f1f0 65 0a 20 20 20 20 2a 2a 20 69 73 20 63 68 6f 73  e.    ** is chos
2f200 65 6e 20 73 75 63 68 20 74 68 61 74 20 74 68 65  en such that the
2f210 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67   cost of running
2f220 20 74 68 61 74 20 74 61 62 6c 65 20 63 61 6e 6e   that table cann
2f230 6f 74 20 62 65 20 72 65 64 75 63 65 64 0a 20 20  ot be reduced.  
2f240 20 20 2a 2a 20 62 79 20 77 61 69 74 69 6e 67 20    ** by waiting 
2f250 66 6f 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73  for other tables
2f260 20 74 6f 20 72 75 6e 20 66 69 72 73 74 2e 20 20   to run first.  
2f270 54 68 69 73 20 22 6f 70 74 69 6d 61 6c 22 20 74  This "optimal" t
2f280 65 73 74 20 77 6f 72 6b 73 0a 20 20 20 20 2a 2a  est works.    **
2f290 20 62 79 20 66 69 72 73 74 20 61 73 73 75 6d 69   by first assumi
2f2a0 6e 67 20 74 68 61 74 20 74 68 65 20 46 52 4f 4d  ng that the FROM
2f2b0 20 63 6c 61 75 73 65 20 69 73 20 6f 6e 20 74 68   clause is on th
2f2c0 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 6e 64  e inner loop and
2f2d0 20 66 69 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20   finding.    ** 
2f2e0 69 74 73 20 71 75 65 72 79 20 70 6c 61 6e 2c 20  its query plan, 
2f2f0 74 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 74 6f  then checking to
2f300 20 73 65 65 20 69 66 20 74 68 61 74 20 71 75 65   see if that que
2f310 72 79 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 79  ry plan uses any
2f320 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 46 52  .    ** other FR
2f330 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
2f340 74 68 61 74 20 61 72 65 20 73 57 42 49 2e 6e 6f  that are sWBI.no
2f350 74 56 61 6c 69 64 2e 20 20 49 66 20 6e 6f 20 6e  tValid.  If no n
2f360 6f 74 56 61 6c 69 64 20 74 65 72 6d 73 0a 20 20  otValid terms.  
2f370 20 20 2a 2a 20 61 72 65 20 75 73 65 64 20 74 68    ** are used th
2f380 65 6e 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22  en the "optimal"
2f390 20 71 75 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b   query plan work
2f3a0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
2f3b0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 57   Note that the W
2f3c0 68 65 72 65 43 6f 73 74 2e 6e 52 6f 77 20 70 61  hereCost.nRow pa
2f3d0 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
2f3e0 70 74 69 6d 61 6c 20 73 63 61 6e 20 6d 69 67 68  ptimal scan migh
2f3f0 74 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20  t.    ** not be 
2f400 61 73 20 73 6d 61 6c 6c 20 61 73 20 69 74 20 77  as small as it w
2f410 6f 75 6c 64 20 62 65 20 69 66 20 74 68 65 20 74  ould be if the t
2f420 61 62 6c 65 20 72 65 61 6c 6c 79 20 77 65 72 65  able really were
2f430 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 0a 20   the innermost. 
2f440 20 20 20 2a 2a 20 6a 6f 69 6e 2e 20 20 54 68 65     ** join.  The
2f450 20 6e 52 6f 77 20 76 61 6c 75 65 20 63 61 6e 20   nRow value can 
2f460 62 65 20 72 65 64 75 63 65 64 20 62 79 20 57 48  be reduced by WH
2f470 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
2f480 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74 68  raints.    ** th
2f490 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 69 6e  at do not use in
2f4a0 64 69 63 65 73 2e 20 20 42 75 74 20 74 68 69 73  dices.  But this
2f4b0 20 6e 52 6f 77 20 72 65 64 75 63 74 69 6f 6e 20   nRow reduction 
2f4c0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
2f4d0 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
2f4e0 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 20 69   really is the i
2f4f0 6e 6e 65 72 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20  nnermost join.  
2f500 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2f510 68 65 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69  he second loop i
2f520 74 65 72 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  teration is only
2f530 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f   performed if no
2f540 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20   optimal scan.  
2f550 20 20 2a 2a 20 73 74 72 61 74 65 67 69 65 73 20    ** strategies 
2f560 77 65 72 65 20 66 6f 75 6e 64 20 62 79 20 74 68  were found by th
2f570 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
2f580 6e 2e 20 54 68 69 73 20 73 65 63 6f 6e 64 20 69  n. This second i
2f590 74 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  teration.    ** 
2f5a0 69 73 20 75 73 65 64 20 74 6f 20 73 65 61 72 63  is used to searc
2f5b0 68 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 73 74  h for the lowest
2f5c0 20 63 6f 73 74 20 73 63 61 6e 20 6f 76 65 72 61   cost scan overa
2f5d0 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ll..    **.    *
2f5e0 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
2f5f0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 65  ons of SQLite pe
2f600 72 66 6f 72 6d 65 64 20 6f 6e 6c 79 20 74 68 65  rformed only the
2f610 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
2f620 6e 20 2d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e  n -.    ** the n
2f630 65 78 74 20 6f 75 74 65 72 6d 6f 73 74 20 6c 6f  ext outermost lo
2f640 6f 70 20 77 61 73 20 61 6c 77 61 79 73 20 74 68  op was always th
2f650 61 74 20 77 69 74 68 20 74 68 65 20 6c 6f 77 65  at with the lowe
2f660 73 74 20 6f 76 65 72 61 6c 6c 0a 20 20 20 20 2a  st overall.    *
2f670 2a 20 63 6f 73 74 2e 20 48 6f 77 65 76 65 72 2c  * cost. However,
2f680 20 74 68 69 73 20 6d 65 61 6e 74 20 74 68 61 74   this meant that
2f690 20 53 51 4c 69 74 65 20 63 6f 75 6c 64 20 73 65   SQLite could se
2f6a0 6c 65 63 74 20 74 68 65 20 77 72 6f 6e 67 20 70  lect the wrong p
2f6b0 6c 61 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 20 73  lan.    ** for s
2f6c0 63 72 69 70 74 73 20 73 75 63 68 20 61 73 20 74  cripts such as t
2f6d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
2f6e0 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20    **   .    **  
2f6f0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2f700 28 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20  (a, b); .    ** 
2f710 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2f720 32 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20  2(c, d);.    ** 
2f730 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2f740 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 32 2e  t2, t1 WHERE t2.
2f750 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20  rowid = t1.a;.  
2f760 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2f770 62 65 73 74 20 73 74 72 61 74 65 67 79 20 69 73  best strategy is
2f780 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2f790 75 67 68 20 74 61 62 6c 65 20 74 31 20 66 69 72  ugh table t1 fir
2f7a0 73 74 2e 20 48 6f 77 65 76 65 72 20 69 74 0a 20  st. However it. 
2f7b0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73     ** is not pos
2f7c0 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  sible to determi
2f7d0 6e 65 20 74 68 69 73 20 77 69 74 68 20 61 20 73  ne this with a s
2f7e0 69 6d 70 6c 65 20 67 72 65 65 64 79 20 61 6c 67  imple greedy alg
2f7f0 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 53  orithm..    ** S
2f800 69 6e 63 65 20 74 68 65 20 63 6f 73 74 20 6f 66  ince the cost of
2f810 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74   a linear scan t
2f820 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 32 20  hrough table t2 
2f830 69 73 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20  is the same .   
2f840 20 2a 2a 20 61 73 20 74 68 65 20 63 6f 73 74 20   ** as the cost 
2f850 6f 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  of a linear scan
2f860 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74   through table t
2f870 31 2c 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65  1, a simple gree
2f880 64 79 20 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72  dy .    ** algor
2f890 69 74 68 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20  ithm may choose 
2f8a0 74 6f 20 75 73 65 20 74 32 20 66 6f 72 20 74 68  to use t2 for th
2f8b0 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68  e outer loop, wh
2f8c0 69 63 68 20 69 73 20 61 20 6d 75 63 68 0a 20 20  ich is a much.  
2f8d0 20 20 2a 2a 20 63 6f 73 74 6c 69 65 72 20 61 70    ** costlier ap
2f8e0 70 72 6f 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20  proach..    */. 
2f8f0 20 20 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65     nUnconstraine
2f900 64 20 3d 20 30 3b 0a 20 20 20 20 6e 6f 74 49 6e  d = 0;.    notIn
2f910 64 65 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 66  dexed = 0;.    f
2f920 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d 28 69 46  or(isOptimal=(iF
2f930 72 6f 6d 3c 6e 54 61 62 4c 69 73 74 2d 31 29 3b  rom<nTabList-1);
2f940 20 69 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26   isOptimal>=0 &&
2f950 20 62 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69   bestJ<0; isOpti
2f960 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 66 6f  mal--){.      fo
2f970 72 28 6a 3d 69 46 72 6f 6d 2c 20 73 57 42 49 2e  r(j=iFrom, sWBI.
2f980 70 53 72 63 3d 26 70 54 61 62 4c 69 73 74 2d 3e  pSrc=&pTabList->
2f990 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74  a[j]; j<nTabList
2f9a0 3b 20 6a 2b 2b 2c 20 73 57 42 49 2e 70 53 72 63  ; j++, sWBI.pSrc
2f9b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
2f9c0 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20   doNotReorder;  
2f9d0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2f9e0 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e  s table should n
2f9f0 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20  ot be reordered 
2fa00 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20 20 64 6f  */.  .        do
2fa10 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28 73  NotReorder =  (s
2fa20 57 42 49 2e 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  WBI.pSrc->jointy
2fa30 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
2fa40 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20  _CROSS))!=0;.   
2fa50 20 20 20 20 20 69 66 28 20 6a 21 3d 69 46 72 6f       if( j!=iFro
2fa60 6d 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65  m && doNotReorde
2fa70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
2fa80 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70     m = getMask(p
2fa90 4d 61 73 6b 53 65 74 2c 20 73 57 42 49 2e 70 53  MaskSet, sWBI.pS
2faa0 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  rc->iCursor);.  
2fab0 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 73        if( (m & s
2fac0 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d 30  WBI.notValid)==0
2fad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2fae0 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72  ( j==iFrom ) iFr
2faf0 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  om++;.          
2fb00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2fb10 20 20 7d 0a 20 20 20 20 20 20 20 20 73 57 42 49    }.        sWBI
2fb20 2e 6e 6f 74 52 65 61 64 79 20 3d 20 28 69 73 4f  .notReady = (isO
2fb30 70 74 69 6d 61 6c 20 3f 20 6d 20 3a 20 73 57 42  ptimal ? m : sWB
2fb40 49 2e 6e 6f 74 56 61 6c 69 64 29 3b 0a 20 20 20  I.notValid);.   
2fb50 20 20 20 20 20 69 66 28 20 73 57 42 49 2e 70 53       if( sWBI.pS
2fb60 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20  rc->pIndex==0 ) 
2fb70 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2b 2b  nUnconstrained++
2fb80 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 57 48 45  ;.  .        WHE
2fb90 52 45 54 52 41 43 45 28 28 22 20 20 20 3d 3d 3d  RETRACE(("   ===
2fba0 20 74 72 79 69 6e 67 20 74 61 62 6c 65 20 25 64   trying table %d
2fbb0 20 28 25 73 29 20 77 69 74 68 20 69 73 4f 70 74   (%s) with isOpt
2fbc0 69 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e 22 2c 0a  imal=%d ===\n",.
2fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbe0 20 20 20 20 6a 2c 20 73 57 42 49 2e 70 53 72 63      j, sWBI.pSrc
2fbf0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 69  ->pTab->zName, i
2fc00 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20 20 20 20  sOptimal));.    
2fc10 20 20 20 20 61 73 73 65 72 74 28 20 73 57 42 49      assert( sWBI
2fc20 2e 70 53 72 63 2d 3e 70 54 61 62 20 29 3b 0a 23  .pSrc->pTab );.#
2fc30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fc40 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2fc50 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
2fc60 72 74 75 61 6c 28 73 57 42 49 2e 70 53 72 63 2d  rtual(sWBI.pSrc-
2fc70 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
2fc80 20 20 20 20 73 57 42 49 2e 70 70 49 64 78 49 6e      sWBI.ppIdxIn
2fc90 66 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  fo = &pWInfo->a[
2fca0 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20  j].pIdxInfo;.   
2fcb0 20 20 20 20 20 20 20 62 65 73 74 56 69 72 74 75         bestVirtu
2fcc0 61 6c 49 6e 64 65 78 28 26 73 57 42 49 29 3b 0a  alIndex(&sWBI);.
2fcd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23          }else .#
2fce0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
2fcf0 20 20 20 20 20 20 20 20 20 20 62 65 73 74 42 74            bestBt
2fd00 72 65 65 49 6e 64 65 78 28 26 73 57 42 49 29 3b  reeIndex(&sWBI);
2fd10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fd20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 74     assert( isOpt
2fd30 69 6d 61 6c 20 7c 7c 20 28 73 57 42 49 2e 63 6f  imal || (sWBI.co
2fd40 73 74 2e 75 73 65 64 26 73 57 42 49 2e 6e 6f 74  st.used&sWBI.not
2fd50 56 61 6c 69 64 29 3d 3d 30 20 29 3b 0a 0a 20 20  Valid)==0 );..  
2fd60 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 49        /* If an I
2fd70 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2fd80 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
2fd90 6e 20 74 68 65 20 70 6c 61 6e 20 6d 75 73 74 20  n the plan must 
2fda0 75 73 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  use that.       
2fdb0 20 2a 2a 20 69 6e 64 65 78 20 69 66 20 69 74 20   ** index if it 
2fdc0 75 73 65 73 20 61 6e 79 20 69 6e 64 65 78 20 61  uses any index a
2fdd0 74 20 61 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20  t all */.       
2fde0 20 61 73 73 65 72 74 28 20 73 57 42 49 2e 70 53   assert( sWBI.pS
2fdf0 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20  rc->pIndex==0 . 
2fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe10 20 7c 7c 20 28 73 57 42 49 2e 63 6f 73 74 2e 70   || (sWBI.cost.p
2fe20 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2fe30 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
2fe40 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2fe50 20 20 20 20 20 20 20 7c 7c 20 73 57 42 49 2e 63         || sWBI.c
2fe60 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d  ost.plan.u.pIdx=
2fe70 3d 73 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e 64  =sWBI.pSrc->pInd
2fe80 65 78 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  ex );..        i
2fe90 66 28 20 69 73 4f 70 74 69 6d 61 6c 20 26 26 20  f( isOptimal && 
2fea0 28 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e  (sWBI.cost.plan.
2feb0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2fec0 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
2fed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   ){.          no
2fee0 74 49 6e 64 65 78 65 64 20 7c 3d 20 6d 3b 0a 20  tIndexed |= m;. 
2fef0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2ff00 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20    /* Conditions 
2ff10 75 6e 64 65 72 20 77 68 69 63 68 20 74 68 69 73  under which this
2ff20 20 74 61 62 6c 65 20 62 65 63 6f 6d 65 73 20 74   table becomes t
2ff30 68 65 20 62 65 73 74 20 73 6f 20 66 61 72 3a 0a  he best so far:.
2ff40 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2ff50 20 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20     **   (1) The 
2ff60 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20 64  table must not d
2ff70 65 70 65 6e 64 20 6f 6e 20 6f 74 68 65 72 20 74  epend on other t
2ff80 61 62 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  ables that have 
2ff90 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  not.        **  
2ffa0 20 20 20 20 20 79 65 74 20 72 75 6e 2e 20 20 28       yet run.  (
2ffb0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2ffc0 69 74 20 6d 75 73 74 20 6e 6f 74 20 64 65 70 65  it must not depe
2ffd0 6e 64 20 6f 6e 20 74 61 62 6c 65 73 0a 20 20 20  nd on tables.   
2ffe0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69 6e       **       in
2fff0 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 2e 29 0a 20   inner loops.). 
30000 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
30010 20 20 2a 2a 20 20 20 28 32 29 20 41 20 66 75 6c    **   (2) A ful
30020 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 70 6c 61  l-table-scan pla
30030 6e 20 63 61 6e 6e 6f 74 20 73 75 70 65 72 63 65  n cannot superce
30040 64 65 20 69 6e 64 65 78 65 64 20 70 6c 61 6e 20  de indexed plan 
30050 75 6e 6c 65 73 73 0a 20 20 20 20 20 20 20 20 2a  unless.        *
30060 2a 20 20 20 20 20 20 20 74 68 65 20 66 75 6c 6c  *       the full
30070 2d 74 61 62 6c 65 2d 73 63 61 6e 20 69 73 20 61  -table-scan is a
30080 6e 20 22 6f 70 74 69 6d 61 6c 22 20 70 6c 61 6e  n "optimal" plan
30090 20 61 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76   as defined abov
300a0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e..        **.  
300b0 20 20 20 20 20 20 2a 2a 20 20 20 28 33 29 20 41        **   (3) A
300c0 6c 6c 20 74 61 62 6c 65 73 20 68 61 76 65 20 61  ll tables have a
300d0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
300e0 75 73 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c  use or this tabl
300f0 65 20 6c 61 63 6b 73 20 61 6e 0a 20 20 20 20 20  e lacks an.     
30100 20 20 20 2a 2a 20 20 20 20 20 20 20 49 4e 44 45     **       INDE
30110 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72  XED BY clause or
30120 20 74 68 69 73 20 74 61 62 6c 65 20 75 73 65 73   this table uses
30130 20 74 68 65 20 73 70 65 63 69 66 69 63 0a 20 20   the specific.  
30140 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69        **       i
30150 6e 64 65 78 20 73 70 65 63 69 66 69 65 64 20 62  ndex specified b
30160 79 20 69 74 73 20 49 4e 44 45 58 45 44 20 42 59  y its INDEXED BY
30170 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 72   clause.  This r
30180 75 6c 65 20 65 6e 73 75 72 65 73 0a 20 20 20 20  ule ensures.    
30190 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74 68 61      **       tha
301a0 74 20 61 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  t a best-so-far 
301b0 69 73 20 61 6c 77 61 79 73 20 73 65 6c 65 63 74  is always select
301c0 65 64 20 65 76 65 6e 20 69 66 20 61 6e 20 69 6d  ed even if an im
301d0 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
301e0 20 2a 2a 20 20 20 20 20 20 20 63 6f 6d 62 69 6e   **       combin
301f0 61 74 69 6f 6e 20 6f 66 20 49 4e 44 45 58 45 44  ation of INDEXED
30200 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20   BY clauses are 
30210 67 69 76 65 6e 2e 20 20 54 68 65 20 65 72 72 6f  given.  The erro
30220 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  r.        **    
30230 20 20 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63     will be detec
30240 74 65 64 20 61 6e 64 20 72 65 6c 61 79 65 64 20  ted and relayed 
30250 62 61 63 6b 20 74 6f 20 74 68 65 20 61 70 70 6c  back to the appl
30260 69 63 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 20  ication later.. 
30270 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
30280 54 68 65 20 4e 45 56 45 52 28 29 20 63 6f 6d 65  The NEVER() come
30290 73 20 61 62 6f 75 74 20 62 65 63 61 75 73 65 20  s about because 
302a0 72 75 6c 65 20 28 32 29 20 61 62 6f 76 65 20 70  rule (2) above p
302b0 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20  revents.        
302c0 2a 2a 20 20 20 20 20 20 20 41 6e 20 69 6e 64 65  **       An inde
302d0 78 61 62 6c 65 20 66 75 6c 6c 2d 74 61 62 6c 65  xable full-table
302e0 2d 73 63 61 6e 20 66 72 6f 6d 20 72 65 61 63 68  -scan from reach
302f0 69 6e 67 20 72 75 6c 65 20 28 33 29 2e 0a 20 20  ing rule (3)..  
30300 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
30310 20 2a 2a 20 20 20 28 34 29 20 54 68 65 20 70 6c   **   (4) The pl
30320 61 6e 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20  an cost must be 
30330 6c 6f 77 65 72 20 74 68 61 6e 20 70 72 69 6f 72  lower than prior
30340 20 70 6c 61 6e 73 2c 20 77 68 65 72 65 20 22 63   plans, where "c
30350 6f 73 74 22 0a 20 20 20 20 20 20 20 20 2a 2a 20  ost".        ** 
30360 20 20 20 20 20 20 69 73 20 64 65 66 69 6e 65 64        is defined
30370 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 65 43   by the compareC
30380 6f 73 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ost() function a
30390 62 6f 76 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  bove. .        *
303a0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 73  /.        if( (s
303b0 57 42 49 2e 63 6f 73 74 2e 75 73 65 64 26 73 57  WBI.cost.used&sW
303c0 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d 30 20  BI.notValid)==0 
303d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303e0 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
303f0 20 20 20 20 20 20 20 20 20 26 26 20 28 62 65 73           && (bes
30400 74 4a 3c 30 20 7c 7c 20 28 6e 6f 74 49 6e 64 65  tJ<0 || (notInde
30410 78 65 64 26 6d 29 21 3d 30 20 20 20 20 20 20 20  xed&m)!=0       
30420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30430 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (2) */.        
30440 20 20 20 20 20 20 20 20 7c 7c 20 28 62 65 73 74          || (best
30450 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
30460 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
30470 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20  LLSCAN)==0.     
30480 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73             || (s
30490 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73  WBI.cost.plan.ws
304a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
304b0 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29 0a  T_FULLSCAN)!=0).
304c0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
304d0 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3d 3d  nUnconstrained==
304e0 30 20 7c 7c 20 73 57 42 49 2e 70 53 72 63 2d 3e  0 || sWBI.pSrc->
304f0 70 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 20 20  pIndex==0       
30500 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
30510 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 4e 45             || NE
30520 56 45 52 28 28 73 57 42 49 2e 63 6f 73 74 2e 70  VER((sWBI.cost.p
30530 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
30540 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
30550 29 21 3d 30 29 29 0a 20 20 20 20 20 20 20 20 20  )!=0)).         
30560 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c     && (bestJ<0 |
30570 7c 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 26 73  | compareCost(&s
30580 57 42 49 2e 63 6f 73 74 2c 20 26 62 65 73 74 50  WBI.cost, &bestP
30590 6c 61 6e 29 29 20 20 20 2f 2a 20 28 34 29 20 2a  lan))   /* (4) *
305a0 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
305b0 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
305c0 45 28 28 22 20 20 20 3d 3d 3d 20 74 61 62 6c 65  E(("   === table
305d0 20 25 64 20 28 25 73 29 20 69 73 20 62 65 73 74   %d (%s) is best
305e0 20 73 6f 20 66 61 72 5c 6e 22 0a 20 20 20 20 20   so far\n".     
305f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30600 20 22 20 20 20 20 20 20 20 63 6f 73 74 3d 25 2e   "       cost=%.
30610 31 66 2c 20 6e 52 6f 77 3d 25 2e 31 66 2c 20 6e  1f, nRow=%.1f, n
30620 4f 42 53 61 74 3d 25 64 2c 20 77 73 46 6c 61 67  OBSat=%d, wsFlag
30630 73 3d 25 30 38 78 5c 6e 22 2c 0a 20 20 20 20 20  s=%08x\n",.     
30640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30650 20 6a 2c 20 73 57 42 49 2e 70 53 72 63 2d 3e 70   j, sWBI.pSrc->p
30660 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
30670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30680 20 20 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f 73    sWBI.cost.rCos
30690 74 2c 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61  t, sWBI.cost.pla
306a0 6e 2e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  n.nRow,.        
306b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 57                sW
306c0 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42  BI.cost.plan.nOB
306d0 53 61 74 2c 20 73 57 42 49 2e 63 6f 73 74 2e 70  Sat, sWBI.cost.p
306e0 6c 61 6e 2e 77 73 46 6c 61 67 73 29 29 3b 0a 20  lan.wsFlags));. 
306f0 20 20 20 20 20 20 20 20 20 62 65 73 74 50 6c 61           bestPla
30700 6e 20 3d 20 73 57 42 49 2e 63 6f 73 74 3b 0a 20  n = sWBI.cost;. 
30710 20 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d           bestJ =
30720 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   j;.        }.  
30730 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52        if( doNotR
30740 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a  eorder ) break;.
30750 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30760 20 20 61 73 73 65 72 74 28 20 62 65 73 74 4a 3e    assert( bestJ>
30770 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
30780 28 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 20  ( sWBI.notValid 
30790 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  & getMask(pMaskS
307a0 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
307b0 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20  bestJ].iCursor) 
307c0 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  );.    WHERETRAC
307d0 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
307e0 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20  r selects table 
307f0 25 64 20 28 25 73 29 20 66 6f 72 20 6c 6f 6f 70  %d (%s) for loop
30800 20 25 64 20 77 69 74 68 3a 5c 6e 22 0a 20 20 20   %d with:\n".   
30810 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
30820 20 20 63 6f 73 74 3d 25 2e 31 66 2c 20 6e 52 6f    cost=%.1f, nRo
30830 77 3d 25 2e 31 66 2c 20 6e 4f 42 53 61 74 3d 25  w=%.1f, nOBSat=%
30840 64 2c 20 77 73 46 6c 61 67 73 3d 30 78 25 30 38  d, wsFlags=0x%08
30850 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
30860 20 20 20 20 20 20 62 65 73 74 4a 2c 20 70 54 61        bestJ, pTa
30870 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
30880 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
30890 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
308a0 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 2c 20 62  vel-pWInfo->a, b
308b0 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 2c 20 62  estPlan.rCost, b
308c0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f  estPlan.plan.nRo
308d0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
308e0 20 20 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e     bestPlan.plan
308f0 2e 6e 4f 42 53 61 74 2c 20 62 65 73 74 50 6c 61  .nOBSat, bestPla
30900 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 29 29  n.plan.wsFlags))
30910 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 50  ;.    if( (bestP
30920 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
30930 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
30940 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  T)!=0 ){.      a
30950 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65  ssert( pWInfo->e
30960 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20  Distinct==0 );. 
30970 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
30980 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
30990 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
309a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c  .    }.    andFl
309b0 61 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e  ags &= bestPlan.
309c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20  plan.wsFlags;.  
309d0 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d    pLevel->plan =
309e0 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a   bestPlan.plan;.
309f0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
30a00 43 75 72 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Cur = pTabList->
30a10 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72  a[bestJ].iCursor
30a20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
30a30 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
30a40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
30a50 44 45 58 45 44 20 29 3b 0a 20 20 20 20 74 65 73  DEXED );.    tes
30a60 74 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e  tcase( bestPlan.
30a70 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
30a80 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20  HERE_TEMP_INDEX 
30a90 29 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74 50  );.    if( bestP
30aa0 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
30ab0 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45   & (WHERE_INDEXE
30ac0 44 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  D|WHERE_TEMP_IND
30ad0 45 58 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  EX) ){.      if(
30ae0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
30af0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
30b00 4c 59 29 20 0a 20 20 20 20 20 20 20 26 26 20 28  LY) .       && (
30b10 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
30b20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
30b30 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20 0a 20 20  MP_INDEX)==0 .  
30b40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
30b50 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
30b60 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
30b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
30b80 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
30b90 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
30ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
30bb0 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
30bc0 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a  ->iIdxCur = -1;.
30bd0 20 20 20 20 7d 0a 20 20 20 20 73 57 42 49 2e 6e      }.    sWBI.n
30be0 6f 74 56 61 6c 69 64 20 26 3d 20 7e 67 65 74 4d  otValid &= ~getM
30bf0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
30c00 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
30c10 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  .iCursor);.    p
30c20 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28  Level->iFrom = (
30c30 75 38 29 62 65 73 74 4a 3b 0a 20 20 20 20 69 66  u8)bestJ;.    if
30c40 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  ( bestPlan.plan.
30c50 6e 52 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20  nRow>=(double)1 
30c60 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
30c70 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2a 3d 20 62  >nQueryLoop *= b
30c80 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f  estPlan.plan.nRo
30c90 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  w;.    }..    /*
30ca0 20 43 68 65 63 6b 20 74 68 61 74 20 69 66 20 74   Check that if t
30cb0 68 65 20 74 61 62 6c 65 20 73 63 61 6e 6e 65 64  he table scanned
30cc0 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 74   by this loop it
30cd0 65 72 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20  eration had an. 
30ce0 20 20 20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59     ** INDEXED BY
30cf0 20 63 6c 61 75 73 65 20 61 74 74 61 63 68 65 64   clause attached
30d00 20 74 6f 20 69 74 2c 20 74 68 61 74 20 74 68 65   to it, that the
30d10 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 69 73 20   named index is 
30d20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65  being.    ** use
30d30 64 20 66 6f 72 20 74 68 65 20 73 63 61 6e 2e 20  d for the scan. 
30d40 49 66 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65  If not, then que
30d50 72 79 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68  ry compilation h
30d60 61 73 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a  as failed..    *
30d70 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
30d80 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  r..    */.    pI
30d90 64 78 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  dx = pTabList->a
30da0 5b 62 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a  [bestJ].pIndex;.
30db0 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
30dc0 20 20 20 20 20 20 69 66 28 20 28 62 65 73 74 50        if( (bestP
30dd0 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
30de0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
30df0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
30e00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
30e10 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
30e20 75 73 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  use index: %s", 
30e30 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
30e40 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
30e50 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
30e60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30e70 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45   /* If an INDEXE
30e80 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 75  D BY clause is u
30e90 73 65 64 2c 20 74 68 65 20 62 65 73 74 49 6e 64  sed, the bestInd
30ea0 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  ex() function is
30eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
30ec0 61 6e 74 65 65 64 20 74 6f 20 66 69 6e 64 20 74  anteed to find t
30ed0 68 65 20 69 6e 64 65 78 20 73 70 65 63 69 66 69  he index specifi
30ee0 65 64 20 69 6e 20 74 68 65 20 49 4e 44 45 58 45  ed in the INDEXE
30ef0 44 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  D BY clause.    
30f00 20 20 20 20 2a 2a 20 69 66 20 69 74 20 66 69 6e      ** if it fin
30f10 64 20 61 6e 20 69 6e 64 65 78 20 61 74 20 61 6c  d an index at al
30f20 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  l. */.        as
30f30 73 65 72 74 28 20 62 65 73 74 50 6c 61 6e 2e 70  sert( bestPlan.p
30f40 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78  lan.u.pIdx==pIdx
30f50 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
30f60 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
30f70 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
30f80 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
30f90 6e 22 29 29 3b 0a 20 20 69 66 28 20 70 50 61 72  n"));.  if( pPar
30fa0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
30fb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
30fc0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
30fd0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ginError;.  }.  
30fe0 69 66 28 20 6e 54 61 62 4c 69 73 74 20 29 7b 0a  if( nTabList ){.
30ff0 20 20 20 20 70 4c 65 76 65 6c 2d 2d 3b 0a 20 20      pLevel--;.  
31000 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74    pWInfo->nOBSat
31010 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
31020 6e 4f 42 53 61 74 3b 0a 20 20 7d 65 6c 73 65 7b  nOBSat;.  }else{
31030 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  .    pWInfo->nOB
31040 53 61 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Sat = 0;.  }..  
31050 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20  /* If the total 
31060 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63  query only selec
31070 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c  ts a single row,
31080 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20   then the ORDER 
31090 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69  BY.  ** clause i
310a0 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20  s irrelevant..  
310b0 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61  */.  if( (andFla
310c0 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55  gs & WHERE_UNIQU
310d0 45 29 21 3d 30 20 26 26 20 70 4f 72 64 65 72 42  E)!=0 && pOrderB
310e0 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
310f0 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20   nTabList==0 || 
31100 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
31110 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c  Flags & WHERE_AL
31120 4c 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 3b 0a  L_UNIQUE)!=0 );.
31130 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53      pWInfo->nOBS
31140 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  at = pOrderBy->n
31150 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Expr;.  }..  /* 
31160 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
31170 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
31180 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
31190 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
311a0 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
311b0 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
311c0 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
311d0 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
311e0 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
311f0 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
31200 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
31210 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
31220 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
31230 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
31240 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67  to update a sing
31250 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61  le row..  */.  a
31260 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
31270 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
31280 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
31290 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
312a0 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
312b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
312c0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
312d0 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67  )!=0 && (andFlag
312e0 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
312f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e  )!=0 ){.    pWIn
31300 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20  fo->okOnePass = 
31310 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
31320 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  [0].plan.wsFlags
31330 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
31340 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  NLY;.  }..  /* O
31350 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
31360 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
31370 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
31380 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
31390 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
313a0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
313b0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
313c0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
313d0 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
313e0 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
313f0 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74  er Goto */.  not
31400 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
31410 6b 29 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  k)0;.  pWInfo->n
31420 52 6f 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65  RowOut = (double
31430 29 31 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20  )1;.  for(ii=0, 
31440 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
31450 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
31460 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
31470 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
31480 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
31490 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
314a0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
314b0 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
314c0 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
314d0 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
314e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
314f0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a  item *pTabItem;.
31500 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
31510 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
31520 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
31530 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d   pTab = pTabItem
31540 2d 3e 70 54 61 62 3b 0a 20 20 20 20 70 57 49 6e  ->pTab;.    pWIn
31550 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70  fo->nRowOut *= p
31560 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77  Level->plan.nRow
31570 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
31580 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
31590 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
315a0 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  ma);.    if( (pT
315b0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
315c0 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
315d0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
315e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
315f0 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
31600 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
31610 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
31620 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
31630 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
31640 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
31650 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
31660 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
31670 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
31680 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
31690 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
316a0 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
316b0 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
316c0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
316d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
316e0 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
316f0 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
31700 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
31710 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
31720 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
31730 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
31740 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
31750 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
31760 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
31770 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
31780 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
31790 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
317a0 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
317b0 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
317c0 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
317d0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
317e0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
317f0 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
31800 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74   op);.      test
31810 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  case( pTab->nCol
31820 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
31830 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d   testcase( pTab-
31840 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
31850 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
31860 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
31870 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a  ab->nCol<BMS ){.
31880 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
31890 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
318a0 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
318b0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
318c0 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
318d0 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
318e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
318f0 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
31900 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
31910 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
31920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31930 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
31940 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
31950 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
31960 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
31970 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
31980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
31990 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
319a0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
319b0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
319c0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  >zName);.    }.#
319d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
319e0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
319f0 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
31a00 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
31a10 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
31a20 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
31a30 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
31a40 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
31a50 20 73 57 42 49 2e 70 57 43 2c 20 70 54 61 62 49   sWBI.pWC, pTabI
31a60 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  tem, notReady, p
31a70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  Level);.    }els
31a80 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
31a90 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
31aa0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
31ab0 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20  NDEXED)!=0 ){.  
31ac0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
31ad0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
31ae0 70 49 64 78 3b 0a 20 20 20 20 20 20 4b 65 79 49  pIdx;.      KeyI
31af0 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  nfo *pKey = sqli
31b00 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
31b10 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20  pParse, pIx);.  
31b20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75      int iIndexCu
31b30 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
31b40 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Cur;.      asser
31b50 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
31b60 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
31b70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31b80 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a  iIndexCur>=0 );.
31b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31ba0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
31bb0 65 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75  enRead, iIndexCu
31bc0 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
31bd0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
31be0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
31bf0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
31c00 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
31c10 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
31c20 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
31c30 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
31c40 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
31c50 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
31c60 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65   iDb);.    notRe
31c70 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
31c80 73 57 42 49 2e 70 57 43 2d 3e 70 4d 61 73 6b 53  sWBI.pWC->pMaskS
31c90 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  et, pTabItem->iC
31ca0 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57  ursor);.  }.  pW
31cb0 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
31cc0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
31cd0 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
31ce0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
31cf0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
31d00 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
31d10 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
31d20 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
31d30 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
31d40 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
31d50 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
31d60 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
31d70 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
31d80 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
31d90 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
31da0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
31db0 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
31dc0 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
31dd0 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70  st; ii++){.    p
31de0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
31df0 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70 6c  >a[ii];.    expl
31e00 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73  ainOneScan(pPars
31e10 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65  e, pTabList, pLe
31e20 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d  vel, ii, pLevel-
31e30 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61  >iFrom, wctrlFla
31e40 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  gs);.    notRead
31e50 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  y = codeOneLoopS
31e60 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
31e70 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74   wctrlFlags, not
31e80 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e  Ready);.    pWIn
31e90 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
31ea0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
31eb0 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
31ec0 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f  LITE_TEST  /* Fo
31ed0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
31ee0 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
31ef0 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20   */.  /* Record 
31f00 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  in the query pla
31f10 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
31f20 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  out the current 
31f30 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74  table.  ** and t
31f40 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  he index used to
31f50 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61   access it (if a
31f60 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62  ny).  If the tab
31f70 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  le itself.  ** i
31f80 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20  s not used, its 
31f90 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d  name is just '{}
31fa0 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20  '.  If no index 
31fb0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65  is used.  ** the
31fc0 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64   index is listed
31fd0 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68   as "{}".  If th
31fe0 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
31ff0 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69   used the.  ** i
32000 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27  ndex name is '*'
32010 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
32020 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
32030 69 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20  ii++){.    char 
32040 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  *z;.    int n;. 
32050 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 73 74     int w;.    st
32060 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32070 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20  m *pTabItem;..  
32080 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
32090 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77  fo->a[ii];.    w
320a0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
320b0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 54 61  wsFlags;.    pTa
320c0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
320d0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
320e0 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61  om];.    z = pTa
320f0 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  bItem->zAlias;. 
32100 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
32110 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
32120 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d  ->zName;.    n =
32130 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
32140 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e  (z);.    if( n+n
32150 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
32160 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
32170 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69  n)-10 ){.      i
32180 66 28 20 28 77 20 26 20 57 48 45 52 45 5f 49 44  f( (w & WHERE_ID
32190 58 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 28 77  X_ONLY)!=0 && (w
321a0 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f 53   & WHERE_COVER_S
321b0 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  CAN)==0 ){.     
321c0 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
321d0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
321e0 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b  Plan], "{}", 2);
321f0 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
32200 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
32210 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  e{.        memcp
32220 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
32230 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
32240 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
32250 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
32260 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
32270 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
32280 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
32290 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
322a0 20 77 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44   w & WHERE_ROWID
322b0 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _EQ );.    testc
322c0 61 73 65 28 20 77 20 26 20 57 48 45 52 45 5f 52  ase( w & WHERE_R
322d0 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20  OWID_RANGE );.  
322e0 20 20 69 66 28 20 77 20 26 20 28 57 48 45 52 45    if( w & (WHERE
322f0 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
32300 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
32310 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
32320 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
32330 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20  [nQPlan], "* ", 
32340 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  2);.      nQPlan
32350 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65   += 2;.    }else
32360 20 69 66 28 20 28 77 20 26 20 57 48 45 52 45 5f   if( (w & WHERE_
32370 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 28  INDEXED)!=0 && (
32380 77 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f  w & WHERE_COVER_
32390 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SCAN)==0 ){.    
323a0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
323b0 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70 6c  len30(pLevel->pl
323c0 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
323d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e  );.      if( n+n
323e0 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
323f0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
32400 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  n)-2 ){.        
32410 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
32420 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
32430 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  n], pLevel->plan
32440 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  .u.pIdx->zName, 
32450 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
32460 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  an += n;.       
32470 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
32480 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
32490 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
324a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
324b0 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
324c0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
324d0 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20  , "{} ", 3);.   
324e0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
324f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
32500 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73  e( nQPlan>0 && s
32510 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
32520 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27  n[nQPlan-1]==' '
32530 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
32540 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50  query_plan[--nQP
32550 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lan] = 0;.  }.  
32560 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
32570 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  an[nQPlan] = 0;.
32580 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65    nQPlan = 0;.#e
32590 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
325a0 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61  EST // Testing a
325b0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
325c0 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52   only */..  /* R
325d0 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e  ecord the contin
325e0 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69  uation address i
325f0 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  n the WhereInfo 
32600 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e  structure.  Then
32610 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61  .  ** clean up a
32620 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
32630 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
32640 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
32650 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
32660 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
32670 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
32680 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
32690 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
326a0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
326b0 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
326c0 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
326d0 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
326e0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
326f0 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
32700 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
32710 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
32720 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
32730 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
32740 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
32750 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
32760 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
32770 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
32780 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
32790 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
327a0 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
327b0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
327c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
327d0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
327e0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
327f0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
32800 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
32810 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
32820 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
32830 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
32840 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
32850 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
32860 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
32870 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
32880 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
32890 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
328a0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
328b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
328c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
328d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
328e0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
328f0 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
32900 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32910 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
32920 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
32930 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
32940 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32950 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
32960 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
32970 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
32980 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
32990 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
329a0 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
329b0 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
329c0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
329d0 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
329e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
329f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
32a00 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
32a10 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
32a20 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
32a30 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
32a40 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
32a50 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
32a60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
32a70 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
32a80 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
32a90 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
32aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
32ab0 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e  , OP_Next, pIn->
32ac0 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
32ad0 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73  nTop);.        s
32ae0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
32af0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
32b00 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
32b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
32b20 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
32b30 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
32b40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
32b50 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
32b60 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
32b70 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
32b80 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
32b90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
32ba0 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
32bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32bc0 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
32bd0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
32be0 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
32bf0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
32c00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
32c10 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
32c20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 65 76          || (pLev
32c30 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
32c40 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
32c50 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
32c60 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
32c70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
32c80 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
32c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
32ca0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
32cb0 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
32cc0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
32cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32ce0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  if( pLevel->iIdx
32cf0 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
32d00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32d10 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
32d20 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
32d30 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
32d40 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
32d50 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a  p==OP_Return ){.
32d60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
32d70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
32d80 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70  Gosub, pLevel->p
32d90 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  1, pLevel->addrF
32da0 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  irst);.      }el
32db0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
32dc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
32dd0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
32de0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
32df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
32e00 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
32e10 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
32e20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
32e30 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
32e40 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
32e50 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
32e60 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
32e70 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
32e80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
32e90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
32ea0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
32eb0 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
32ec0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
32ed0 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
32ee0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
32ef0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
32f00 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
32f10 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==1 || pWInfo->n
32f20 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d  Level==pTabList-
32f30 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69  >nSrc );.  for(i
32f40 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
32f50 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  o->a; i<pWInfo->
32f60 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65  nLevel; i++, pLe
32f70 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65  vel++){.    Inde
32f80 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20  x *pIdx = 0;.   
32f90 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
32fa0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
32fb0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
32fc0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
32fd0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
32fe0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
32ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
33000 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
33010 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
33020 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
33030 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e  0.     && pTab->
33040 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20  pSelect==0.     
33050 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
33060 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
33070 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
33080 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
33090 69 6e 74 20 77 73 20 3d 20 70 4c 65 76 65 6c 2d  int ws = pLevel-
330a0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  >plan.wsFlags;. 
330b0 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
330c0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28  ->okOnePass && (
330d0 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
330e0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
330f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33100 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
33110 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
33120 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
33130 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
33140 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
33150 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 54  && (ws & WHERE_T
33160 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20 29 7b  EMP_INDEX)==0 ){
33170 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33180 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
33190 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
331a0 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
331b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
331c0 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
331d0 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
331e0 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69   code substituti
331f0 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61  ons to read data
33200 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
33210 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72   index in prefer
33220 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c  ence to the tabl
33230 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68  e. Sometimes, th
33240 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
33250 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e  the table need n
33260 65 76 65 72 20 62 65 20 72 65 61 64 20 66 72 6f  ever be read fro
33270 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70 65 72  m. This is a per
33280 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a  formance boost,.
33290 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64      ** as the vd
332a0 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75  be level waits u
332b0 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69  ntil the table i
332c0 73 20 72 65 61 64 20 62 65 66 6f 72 65 20 61 63  s read before ac
332d0 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65  tually.    ** se
332e0 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  eking the table 
332f0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65  cursor to the re
33300 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69  cord correspondi
33310 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
33320 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f  t.    ** positio
33330 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  n in the index..
33340 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
33350 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
33360 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
33370 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
33380 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
33390 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
333a0 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
333b0 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
333c0 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
333d0 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
333e0 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
333f0 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
33400 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
33410 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
33420 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
33430 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
33440 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
33450 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
33460 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
33470 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
33480 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
33490 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
334a0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
334b0 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76       pIdx = pLev
334c0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
334d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
334e0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
334f0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
33500 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49  I_OR ){.      pI
33510 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  dx = pLevel->u.p
33520 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  Covidx;.    }.  
33530 20 20 69 66 28 20 70 49 64 78 20 26 26 20 21 64    if( pIdx && !d
33540 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
33550 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a  {.      int k, j
33560 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64  , last;.      Vd
33570 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 20 20  beOp *pOp;..    
33580 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
33590 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e  dbeGetOp(v, pWIn
335a0 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20  fo->iTop);.     
335b0 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
335c0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
335d0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  );.      for(k=p
335e0 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c  WInfo->iTop; k<l
335f0 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
33600 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
33610 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
33620 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
33630 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
33640 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
33650 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
33660 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
33670 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
33680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
33690 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78  f( pOp->p2==pIdx
336a0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b  ->aiColumn[j] ){
336b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
336c0 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20  Op->p2 = j;.    
336d0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
336e0 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
336f0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Cur;.           
33700 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
33710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33720 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
33730 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70  sert( (pLevel->p
33740 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
33750 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
33760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33770 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  || j<pIdx->nColu
33780 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  mn );.        }e
33790 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
337a0 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b  ode==OP_Rowid ){
337b0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
337c0 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
337d0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
337e0 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
337f0 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20  _IdxRowid;.     
33800 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33810 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
33820 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
33830 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
33840 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
33850 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
33860 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
33870 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
33880 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.