/ Hex Artifact Content
Login

Artifact 6fdacd2cd56995aaef80209f2697d97a92d6a96f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0460: 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  e.# define WHERE
0470: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
0480: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0490: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
04a0: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
04b0: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65  WhereMaskSet Whe
04e0: 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64  reMaskSet;.typed
04f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0500: 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66  rInfo WhereOrInf
0510: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0520: 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57  t WhereAndInfo W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70  hereAndInfo;.typ
0540: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0550: 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b  eCost WhereCost;
0560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0570: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0580: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0590: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
05a0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
05b0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
05c0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
05d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05e0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05f0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0600: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0610: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0620: 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f   others by AND o
0630: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75  perators,.** usu
0640: 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d  ally, or sometim
0650: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
0660: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  s separated by O
0670: 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  R..**.** All Whe
0680: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
0690: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
06a0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06b0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
06c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
06d0: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
06e0: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
06f0: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
0700: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0710: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0720: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0730: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0750: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
0760: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
0770: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
0780: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
0790: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
07a0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07b0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
07c0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
07d0: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
07e0: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
07f0: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
0800: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
0810: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
0820: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
0830: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0840: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0850: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
0860: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0870: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0880: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0890: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
08a0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
08b0: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
08c0: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
08d0: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
08e0: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
08f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
0900: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
0910: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
0920: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
0930: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
0940: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
0950: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
0960: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
0970: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
0980: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
0990: 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68 65  e, wtFlag as the
09a0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74   TERM_ORINFO set
09b0: 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d   and eOperator==
09c0: 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65  WO_OR.** and the
09d0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
09e0: 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74  Info field point
09f0: 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69  s to auxiliary i
0a00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a  nformation that.
0a10: 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ** is collected 
0a20: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20  about the.**.** 
0a30: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
0a40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
0a50: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
0a60: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
0a70: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
0a80: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
0a90: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
0aa0: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
0ab0: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
0ac0: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
0ad0: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
0ae0: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
0af0: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
0b00: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
0b10: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
0b20: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
0b30: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
0b40: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
0b50: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
0b60: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
0b70: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0b80: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0ba0: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0bb0: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0bc0: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
0bd0: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
0be0: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
0bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
0c00: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
0c10: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
0c20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
0c30: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
0c40: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
0c50: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
0c60: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
0c70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
0c80: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
0c90: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
0ca0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0cb0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0cc0: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
0cd0: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
0ce0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
0cf0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
0d00: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
0d10: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
0d20: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
0d30: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
0d40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
0d50: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0d60: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0d70: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0d80: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0d90: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0da0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0db0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0dc0: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0dd0: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0de0: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0df0: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0e00: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0e10: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0e20: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0e30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0e40: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0e50: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
0e60: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
0e70: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
0e80: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
0e90: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
0ea0: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
0eb0: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
0ec0: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
0ed0: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
0ee0: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
0ef0: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
0f00: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
0f10: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65   tables..*/.type
0f20: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0f30: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0f40: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f50: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0f80: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
0f90: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
0fa0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0fc0: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
0fd0: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
0fe0: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
0ff0: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
1000: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
1010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1020: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
1030: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
1040: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
1050: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
1060: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
1070: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
1080: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
1090: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
10a0: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
10b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65  nformation if (e
10c0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
10d0: 29 21 3d 30 20 2a 2f 0a 20 20 20 20 57 68 65 72  )!=0 */.    Wher
10e0: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
10f0: 66 6f 3b 20 2f 2a 20 45 78 74 72 61 20 69 6e 66  fo; /* Extra inf
1100: 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70  ormation if (eOp
1110: 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21  erator& WO_AND)!
1120: 3d 30 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75  =0 */.  } u;.  u
1130: 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  16 eOperator;   
1140: 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78         /* A WO_x
1150: 78 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69  x value describi
1160: 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20  ng <op> */.  u8 
1170: 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wtFlags;        
1180: 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78       /* TERM_xxx
1190: 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65   bit flags.  See
11a0: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e   below */.  u8 n
11b0: 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
11c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11d0: 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d   children that m
11e0: 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a  ust disable us *
11f0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
1200: 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54  *pWC;       /* T
1210: 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20 74  he clause this t
1220: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a  erm is part of *
1230: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
1240: 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42  eqRight;    /* B
1250: 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  itmask of tables
1260: 20 75 73 65 64 20 62 79 20 70 45 78 70 72 2d 3e   used by pExpr->
1270: 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d  pRight */.  Bitm
1280: 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20  ask prereqAll;  
1290: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
12a0: 66 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  f tables referen
12b0: 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a  ced by pExpr */.
12c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
12d0: 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72  d values of Wher
12e0: 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f  eTerm.wtFlags.*/
12f0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59  .#define TERM_DY
1300: 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20 20  NAMIC    0x01   
1310: 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20  /* Need to call 
1320: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1330: 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a  e(db, pExpr) */.
1340: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52  #define TERM_VIR
1350: 54 55 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f  TUAL    0x02   /
1360: 2a 20 41 64 64 65 64 20 62 79 20 74 68 65 20 6f  * Added by the o
1370: 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f  ptimizer.  Do no
1380: 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e  t code */.#defin
1390: 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20  e TERM_CODED    
13a0: 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73    0x04   /* This
13b0: 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79   term is already
13c0: 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e   coded */.#defin
13d0: 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20  e TERM_COPIED   
13e0: 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20    0x08   /* Has 
13f0: 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69  a child */.#defi
1400: 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20  ne TERM_ORINFO  
1410: 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65 65     0x10   /* Nee
1420: 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68  d to free the Wh
1430: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
1440: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66  o object */.#def
1450: 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  ine TERM_ANDINFO
1460: 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e 65      0x20   /* Ne
1470: 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57  ed to free the W
1480: 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49  hereTerm.u.pAndI
1490: 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69  nfo obj */.#defi
14a0: 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20  ne TERM_OR_OK   
14b0: 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73 65     0x40   /* Use
14c0: 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75  d during OR-clau
14d0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  se processing */
14e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14f0: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 23 20 20 64  NABLE_STAT3.#  d
1500: 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  efine TERM_VNULL
1510: 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20 4d 61      0x80   /* Ma
1520: 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e 55 4c  nufactured x>NUL
1530: 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72  L or x<=NULL ter
1540: 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65  m */.#else.#  de
1550: 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  fine TERM_VNULL 
1560: 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44 69 73     0x00   /* Dis
1570: 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75 73 69  abled if not usi
1580: 6e 67 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64  ng stat3 */.#end
1590: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  if../*.** An ins
15a0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
15b0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
15c0: 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72   holds all infor
15d0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a  mation about a.*
15e0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  * WHERE clause. 
15f0: 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20   Mostly this is 
1600: 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  a container for 
1610: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72  one or more Wher
1620: 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 45 78  eTerms..**.** Ex
1630: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70 4f 75  planation of pOu
1640: 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48 45 52  ter:  For a WHER
1650: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
1660: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
1670: 20 20 20 20 20 61 20 41 4e 44 20 28 28 62 20 41       a AND ((b A
1680: 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e 44 20  ND c) OR (d AND 
1690: 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a 2a 20  e)) AND f.**.** 
16a0: 54 68 65 72 65 20 61 72 65 20 73 65 70 61 72 61  There are separa
16b0: 74 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  te WhereClause o
16c0: 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65 20 77  bjects for the w
16d0: 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e 64 20  hole clause and 
16e0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62 63 6c  for.** the subcl
16f0: 61 75 73 65 73 20 22 28 62 20 41 4e 44 20 63 29  auses "(b AND c)
1700: 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20 65 29  " and "(d AND e)
1710: 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72 20 66  ".  The pOuter f
1720: 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 73  ield of the.** s
1730: 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e 74 73  ubclauses points
1740: 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61   to the WhereCla
1750: 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  use object for t
1760: 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 2e  he whole clause.
1770: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
1780: 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65  Clause {.  Parse
1790: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
17a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
17b0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  r context */.  W
17c0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
17d0: 73 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70 70 69  skSet;  /* Mappi
17e0: 6e 67 20 6f 66 20 74 61 62 6c 65 20 63 75 72 73  ng of table curs
17f0: 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69  or numbers to bi
1800: 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72  tmasks */.  Wher
1810: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
1820: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
1830: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
1840: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
1850: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
1860: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
1870: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
1880: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
1890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
18a0: 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45  ht include WHERE
18b0: 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69  _AND_ONLY */.  i
18c0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
18d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18e0: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
18f0: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1900: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1910: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1920: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1930: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1940: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1950: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1960: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1970: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
1980: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
1990: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
19a0: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
19b0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
19c0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
19d0: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
19e0: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
19f0: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
1a00: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1a10: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1a20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1a30: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1a40: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1a50: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1a60: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1a70: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1a80: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1a90: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1aa0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1ab0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1ac0: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1ad0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1ae0: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1af0: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1b00: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1b10: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1b20: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1b30: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1b40: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1b50: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1b60: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1b70: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1b80: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1b90: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1ba0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1bb0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1bc0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1bd0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1be0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1bf0: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1c00: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1c10: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1c20: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1c30: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1c40: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1c50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1c60: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1c70: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1c80: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1c90: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ca0: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1cb0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1cc0: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1cd0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1ce0: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1cf0: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1d00: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1d10: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1d20: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1d30: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1d40: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1d50: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1d60: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1d70: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1d80: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1d90: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1da0: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1db0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1dc0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1dd0: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1de0: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1df0: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1e00: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1e10: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1e20: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1e30: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1e40: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1e50: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1e60: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1e70: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1e80: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1e90: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1ea0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1eb0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1ec0: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1ed0: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1ee0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1ef0: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1f00: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f10: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1f20: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1f30: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1f40: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1f50: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1f60: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1f70: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1f80: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1f90: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1fa0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1fb0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1fc0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1fd0: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1fe0: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1ff0: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
2000: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
2010: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
2020: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
2030: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
2040: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
2050: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
2060: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
2070: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
2080: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
2090: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
20a0: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
20b0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
20c0: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
20d0: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
20e0: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
20f0: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
2100: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
2110: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
2120: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
2130: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
2140: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2170: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
2180: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
2190: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
21a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21b0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
21c0: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
21d0: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
21e0: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
21f0: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
2200: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2210: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2220: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2230: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2240: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2250: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
2260: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
2270: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
2280: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
2290: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
22a0: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
22b0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
22c0: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
22d0: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
22e0: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
22f0: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
2300: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2310: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2320: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2330: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2340: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2350: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
2360: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
2370: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
2380: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
2390: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
23a0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
23b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
23c0: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
23d0: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
23e0: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
23f0: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
2400: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2410: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2420: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2430: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2440: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2450: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
2460: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
2470: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
2480: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
2490: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
24a0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
24b0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
24c0: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
24d0: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
24e0: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
24f0: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
2500: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2510: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2520: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2530: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2540: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 55 49 56  #define WO_EQUIV
2550: 20 20 30 78 34 30 30 20 20 20 20 20 20 20 2f 2a    0x400       /*
2560: 20 4f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d   Of the form A==
2570: 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20  B, both columns 
2580: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
2590: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
25a0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
25b0: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
25c0: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
25d0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
25e0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
25f0: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2600: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2610: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2620: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2630: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2640: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2650: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2660: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2670: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2680: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
2690: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
26a0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
26b0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
26c0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
26d0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
26e0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
26f0: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2700: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2710: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2720: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2730: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2740: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2750: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2760: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2770: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2780: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
2790: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
27a0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
27b0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
27c0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
27d0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
27e0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
27f0: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2800: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2810: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2820: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2830: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2840: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2850: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2860: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2870: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2880: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
2890: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
28a0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
28b0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
28c0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
28d0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
28e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
28f0: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2900: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2910: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2920: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2930: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2940: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2950: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2960: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2970: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2980: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
2990: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
29a0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
29b0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
29c0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
29d0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
29e0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
29f0: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2a00: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2a10: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2a20: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2a30: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2a40: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2a50: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2a60: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2a70: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2a80: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
2a90: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
2aa0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
2ab0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
2ac0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
2ad0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
2ae0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2af0: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2b00: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2b10: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2b20: 45 20 20 20 20 20 20 30 78 30 38 30 66 31 30 30  E      0x080f100
2b30: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2b40: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2b50: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2b60: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2b70: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2b80: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
2b90: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
2ba0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2bb0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
2bc0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
2bd0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
2be0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2bf0: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2c00: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2c10: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2c20: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2c30: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
2c40: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 34  X_ONLY     0x004
2c50: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
2c60: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
2c70: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
2c80: 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 20 20   WHERE_ORDERED  
2c90: 20 20 20 20 30 78 30 30 38 30 30 30 30 30 20 20      0x00800000  
2ca0: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
2cb0: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
2cc0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2cd0: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
2ce0: 20 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20       0x01000000 
2cf0: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2d00: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2d10: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2d20: 45 20 20 20 20 20 20 20 30 78 30 32 30 30 30 30  E       0x020000
2d30: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2d40: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2d50: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2d60: 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20  HERE_ALL_UNIQUE 
2d70: 20 20 30 78 30 34 30 30 30 30 30 30 20 20 2f 2a    0x04000000  /*
2d80: 20 54 68 69 73 20 61 6e 64 20 61 6c 6c 20 70 72   This and all pr
2d90: 69 6f 72 20 68 61 76 65 20 6f 6e 65 20 72 6f 77  ior have one row
2da0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2db0: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30  E_VIRTUALTABLE 0
2dc0: 78 30 38 30 30 30 30 30 30 20 20 2f 2a 20 55 73  x08000000  /* Us
2dd0: 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20  e virtual-table 
2de0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64  processing */.#d
2df0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54  efine WHERE_MULT
2e00: 49 5f 4f 52 20 20 20 20 20 30 78 31 30 30 30 30  I_OR     0x10000
2e10: 30 30 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67  000  /* OR using
2e20: 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65   multiple indice
2e30: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  s */.#define WHE
2e40: 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20  RE_TEMP_INDEX   
2e50: 30 78 32 30 30 30 30 30 30 30 20 20 2f 2a 20 55  0x20000000  /* U
2e60: 73 65 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ses an ephemeral
2e70: 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e   index */.#defin
2e80: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
2e90: 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30 20       0x40000000 
2ea0: 20 2f 2a 20 43 6f 72 72 65 63 74 20 6f 72 64 65   /* Correct orde
2eb0: 72 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a  r for DISTINCT *
2ec0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2ed0: 43 4f 56 45 52 5f 53 43 41 4e 20 20 20 30 78 38  COVER_SCAN   0x8
2ee0: 30 30 30 30 30 30 30 20 20 2f 2a 20 46 75 6c 6c  0000000  /* Full
2ef0: 20 73 63 61 6e 20 6f 66 20 61 20 63 6f 76 65 72   scan of a cover
2f00: 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a  ing index */../*
2f10: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
2f20: 63 6f 6e 74 61 69 6e 73 20 6d 61 6e 79 20 73 65  contains many se
2f30: 70 61 72 61 74 65 20 73 75 62 72 6f 75 74 69 6e  parate subroutin
2f40: 65 73 20 74 68 61 74 20 77 6f 72 6b 20 74 6f 67  es that work tog
2f50: 65 74 68 65 72 20 74 6f 0a 2a 2a 20 66 69 6e 64  ether to.** find
2f60: 20 74 68 65 20 62 65 73 74 20 69 6e 64 69 63 65   the best indice
2f70: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 61 63 63  s to use for acc
2f80: 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75  essing a particu
2f90: 6c 61 72 20 74 61 62 6c 65 20 69 6e 20 61 20 71  lar table in a q
2fa0: 75 65 72 79 2e 0a 2a 2a 20 41 6e 20 69 6e 73 74  uery..** An inst
2fb0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2fc0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2fd0: 68 6f 6c 64 73 20 63 6f 6e 74 65 78 74 20 69 6e  holds context in
2fe0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
2ff0: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 73 65 61  the.** index sea
3000: 72 63 68 20 73 6f 20 74 68 61 74 20 69 74 20 63  rch so that it c
3010: 61 6e 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c  an be more easil
3020: 79 20 70 61 73 73 65 64 20 62 65 74 77 65 65 6e  y passed between
3030: 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20   the various.** 
3040: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 74 79 70  routines..*/.typ
3050: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
3060: 65 42 65 73 74 49 64 78 20 57 68 65 72 65 42 65  eBestIdx WhereBe
3070: 73 74 49 64 78 3b 0a 73 74 72 75 63 74 20 57 68  stIdx;.struct Wh
3080: 65 72 65 42 65 73 74 49 64 78 20 7b 0a 20 20 50  ereBestIdx {.  P
3090: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
30c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
30d0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
30e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
30f0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
3100: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3110: 65 6d 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  em *pSrc;      /
3120: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
3130: 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
3140: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
3150: 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
3160: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3170: 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61   cursors not ava
3180: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 42 69 74 6d  ilable */.  Bitm
3190: 61 73 6b 20 6e 6f 74 56 61 6c 69 64 3b 20 20 20  ask notValid;   
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
31b0: 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c  ursors not avail
31c0: 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72  able for any pur
31d0: 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pose */.  ExprLi
31e0: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
31f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3200: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
3210: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3220: 70 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  pDistinct;      
3230: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 6c        /* The sel
3240: 65 63 74 2d 6c 69 73 74 20 69 66 20 71 75 65 72  ect-list if quer
3250: 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  y is DISTINCT */
3260: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
3270: 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66  _info **ppIdxInf
3280: 6f 3b 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f  o; /* Index info
3290: 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74  rmation passed t
32a0: 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  o xBestIndex */.
32b0: 20 20 69 6e 74 20 69 2c 20 6e 3b 20 20 20 20 20    int i, n;     
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 20 2f 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20    /* Which loop 
32e0: 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 3b 20  is being coded; 
32f0: 23 20 6f 66 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  # of loops */.  
3300: 57 68 65 72 65 4c 65 76 65 6c 20 2a 61 4c 65 76  WhereLevel *aLev
3310: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
3320: 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6f 75  /* Info about ou
3330: 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57  ter loops */.  W
3340: 68 65 72 65 43 6f 73 74 20 63 6f 73 74 3b 20 20  hereCost cost;  
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3360: 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75  * Lowest cost qu
3370: 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a  ery plan */.};..
3380: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
3390: 45 20 69 66 20 74 68 65 20 70 72 6f 62 65 20 63  E if the probe c
33a0: 6f 73 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ost is less than
33b0: 20 74 68 65 20 62 61 73 65 6c 69 6e 65 20 63 6f   the baseline co
33c0: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  st.*/.static int
33d0: 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 63 6f 6e   compareCost(con
33e0: 73 74 20 57 68 65 72 65 43 6f 73 74 20 2a 70 50  st WhereCost *pP
33f0: 72 6f 62 65 2c 20 63 6f 6e 73 74 20 57 68 65 72  robe, const Wher
3400: 65 43 6f 73 74 20 2a 70 42 61 73 65 6c 69 6e 65  eCost *pBaseline
3410: 29 7b 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d  ){.  if( pProbe-
3420: 3e 72 43 6f 73 74 3c 70 42 61 73 65 6c 69 6e 65  >rCost<pBaseline
3430: 2d 3e 72 43 6f 73 74 20 29 20 72 65 74 75 72 6e  ->rCost ) return
3440: 20 31 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65   1;.  if( pProbe
3450: 2d 3e 72 43 6f 73 74 3e 70 42 61 73 65 6c 69 6e  ->rCost>pBaselin
3460: 65 2d 3e 72 43 6f 73 74 20 29 20 72 65 74 75 72  e->rCost ) retur
3470: 6e 20 30 3b 0a 20 20 69 66 28 20 70 50 72 6f 62  n 0;.  if( pProb
3480: 65 2d 3e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3e 70  e->plan.nOBSat>p
3490: 42 61 73 65 6c 69 6e 65 2d 3e 70 6c 61 6e 2e 6e  Baseline->plan.n
34a0: 4f 42 53 61 74 20 29 20 72 65 74 75 72 6e 20 31  OBSat ) return 1
34b0: 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  ;.  if( pProbe->
34c0: 70 6c 61 6e 2e 6e 52 6f 77 3c 70 42 61 73 65 6c  plan.nRow<pBasel
34d0: 69 6e 65 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 29  ine->plan.nRow )
34e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
34f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
3500: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65  Initialize a pre
3510: 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43  allocated WhereC
3520: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
3530: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3540: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
3550: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
3560: 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  pWC,        /* T
3570: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  he WhereClause t
3580: 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  o be initialized
3590: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
35a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
35b0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
35c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
35d0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
35e0: 74 2c 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  t,  /* Mapping f
35f0: 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72  rom table cursor
3600: 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d   numbers to bitm
3610: 61 73 6b 73 20 2a 2f 0a 20 20 75 31 36 20 77 63  asks */.  u16 wc
3620: 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
3630: 20 20 20 2f 2a 20 4d 69 67 68 74 20 69 6e 63 6c     /* Might incl
3640: 75 64 65 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  ude WHERE_AND_ON
3650: 4c 59 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e  LY */.){.  pWC->
3660: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
3670: 0a 20 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  .  pWC->pMaskSet
3680: 20 3d 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70   = pMaskSet;.  p
3690: 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a  WC->pOuter = 0;.
36a0: 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30    pWC->nTerm = 0
36b0: 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d  ;.  pWC->nSlot =
36c0: 20 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e   ArraySize(pWC->
36d0: 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d  aStatic);.  pWC-
36e0: 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69  >a = pWC->aStati
36f0: 63 3b 0a 20 20 70 57 43 2d 3e 77 63 74 72 6c 46  c;.  pWC->wctrlF
3700: 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
3710: 73 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  s;.}../* Forward
3720: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
3730: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
3740: 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65  lauseClear(Where
3750: 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  Clause*);../*.**
3760: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20   Deallocate all 
3770: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
3780: 64 20 77 69 74 68 20 61 20 57 68 65 72 65 4f 72  d with a WhereOr
3790: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
37a0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
37b0: 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  eOrInfoDelete(sq
37c0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
37d0: 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  OrInfo *p){.  wh
37e0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
37f0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
3800: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
3810: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
3820: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
3830: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
3840: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62   WhereAndInfo ob
3850: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
3860: 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66  void whereAndInf
3870: 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  oDelete(sqlite3 
3880: 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66  *db, WhereAndInf
3890: 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c  o *p){.  whereCl
38a0: 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63  auseClear(&p->wc
38b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
38c0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
38d0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
38e0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
38f0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65  ucture.  The Whe
3900: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
3910: 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20  re.** itself is 
3920: 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73  not freed.  This
3930: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
3940: 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72 65  inverse of where
3950: 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f  ClauseInit()..*/
3960: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
3970: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68  reClauseClear(Wh
3980: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
3990: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
39a0: 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69  eTerm *a;.  sqli
39b0: 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70  te3 *db = pWC->p
39c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72  Parse->db;.  for
39d0: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c  (i=pWC->nTerm-1,
39e0: 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b   a=pWC->a; i>=0;
39f0: 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20   i--, a++){.    
3a00: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
3a10: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
3a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3a30: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  prDelete(db, a->
3a40: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
3a50: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
3a60: 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
3a70: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49  {.      whereOrI
3a80: 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  nfoDelete(db, a-
3a90: 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20  >u.pOrInfo);.   
3aa0: 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74   }else if( a->wt
3ab0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44  Flags & TERM_AND
3ac0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
3ad0: 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65  ereAndInfoDelete
3ae0: 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e  (db, a->u.pAndIn
3af0: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  fo);.    }.  }. 
3b00: 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43   if( pWC->a!=pWC
3b10: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
3b20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3b30: 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a  b, pWC->a);.  }.
3b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
3b50: 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54  ingle new WhereT
3b60: 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65  erm entry to the
3b70: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
3b80: 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20  ect pWC..** The 
3b90: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62  new WhereTerm ob
3ba0: 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63  ject is construc
3bb0: 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20  ted from Expr p 
3bc0: 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73  and with wtFlags
3bd0: 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  ..** The index i
3be0: 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68  n pWC->a[] of th
3bf0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
3c00: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
3c10: 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20  uccess..** 0 is 
3c20: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
3c30: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f  new WhereTerm co
3c40: 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64  uld not be added
3c50: 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79   due to a memory
3c60: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  .** allocation e
3c70: 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72  rror.  The memor
3c80: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
3c90: 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63  lure will be rec
3ca0: 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  orded in.** the 
3cb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3cc0: 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69   flag so that hi
3cd0: 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74  gher-level funct
3ce0: 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20  ions can detect 
3cf0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  it..**.** This r
3d00: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72  outine will incr
3d10: 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
3d20: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
3d30: 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
3d40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
3d50: 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20  tFlags argument 
3d60: 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59  includes TERM_DY
3d70: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70  NAMIC, then resp
3d80: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f  onsibility.** fo
3d90: 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78  r freeing the ex
3da0: 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73  pression p is as
3db0: 73 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65  sumed by the Whe
3dc0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
3dd0: 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  pWC..** This is 
3de0: 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69  true even if thi
3df0: 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
3e00: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
3e10: 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  w WhereTerm..**.
3e20: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69  ** WARNING:  Thi
3e30: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
3e40: 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  reallocate the s
3e50: 70 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f  pace used to sto
3e60: 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73  re.** WhereTerms
3e70: 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20  .  All pointers 
3e80: 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68  to WhereTerms sh
3e90: 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61  ould be invalida
3ea0: 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c  ted after.** cal
3eb0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
3ec0: 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72  e.  Such pointer
3ed0: 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69  s may be reiniti
3ee0: 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65  alized by refere
3ef0: 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43  ncing.** the pWC
3f00: 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ->a[] array..*/.
3f10: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
3f20: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65  ClauseInsert(Whe
3f30: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
3f40: 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61  xpr *p, u8 wtFla
3f50: 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  gs){.  WhereTerm
3f60: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
3f70: 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  dx;.  testcase( 
3f80: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
3f90: 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 45 56  IRTUAL );  /* EV
3fa0: 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 20  : R-00211-15100 
3fb0: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  */.  if( pWC->nT
3fc0: 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20  erm>=pWC->nSlot 
3fd0: 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
3fe0: 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b   *pOld = pWC->a;
3ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4000: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e   = pWC->pParse->
4010: 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d  db;.    pWC->a =
4020: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
4030: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  Raw(db, sizeof(p
4040: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
4050: 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66  Slot*2 );.    if
4060: 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20  ( pWC->a==0 ){. 
4070: 20 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73       if( wtFlags
4080: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
4090: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
40a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
40b0: 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   p);.      }.   
40c0: 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64     pWC->a = pOld
40d0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
40e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
40f0: 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c  py(pWC->a, pOld,
4100: 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30   sizeof(pWC->a[0
4110: 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a  ])*pWC->nTerm);.
4120: 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57      if( pOld!=pW
4130: 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20  C->aStatic ){.  
4140: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4150: 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20  e(db, pOld);.   
4160: 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f   }.    pWC->nSlo
4170: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
4180: 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d  locSize(db, pWC-
4190: 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e  >a)/sizeof(pWC->
41a0: 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65  a[0]);.  }.  pTe
41b0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
41c0: 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d   = pWC->nTerm++]
41d0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  ;.  pTerm->pExpr
41e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
41f0: 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20  ipCollate(p);.  
4200: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d  pTerm->wtFlags =
4210: 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72   wtFlags;.  pTer
4220: 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  m->pWC = pWC;.  
4230: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
4240: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64   -1;.  return id
4250: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  x;.}../*.** This
4260: 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66   routine identif
4270: 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f  ies subexpressio
4280: 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ns in the WHERE 
4290: 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20  clause where.** 
42a0: 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
42b0: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
42c0: 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61  by the AND opera
42d0: 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  tor or some othe
42e0: 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70  r.** operator sp
42f0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f  ecified in the o
4300: 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68  p parameter.  Th
4310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
4320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69  ructure.** is fi
4330: 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65  lled with pointe
4340: 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73  rs to subexpress
4350: 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ions.  For examp
4360: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45  le:.**.**    WHE
4370: 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41  RE  a=='hello' A
4380: 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31  ND coalesce(b,11
4390: 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d  )<10 AND (c+12!=
43a0: 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20  d OR c==22).**  
43b0: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
43c0: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
43d0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
43e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
43f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73  .**            s
4400: 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20  lot[0]          
4410: 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20    slot[1]       
4420: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a          slot[2].
4430: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
4440: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
4450: 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c  in pExpr is unal
4460: 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73  tered.  All this
4470: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
4480: 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20   is make slot[] 
4490: 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f  entries point to
44a0: 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69   substructure wi
44b0: 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a  thin pExpr..**.*
44c0: 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75  * In the previou
44d0: 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69  s sentence and i
44e0: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22  n the diagram, "
44f0: 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74  slot[]" refers t
4500: 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c  o.** the WhereCl
4510: 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20  ause.a[] array. 
4520: 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61   The slot[] arra
4530: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65  y grows as neede
4540: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  d to contain.** 
4550: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
4560: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
4570: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
4580: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c  ereSplit(WhereCl
4590: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
45a0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b  *pExpr, int op){
45b0: 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38  .  pWC->op = (u8
45c0: 29 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72  )op;.  if( pExpr
45d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
45e0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f  if( pExpr->op!=o
45f0: 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  p ){.    whereCl
4600: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
4610: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c  pExpr, 0);.  }el
4620: 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  se{.    whereSpl
4630: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
4640: 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77  Left, op);.    w
4650: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
4660: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
4670: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4680: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78  Initialize an ex
4690: 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
46a0: 74 20 28 61 20 57 68 65 72 65 4d 61 73 6b 53 65  t (a WhereMaskSe
46b0: 74 20 6f 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65  t object).*/.#de
46c0: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
46d0: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
46e0: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
46f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4700: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
4710: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
4720: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
4730: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
4740: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
4750: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
4760: 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d  k getMask(WhereM
4770: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4780: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
4790: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
47a0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d  t( pMaskSet->n<=
47b0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d  (int)sizeof(Bitm
47c0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
47d0: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
47e0: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
47f0: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
4800: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
4810: 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74      return ((Bit
4820: 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20  mask)1)<<i;.    
4830: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
4840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
4850: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
4860: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
4870: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
4880: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
4890: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
48a0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
48b0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
48c0: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
48d0: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
48e0: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
48f0: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
4900: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
4910: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
4920: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
4930: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
4940: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
4950: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
4960: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
4970: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
4980: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
4990: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
49a0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
49b0: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
49c0: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
49d0: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
49e0: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
49f0: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sor;.}../*.** Th
4a00: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
4a10: 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61   (recursively) a
4a20: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
4a30: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a  e and generates.
4a40: 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64  ** a bitmask ind
4a50: 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61  icating which ta
4a60: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  bles are used in
4a70: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
4a80: 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  .** tree..**.** 
4a90: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  In order for thi
4aa0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72  s routine to wor
4ab0: 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  k, the calling f
4ac0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76  unction must hav
4ad0: 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  e.** previously 
4ae0: 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52  invoked sqlite3R
4af0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4b00: 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  ) on the express
4b10: 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65  ion.  See.** the
4b20: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
4b30: 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
4b40: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
4b50: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54  nformation..** T
4b60: 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  he sqlite3Resolv
4b70: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75  eExprNames() rou
4b80: 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20  tines looks for 
4b90: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
4ba0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f  .** sets their o
4bb0: 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c  pcodes to TK_COL
4bc0: 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78  UMN and their Ex
4bd0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
4be0: 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   to.** the VDBE 
4bf0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
4c00: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
4c10: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68  s routine just h
4c20: 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61  as to.** transla
4c30: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
4c40: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61  mbers into bitma
4c50: 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52  sk values and OR
4c60: 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d   all.** the bitm
4c70: 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  asks together..*
4c80: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
4c90: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4ca0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
4cb0: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
4cc0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
4cd0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
4ce0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
4cf0: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
4d00: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
4d10: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4d20: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4d30: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
4d40: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
4d50: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4d60: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
4d70: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
4d80: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
4d90: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
4da0: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
4db0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
4dc0: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
4dd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4de0: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
4df0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4e00: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4e10: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
4e20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4e30: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
4e40: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
4e50: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
4e60: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4e70: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
4e80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
4e90: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
4ea0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4eb0: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
4ec0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
4ed0: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
4ee0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
4ef0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
4f00: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
4f10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
4f20: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
4f30: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
4f40: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
4f50: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
4f60: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4f70: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4f80: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4f90: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
4fa0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
4fb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
4fc0: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
4fd0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
4fe0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4ff0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
5000: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
5010: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
5020: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
5030: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
5040: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
5050: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
5060: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
5070: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
5080: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
5090: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
50a0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
50b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
50c0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
50d0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
50e0: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
50f0: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
5100: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
5110: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
5120: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
5130: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
5140: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
5150: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
5160: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
5170: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
5180: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
5190: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
51a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
51b0: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
51c0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
51d0: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
51e0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
51f0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
5200: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
5210: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
5220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5230: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
5240: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
5250: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
5260: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5270: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
5280: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
5290: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
52a0: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
52b0: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
52c0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
52d0: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
52e0: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
52f0: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
5300: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
5310: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45  IN"..**.** IMPLE
5320: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
5330: 35 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62  59926-26393 To b
5340: 65 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69  e usable by an i
5350: 6e 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74  ndex a term must
5360: 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66   be.** of one of
5370: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
5380: 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65  orms: column = e
5390: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
53a0: 20 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a   > expression.**
53b0: 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65   column >= expre
53c0: 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65  ssion column < e
53d0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
53e0: 20 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   <= expression.*
53f0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63  * expression = c
5400: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
5410: 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73   > column expres
5420: 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a  sion >= column.*
5430: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63  * expression < c
5440: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
5450: 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d   <= column colum
5460: 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73  n IN.** (express
5470: 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e  ion-list) column
5480: 20 49 4e 20 28 73 75 62 71 75 65 72 79 29 20 63   IN (subquery) c
5490: 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f  olumn IS NULL.*/
54a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
54b0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
54c0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
54d0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
54e0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
54f0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
5500: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
5510: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
5520: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
5530: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
5540: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
5550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
5560: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
5570: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
5580: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
5590: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
55a0: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
55b0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
55c0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
55d0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
55e0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
55f0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
5600: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
5610: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
5620: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
5630: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
5640: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
5650: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
5660: 74 2f 72 69 67 68 74 20 70 72 65 63 65 6e 64 65  t/right precende
5670: 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69  nce rules come i
5680: 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65  nto play when de
5690: 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  termining the.**
56a0: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 69   collating.** si
56b0: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
56c0: 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73  ison, it remains
56d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
56e0: 20 74 68 65 20 73 61 6d 65 20 73 69 64 65 20 61   the same side a
56f0: 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d  fter.** the comm
5700: 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63  utation. So "Y c
5710: 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70  ollate NOCASE op
5720: 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20   X" becomes .** 
5730: 22 58 20 6f 70 20 59 22 2e 20 54 68 69 73 20 69  "X op Y". This i
5740: 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f  s because any co
5750: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
5760: 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20   on.** the left 
5770: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63  hand side of a c
5780: 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69  omparison overri
5790: 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  des any collatio
57a0: 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61  n sequence .** a
57b0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72  ttached to the r
57c0: 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61  ight. For the sa
57d0: 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50  me reason the EP
57e0: 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a  _Collate flag.**
57f0: 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64   is not commuted
5800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5810: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72   exprCommute(Par
5820: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5830: 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20   *pExpr){.  u16 
5840: 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70  expRight = (pExp
5850: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
5860: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
5870: 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20    u16 expLeft = 
5880: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66  (pExpr->pLeft->f
5890: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
58a0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c  e);.  assert( al
58b0: 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f  lowedOp(pExpr->o
58c0: 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21  p) && pExpr->op!
58d0: 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28 20  =TK_IN );.  if( 
58e0: 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c 65 66  expRight==expLef
58f0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  t ){.    /* Eith
5900: 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74 68 20  er X and Y both 
5910: 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65  have COLLATE ope
5920: 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68 65 72  rator or neither
5930: 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20 65   do */.    if( e
5940: 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  xpRight ){.     
5950: 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64 20 59   /* Both X and Y
5960: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
5970: 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20 73  erators.  Make s
5980: 75 72 65 20 58 20 69 73 20 61 6c 77 61 79 73 0a  ure X is always.
5990: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79        ** used by
59a0: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 45 50   clearing the EP
59b0: 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66 72  _Collate flag fr
59c0: 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20 70  om Y. */.      p
59d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
59e0: 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61  ags &= ~EP_Colla
59f0: 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  te;.    }else if
5a00: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  ( sqlite3ExprCol
5a10: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
5a20: 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
5a30: 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  .      /* Neithe
5a40: 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65 20 43  r X nor Y have C
5a50: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
5a60: 2c 20 62 75 74 20 58 20 68 61 73 20 61 20 6e 6f  , but X has a no
5a70: 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20 20 20  n-default.      
5a80: 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ** collating seq
5a90: 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64 20 74  uence.  So add t
5aa0: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d 61  he EP_Collate ma
5ab0: 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63 61 75  rker on X to cau
5ac0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 74  se.      ** it t
5ad0: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 66 69  o be searched fi
5ae0: 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45  rst. */.      pE
5af0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
5b00: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b  s |= EP_Collate;
5b10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57 41  .    }.  }.  SWA
5b20: 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70  P(Expr*,pExpr->p
5b30: 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65  Right,pExpr->pLe
5b40: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
5b50: 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op>=TK_GT ){. 
5b60: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
5b70: 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20  ==TK_GT+2 );.   
5b80: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
5b90: 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61  TK_LE+2 );.    a
5ba0: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
5bb0: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
5bc0: 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b  ( TK_GT<TK_LE );
5bd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
5be0: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26  pr->op>=TK_GT &&
5bf0: 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47   pExpr->op<=TK_G
5c00: 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  E );.    pExpr->
5c10: 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
5c20: 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54  -TK_GT)^2)+TK_GT
5c30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
5c40: 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b  ranslate from TK
5c50: 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  _xx operator to 
5c60: 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a  WO_xx bitmask..*
5c70: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70 65  /.static u16 ope
5c80: 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70  ratorMask(int op
5c90: 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73  ){.  u16 c;.  as
5ca0: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
5cb0: 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d  op) );.  if( op=
5cc0: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20  =TK_IN ){.    c 
5cd0: 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65  = WO_IN;.  }else
5ce0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
5cf0: 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  LL ){.    c = WO
5d00: 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  _ISNULL;.  }else
5d10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57  {.    assert( (W
5d20: 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29  O_EQ<<(op-TK_EQ)
5d30: 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20  ) < 0x7fff );.  
5d40: 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45    c = (u16)(WO_E
5d50: 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a  Q<<(op-TK_EQ));.
5d60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70    }.  assert( op
5d70: 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63  !=TK_ISNULL || c
5d80: 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
5d90: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5da0: 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29  IN || c==WO_IN )
5db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
5dc0: 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45  TK_EQ || c==WO_E
5dd0: 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  Q );.  assert( o
5de0: 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57  p!=TK_LT || c==W
5df0: 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_LT );.  assert
5e00: 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63  ( op!=TK_LE || c
5e10: 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73  ==WO_LE );.  ass
5e20: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c  ert( op!=TK_GT |
5e30: 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20  | c==WO_GT );.  
5e40: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47  assert( op!=TK_G
5e50: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b  E || c==WO_GE );
5e60: 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
5e70: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
5e80: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
5e90: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
5ea0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
5eb0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
5ec0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
5ed0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
5ee0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
5ef0: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
5f00: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
5f10: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
5f20: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
5f30: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
5f40: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
5f50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
5f60: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
5f70: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
5f80: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74  .** The term ret
5f90: 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59  urned might by Y
5fa0: 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65  =<expr> if there
5fb0: 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73   is another cons
5fc0: 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  traint in.** the
5fd0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
5fe0: 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61  at specifies tha
5ff0: 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68  t X=Y.  Any such
6000: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c   constraints wil
6010: 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69  l be.** identifi
6020: 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55  ed by the WO_EQU
6030: 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54  IV bit in the pT
6040: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66  erm->eOperator f
6050: 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45  ield.  The.** aE
6060: 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c  quiv[] array hol
6070: 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73  ds X and all its
6080: 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69   equivalents, wi
6090: 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69  th each SQL vari
60a0: 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75  able.** taking u
60b0: 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61  p two slots in a
60c0: 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69  Equiv[].  The fi
60d0: 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20  rst slot is for 
60e0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
60f0: 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63  r.** and the sec
6100: 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63  ond is for the c
6110: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54  olumn number.  T
6120: 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74  here are 22 slot
6130: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a  s in aEquiv[].**
6140: 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77   so that means w
6150: 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58  e can look for X
6160: 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f   plus up to 10 o
6170: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ther equivalent 
6180: 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65  values..** Hence
6190: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20   a search for X 
61a0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70  will return <exp
61b0: 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41  r> if X=A1 and A
61c0: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a  1=A2 and A2=A3.*
61d0: 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39  * and ... and A9
61e0: 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78  =A10 and A10=<ex
61f0: 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pr>..**.** If th
6200: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
6210: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
6220: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
6230: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
6240: 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74  expr>".** then t
6250: 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77  ry for the one w
6260: 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63  ith no dependenc
6270: 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20  ies on <expr> - 
6280: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77  in other words w
6290: 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69  here.** <expr> i
62a0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  s a constant exp
62b0: 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  ression of some 
62c0: 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75  kind.  Only retu
62d0: 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a  rn entries of.**
62e0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
62f0: 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20  > Y" where Y is 
6300: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74  a column in anot
6310: 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20  her table if no 
6320: 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20  terms of.** the 
6330: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f  form "X <op> <co
6340: 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74  nst-expr>" exist
6350: 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20  .   If no terms 
6360: 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
6370: 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72  RHS.** exist, tr
6380: 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65  y to return a te
6390: 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  rm that does not
63a0: 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a   use WO_EQUIV..*
63b0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
63c0: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
63d0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
63e0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
63f0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
6400: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
6410: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
6420: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
6430: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
6440: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
6450: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
6460: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
6470: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
6480: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
6490: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
64a0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
64b0: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
64d0: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
64e0: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
64f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
6500: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
6510: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
6520: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
6530: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
6540: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
6550: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
6560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
6570: 72 6d 20 62 65 69 6e 67 20 65 78 61 6d 69 6e 65  rm being examine
6580: 64 20 61 73 20 70 6f 73 73 69 62 6c 65 20 72 65  d as possible re
6590: 73 75 6c 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  sult */.  WhereT
65a0: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
65b0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  ;      /* The an
65c0: 73 77 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a  swer to return *
65d0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
65e0: 2a 70 57 43 4f 72 69 67 20 3d 20 70 57 43 3b 20  *pWCOrig = pWC; 
65f0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 57 43   /* Original pWC
6600: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
6610: 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
6620: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
6630: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 45   counters */.  E
6640: 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
6650: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
6660: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
6670: 69 6f 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ion */.  Parse *
6680: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
6690: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
66a0: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  text */.  int iO
66b0: 72 69 67 43 6f 6c 20 3d 20 69 43 6f 6c 75 6d 6e  rigCol = iColumn
66c0: 3b 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76  ;  /* Original v
66d0: 61 6c 75 65 20 6f 66 20 69 43 6f 6c 75 6d 6e 20  alue of iColumn 
66e0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 75 69 76 20  */.  int nEquiv 
66f0: 3d 20 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 2;          /*
6700: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 69 72   Number of entir
6710: 65 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a  es in aEquiv[] *
6720: 2f 0a 20 20 69 6e 74 20 69 45 71 75 69 76 20 3d  /.  int iEquiv =
6730: 20 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   2;          /* 
6740: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
6750: 73 20 6f 66 20 61 45 71 75 69 76 5b 5d 20 70 72  s of aEquiv[] pr
6760: 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 20 2a  ocessed so far *
6770: 2f 0a 20 20 69 6e 74 20 61 45 71 75 69 76 5b 32  /.  int aEquiv[2
6780: 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2];          /* 
6790: 69 43 75 72 2c 69 43 6f 6c 75 6d 6e 20 61 6e 64  iCur,iColumn and
67a0: 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20   up to 10 other 
67b0: 65 71 75 69 76 61 6c 65 6e 74 73 20 2a 2f 0a 0a  equivalents */..
67c0: 20 20 61 73 73 65 72 74 28 20 69 43 75 72 3e 3d    assert( iCur>=
67d0: 30 20 29 3b 0a 20 20 61 45 71 75 69 76 5b 30 5d  0 );.  aEquiv[0]
67e0: 20 3d 20 69 43 75 72 3b 0a 20 20 61 45 71 75 69   = iCur;.  aEqui
67f0: 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a  v[1] = iColumn;.
6800: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 66    for(;;){.    f
6810: 6f 72 28 70 57 43 3d 70 57 43 4f 72 69 67 3b 20  or(pWC=pWCOrig; 
6820: 70 57 43 3b 20 70 57 43 3d 70 57 43 2d 3e 70 4f  pWC; pWC=pWC->pO
6830: 75 74 65 72 29 7b 0a 20 20 20 20 20 20 66 6f 72  uter){.      for
6840: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b  (pTerm=pWC->a, k
6850: 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20  =pWC->nTerm; k; 
6860: 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k--, pTerm++){. 
6870: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
6880: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
6890: 75 72 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ur.          && 
68a0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
68b0: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
68c0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
68d0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
68e0: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
68f0: 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20  eady)==0.       
6900: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
6910: 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 20 26 20  Operator & op & 
6920: 57 4f 5f 41 4c 4c 29 21 3d 30 0a 20 20 20 20 20  WO_ALL)!=0.     
6930: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
6940: 20 20 20 20 69 66 28 20 69 4f 72 69 67 43 6f 6c      if( iOrigCol
6950: 3e 3d 30 20 26 26 20 70 49 64 78 20 26 26 20 28  >=0 && pIdx && (
6960: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
6970: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30   & WO_ISNULL)==0
6980: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6990: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
69a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
69b0: 63 68 61 72 20 69 64 78 61 66 66 3b 0a 20 20 20  char idxaff;.   
69c0: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
69d0: 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pX = pTerm->pE
69e0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
69f0: 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 43 2d     pParse = pWC-
6a00: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
6a10: 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20         idxaff = 
6a20: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
6a30: 6f 6c 5b 69 4f 72 69 67 43 6f 6c 5d 2e 61 66 66  ol[iOrigCol].aff
6a40: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20  inity;.         
6a50: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
6a60: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
6a70: 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 7b 0a  (pX, idxaff) ){.
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6aa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
6ac0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
6ad0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
6ae0: 6e 63 65 20 72 65 71 75 69 72 65 64 20 66 72 6f  nce required fro
6af0: 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20  m an index for. 
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
6b10: 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  it to be useful 
6b20: 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20 65  for optimising e
6b30: 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53 74  xpression pX. St
6b40: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20 20  ore this.       
6b50: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
6b60: 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c  in variable pCol
6b70: 6c 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l..             
6b80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6b90: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
6ba0: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ft);.           
6bb0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
6bc0: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
6bd0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 70 58  ollSeq(pParse,pX
6be0: 2d 3e 70 4c 65 66 74 2c 70 58 2d 3e 70 52 69 67  ->pLeft,pX->pRig
6bf0: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
6c00: 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
6c10: 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ) pColl = pParse
6c20: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
6c30: 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20  .      .        
6c40: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70        for(j=0; p
6c50: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
6c60: 21 3d 69 4f 72 69 67 43 6f 6c 3b 20 6a 2b 2b 29  !=iOrigCol; j++)
6c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6c80: 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70    if( NEVER(j>=p
6c90: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
6ca0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6cb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6cc0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6cd0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
6ce0: 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
6cf0: 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20  zColl[j]) ){.   
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
6d10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
6d20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6d30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
6d40: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
6d50: 65 71 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20  eqRight==0 ){.  
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65 73              pRes
6d70: 75 6c 74 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ult = pTerm;.   
6d80: 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
6d90: 66 69 6e 64 54 65 72 6d 5f 73 75 63 63 65 73 73  findTerm_success
6da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
6db0: 6c 73 65 20 69 66 28 20 70 52 65 73 75 6c 74 3d  lse if( pResult=
6dc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6dd0: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 70 54      pResult = pT
6de0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  erm;.           
6df0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
6e00: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
6e10: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
6e20: 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a 20 20   WO_EQUIV)!=0.  
6e30: 20 20 20 20 20 20 20 20 20 26 26 20 6e 45 71 75           && nEqu
6e40: 69 76 3c 41 72 72 61 79 53 69 7a 65 28 61 45 71  iv<ArraySize(aEq
6e50: 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20 29  uiv).          )
6e60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 58  {.            pX
6e70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
6e80: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
6e90: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
6ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
6eb0: 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
6ec0: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
6ed0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
6ee0: 3c 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a  <nEquiv; j+=2){.
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6f00: 28 20 61 45 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d  ( aEquiv[j]==pX-
6f10: 3e 69 54 61 62 6c 65 20 26 26 20 61 45 71 75 69  >iTable && aEqui
6f20: 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c  v[j+1]==pX->iCol
6f30: 75 6d 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  umn ) break;.   
6f40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6f50: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
6f60: 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20  quiv ){.        
6f70: 20 20 20 20 20 20 61 45 71 75 69 76 5b 6a 5d 20        aEquiv[j] 
6f80: 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pX->iTable;.  
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 61 45 71 75              aEqu
6fa0: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
6fb0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
6fc0: 20 20 20 20 20 6e 45 71 75 69 76 20 2b 3d 20 32       nEquiv += 2
6fd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6fe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7000: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 45 71 75    }.    if( iEqu
7010: 69 76 3e 3d 6e 45 71 75 69 76 20 29 20 62 72 65  iv>=nEquiv ) bre
7020: 61 6b 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 61  ak;.    iCur = a
7030: 45 71 75 69 76 5b 69 45 71 75 69 76 2b 2b 5d 3b  Equiv[iEquiv++];
7040: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 61  .    iColumn = a
7050: 45 71 75 69 76 5b 69 45 71 75 69 76 2b 2b 5d 3b  Equiv[iEquiv++];
7060: 0a 20 20 7d 0a 66 69 6e 64 54 65 72 6d 5f 73 75  .  }.findTerm_su
7070: 63 63 65 73 73 3a 0a 20 20 72 65 74 75 72 6e 20  ccess:.  return 
7080: 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46  pResult;.}../* F
7090: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
70a0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
70b0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
70c0: 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73  ist*, WhereClaus
70d0: 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  e*, int);../*.**
70e0: 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a   Call exprAnalyz
70f0: 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69  e on all terms i
7100: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
7110: 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61  .  .**.**.*/.sta
7120: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
7130: 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69  lyzeAll(.  SrcLi
7140: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
7150: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
7160: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
7170: 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20  eClause *pWC    
7180: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
7190: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61  E clause to be a
71a0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
71b0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
71c0: 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  WC->nTerm-1; i>=
71d0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70  0; i--){.    exp
71e0: 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
71f0: 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a  t, pWC, i);.  }.
7200: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7210: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
7220: 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43  MIZATION./*.** C
7230: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
7240: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
7250: 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72  ion is a LIKE or
7260: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74   GLOB operator t
7270: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70  hat.** can be op
7280: 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e  timized using in
7290: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
72a0: 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52  ints.  Return TR
72b0: 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73  UE if it is.** s
72c0: 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  o and false if n
72d0: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  ot..**.** In ord
72e0: 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  er for the opera
72f0: 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69  tor to be optimi
7300: 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d  zible, the RHS m
7310: 75 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a  ust be a string.
7320: 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ** literal that 
7330: 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77  does not begin w
7340: 69 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20  ith a wildcard. 
7350: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
7360: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20  isLikeOrGlob(.  
7370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7380: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
7390: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
73a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
73b0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
73c0: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
73d0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  ression */.  Exp
73e0: 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f  r **ppPrefix,  /
73f0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f  * Pointer to TK_
7400: 53 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f  STRING expressio
7410: 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70  n with pattern p
7420: 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a  refix */.  int *
7430: 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20  pisComplete, /* 
7440: 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79  True if the only
7450: 20 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69   wildcard is % i
7460: 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  n the last chara
7470: 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cter */.  int *p
7480: 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54  noCase      /* T
7490: 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65  rue if uppercase
74a0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
74b0: 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29  o lowercase */.)
74c0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
74d0: 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  z = 0;         /
74e0: 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20  * String on RHS 
74f0: 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  of LIKE operator
7500: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
7510: 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  ht, *pLeft;     
7520: 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65   /* Right and le
7530: 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20  ft size of LIKE 
7540: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78  operator */.  Ex
7550: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
7560: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
7570: 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20   of operands to 
7580: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
7590: 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20  r */.  int c;   
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74    /* One charact
75c0: 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69  er in z[] */.  i
75d0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
75e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
75f0: 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63  ber of non-wildc
7600: 61 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61  ard prefix chara
7610: 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20  cters */.  char 
7620: 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  wc[3];          
7630: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
7640: 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  d characters */.
7650: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7660: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
7670: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
7680: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
7690: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30  _value *pVal = 0
76a0: 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  ;.  int op;     
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
76c0: 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67  * Opcode of pRig
76d0: 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71  ht */..  if( !sq
76e0: 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74  lite3IsLikeFunct
76f0: 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70  ion(db, pExpr, p
7700: 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20  noCase, wc) ){. 
7710: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7730: 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f  BCDIC.  if( *pno
7740: 43 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b  Case ) return 0;
7750: 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20  .#endif.  pList 
7760: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
7770: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73  ;.  pLeft = pLis
7780: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
7790: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d   if( pLeft->op!=
77a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c  TK_COLUMN .   ||
77b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
77c0: 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c  nity(pLeft)!=SQL
77d0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20  ITE_AFF_TEXT .  
77e0: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c   || IsVirtual(pL
77f0: 65 66 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a  eft->pTab).  ){.
7800: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32      /* IMP: R-02
7810: 30 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65  065-49465 The le
7820: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
7830: 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  the LIKE or GLOB
7840: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20   operator must. 
7850: 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d     ** be the nam
7860: 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  e of an indexed 
7870: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54  column with TEXT
7880: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
7890: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
78a0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d    assert( pLeft-
78b0: 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29  >iColumn!=(-1) )
78c0: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b  ; /* Because IPK
78d0: 20 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f 54   never has AFF_T
78e0: 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74  EXT */..  pRight
78f0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70   = pList->a[0].p
7900: 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69  Expr;.  op = pRi
7910: 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  ght->op;.  if( o
7920: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
7930: 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68  {.    op = pRigh
7940: 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66  t->op2;.  }.  if
7950: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
7960: 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70  E ){.    Vdbe *p
7970: 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72  Reprepare = pPar
7980: 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a  se->pReprepare;.
7990: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
79a0: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  Right->iColumn;.
79b0: 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
79c0: 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 70  e3VdbeGetValue(p
79d0: 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c  Reprepare, iCol,
79e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
79f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20  );.    if( pVal 
7a00: 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
7a10: 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c  _type(pVal)==SQL
7a20: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
7a30: 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71    z = (char *)sq
7a40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7a50: 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pVal);.    }.  
7a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7a70: 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
7a80: 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20  pVdbe, iCol);.  
7a90: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
7aa0: 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
7ab0: 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d  E || pRight->op=
7ac0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
7ad0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
7ae0: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
7af0: 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a   z = pRight->u.z
7b00: 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  Token;.  }.  if(
7b10: 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20   z ){.    cnt = 
7b20: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
7b30: 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63  =z[cnt])!=0 && c
7b40: 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63  !=wc[0] && c!=wc
7b50: 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20  [1] && c!=wc[2] 
7b60: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
7b70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e      }.    if( cn
7b80: 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38  t!=0 && 255!=(u8
7b90: 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20  )z[cnt-1] ){.   
7ba0: 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69 78     Expr *pPrefix
7bb0: 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70  ;.      *pisComp
7bc0: 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20  lete = c==wc[0] 
7bd0: 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a  && z[cnt+1]==0;.
7be0: 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d 20        pPrefix = 
7bf0: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
7c00: 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20  TK_STRING, z);. 
7c10: 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69 78       if( pPrefix
7c20: 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54   ) pPrefix->u.zT
7c30: 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20  oken[cnt] = 0;. 
7c40: 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d       *ppPrefix =
7c50: 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20   pPrefix;.      
7c60: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
7c70: 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56  BLE ){.        V
7c80: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
7c90: 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20  >pVdbe;.        
7ca0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
7cb0: 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d  rmask(v, pRight-
7cc0: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
7cd0: 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c     if( *pisCompl
7ce0: 65 74 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75  ete && pRight->u
7cf0: 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20  .zToken[1] ){.  
7d00: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
7d10: 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b  e rhs of the LIK
7d20: 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  E expression is 
7d30: 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20  a variable, and 
7d40: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
7d50: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
7d60: 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d  f the variable m
7d70: 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f  eans there is no
7d80: 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20   need to invoke 
7d90: 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20  the LIKE.       
7da0: 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20     ** function, 
7db0: 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61  then no OP_Varia
7dc0: 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65  ble will be adde
7dd0: 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  d to the program
7de0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54  ..          ** T
7df0: 68 69 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c  his causes probl
7e00: 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ems for the sqli
7e10: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
7e20: 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20  er_name().      
7e30: 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77      ** API. To w
7e40: 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20  orkaround them, 
7e50: 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56  add a dummy OP_V
7e60: 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20  ariable here..  
7e70: 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
7e80: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
7e90: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7ea0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7eb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7ec0: 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
7ed0: 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20  , pRight, r1);. 
7ee0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7ef0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7f00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
7f10: 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b  ntAddr(v)-1, 0);
7f20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7f30: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7f40: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
7f50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7f60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7f70: 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   z = 0;.    }.  
7f80: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  }..  sqlite3Valu
7f90: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72  eFree(pVal);.  r
7fa0: 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a  eturn (z!=0);.}.
7fb0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7fc0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
7fd0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66  IZATION */...#if
7fe0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7ff0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
8000: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
8010: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
8020: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
8030: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
8040: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54        column MAT
8050: 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66  CH expr.**.** If
8060: 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74 75   it is then retu
8070: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74  rn TRUE.  If not
8080: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
8090: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
80a0: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20  MatchOfColumn(. 
80b0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
80c0: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
80d0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
80e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
80f0: 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t;..  if( pExpr-
8100: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
8110: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8120: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
8130: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
8140: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63  ->u.zToken,"matc
8150: 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  h")!=0 ){.    re
8160: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
8170: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
8180: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73  List;.  if( pLis
8190: 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20  t->nExpr!=2 ){. 
81a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
81b0: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b  .  if( pList->a[
81c0: 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20  1].pExpr->op != 
81d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
81e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
81f0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
8200: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
8210: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
8220: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  */../*.** If the
8230: 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69 6f   pBase expressio
8240: 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  n originated in 
8250: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
8260: 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a  clause of.** a j
8270: 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  oin, then transf
8280: 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  er the appropria
8290: 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72  te markings over
82a0: 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a   to derived..*/.
82b0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e  static void tran
82c0: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
82d0: 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c  (Expr *pDerived,
82e0: 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20   Expr *pBase){. 
82f0: 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73   pDerived->flags
8300: 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73   |= pBase->flags
8310: 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a   & EP_FromJoin;.
8320: 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67    pDerived->iRig
8330: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42  htJoinTable = pB
8340: 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ase->iRightJoinT
8350: 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  able;.}..#if !de
8360: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8370: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
8380: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
8390: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
83a0: 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ERY)./*.** Analy
83b0: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 63  ze a term that c
83c0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f  onsists of two o
83d0: 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63  r more OR-connec
83e0: 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e  ted.** subterms.
83f0: 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20    So in:.**.**  
8400: 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61     ... WHERE  (a
8410: 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20  =5) AND (b=7 OR 
8420: 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44  c=9 OR d=13) AND
8430: 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20   (d=13).**      
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e      ^^^^^^^^^^^^
8460: 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54  ^^^^^^^^.**.** T
8470: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
8480: 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68 20  yzes terms such 
8490: 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65  as the middle te
84a0: 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  rm in the above 
84b0: 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68  example..** A Wh
84c0: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
84d0: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
84e0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
84f0: 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61   term under.** a
8500: 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c  nalysis, regardl
8510: 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f  ess of the outco
8520: 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73  me of the analys
8530: 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a  is.  Hence:.**.*
8540: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
8550: 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45  wtFlags   |=  TE
8560: 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20  RM_ORINFO.**    
8570: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
8580: 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d  Info  =  a dynam
8590: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
85a0: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
85b0: 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ect.**.** The te
85c0: 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
85d0: 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20  d must have two 
85e0: 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f  or more of OR-co
85f0: 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d 73  nnected subterms
8600: 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75  ..** A single su
8610: 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61  bterm might be a
8620: 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e   set of AND-conn
8630: 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65 72  ected sub-subter
8640: 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20  ms..** Examples 
8650: 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61  of terms under a
8660: 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  nalysis:.**.**  
8670: 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d     (A)     t1.x=
8680: 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e  t2.y OR t1.x=t2.
8690: 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20  z OR t1.y=15 OR 
86a0: 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20  t1.z=t3.a+5.**  
86b0: 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78 70     (B)     x=exp
86c0: 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52  r1 OR expr2=x OR
86d0: 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20   x=expr3.**     
86e0: 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (C)     t1.x=t2.
86f0: 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20  y OR (t1.x=t2.z 
8700: 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20  AND t1.y=15).** 
8710: 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65 78      (D)     x=ex
8720: 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44  pr1 OR (y>11 AND
8730: 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45   y<22 AND z LIKE
8740: 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20   '*hello*').**  
8750: 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d     (E)     (p.a=
8760: 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20  1 AND q.b=2 AND 
8770: 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34  r.c=3) OR (p.x=4
8780: 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72   AND q.y=5 AND r
8790: 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  .z=6).**.** CASE
87a0: 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   1:.**.** If all
87b0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66   subterms are of
87c0: 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78   the form T.C=ex
87d0: 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  pr for some sing
87e0: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61  le column of C a
87f0: 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74  nd.** a single t
8800: 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e  able T (as shown
8810: 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62   in example B ab
8820: 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65  ove) then create
8830: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
8840: 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61  * term that is a
8850: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20  n equivalent IN 
8860: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20  expression.  In 
8870: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
8880: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e  the term.** bein
8890: 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a  g analyzed is:.*
88a0: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78  *.**      x = ex
88b0: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
88c0: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
88d0: 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65  3.**.** then cre
88e0: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
88f0: 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73  l term like this
8900: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  :.**.**      x I
8910: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
8920: 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  xpr3).**.** CASE
8930: 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   2:.**.** If all
8940: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
8950: 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e  dexable by a sin
8960: 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65  gle table T, the
8970: 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n set.**.**     
8980: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
8990: 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  tor             
89a0: 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20   =  WO_OR.**    
89b0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
89c0: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
89d0: 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20   |=  the cursor 
89e0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
89f0: 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65   T.**.** A subte
8a00: 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65  rm is "indexable
8a10: 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68  " if it is of th
8a20: 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c  e form.** "T.C <
8a30: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
8a40: 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d  e C is any colum
8a50: 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64  n of table T and
8a60: 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   .** <op> is one
8a70: 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c   of "=", "<", "<
8a80: 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22  =", ">", ">=", "
8a90: 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e  IS NULL", or "IN
8aa0: 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  "..** A subterm 
8ab0: 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c  is also indexabl
8ac0: 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e  e if it is an AN
8ad0: 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  D of two or more
8ae0: 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20  .** subsubterms 
8af0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
8b00: 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62  which is indexab
8b10: 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41  le.  Indexable A
8b20: 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20  ND .** subterms 
8b30: 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72  have their eOper
8b40: 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41  ator set to WO_A
8b50: 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65  ND and they have
8b60: 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73  .** u.pAndInfo s
8b70: 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  et to a dynamica
8b80: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
8b90: 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63  ereAndTerm objec
8ba0: 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e  t..**.** From an
8bb0: 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76  other point of v
8bc0: 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22  iew, "indexable"
8bd0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
8be0: 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a  subterm could.**
8bf0: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
8c00: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
8c10: 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  ex if an appropr
8c20: 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74  iate index exist
8c30: 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79  s..** This analy
8c40: 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  sis does not con
8c50: 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72  sider whether or
8c60: 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65   not the index e
8c70: 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69  xists; that.** i
8c80: 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20  s something the 
8c90: 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74  bestIndex() rout
8ca0: 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69  ine will determi
8cb0: 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73  ne.  This analys
8cc0: 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73  is.** only looks
8cd0: 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74   at whether subt
8ce0: 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65  erms appropriate
8cf0: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78   for indexing ex
8d00: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65  ist..**.** All e
8d10: 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67  xamples A throug
8d20: 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61  h E above all sa
8d30: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42  tisfy case 2.  B
8d40: 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20  ut if a term.** 
8d50: 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20  also statisfies 
8d60: 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20  case 1 (such as 
8d70: 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  B) we know that 
8d80: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69  the optimizer wi
8d90: 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65  ll.** always pre
8da0: 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69  fer case 1, so i
8db0: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70  n that case we p
8dc0: 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65  retend that case
8dd0: 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74   2 is not.** sat
8de0: 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74  isfied..**.** It
8df0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
8e00: 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  se that multiple
8e10: 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65   tables are inde
8e20: 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d  xable.  For exam
8e30: 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76  ple,.** (E) abov
8e40: 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f  e is indexable o
8e50: 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61  n tables P, Q, a
8e60: 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  nd R..**.** Term
8e70: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
8e80: 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64  ase 2 are candid
8e90: 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20  ates for lookup 
8ea0: 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61  by using.** sepa
8eb0: 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20  rate indices to 
8ec0: 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20  find rowids for 
8ed0: 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64  each subterm and
8ee0: 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68   composing.** th
8ef0: 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72  e union of all r
8f00: 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f  owids using a Ro
8f10: 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  wSet object.  Th
8f20: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  is is similar.**
8f30: 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69   to "bitmap indi
8f40: 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61  ces" in other da
8f50: 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a  tabase engines..
8f60: 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a  **.** OTHERWISE:
8f70: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
8f80: 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73  r case 1 nor cas
8f90: 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20  e 2 apply, then 
8fa0: 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61  leave the eOpera
8fb0: 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65  tor set to.** ze
8fc0: 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69  ro.  This term i
8fd0: 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72  s not useful for
8fe0: 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74   search..*/.stat
8ff0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
9000: 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63  yzeOrTerm(.  Src
9010: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
9020: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
9030: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
9040: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
9050: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
9060: 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63  complete WHERE c
9070: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
9080: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
9090: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
90a0: 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20   the OR-term to 
90b0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
90c0: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
90d0: 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b  e = pWC->pParse;
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
90f0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
9100: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9110: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
9120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
9130: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9140: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
9150: 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e   *pTerm = &pWC->
9160: 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f  a[idxTerm];    /
9170: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
9180: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45   analyzed */.  E
9190: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
91a0: 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20  rm->pExpr;      
91b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
91c0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
91d0: 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d  term */.  WhereM
91e0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
91f0: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
9200: 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65 20 6d  ; /* Table use m
9210: 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  asks */.  int i;
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9250: 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  rs */.  WhereCla
9260: 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20  use *pOrWc;     
9270: 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20    /* Breakup of 
9280: 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65  pTerm into subte
9290: 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  rms */.  WhereTe
92a0: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20  rm *pOrTerm;    
92b0: 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d     /* A Sub-term
92c0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57   within the pOrW
92d0: 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e  c */.  WhereOrIn
92e0: 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20  fo *pOrInfo;    
92f0: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69   /* Additional i
9300: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63  nformation assoc
9310: 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d  iated with pTerm
9320: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68   */.  Bitmask ch
9330: 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20  ngToIN;         
9340: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
9350: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
9360: 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  e 1 */.  Bitmask
9370: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
9380: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
9390: 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c  t are indexable,
93a0: 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65   satisfying case
93b0: 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   2 */..  /*.  **
93c0: 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c   Break the OR cl
93d0: 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65  ause into its se
93e0: 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e  parate subterms.
93f0: 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61    The subterms a
9400: 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  re.  ** stored i
9410: 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  n a WhereClause 
9420: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
9430: 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20  ning within the 
9440: 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a  WhereOrInfo.  **
9450: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
9460: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
9470: 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75  original OR clau
9480: 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20  se term..  */.  
9490: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
94a0: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
94b0: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49  DYNAMIC|TERM_ORI
94c0: 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  NFO|TERM_ANDINFO
94d0: 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
94e0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
94f0: 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  _OR );.  pTerm->
9500: 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49  u.pOrInfo = pOrI
9510: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
9520: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
9530: 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b  zeof(*pOrInfo));
9540: 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d  .  if( pOrInfo==
9550: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  0 ) return;.  pT
9560: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
9570: 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70  TERM_ORINFO;.  p
9580: 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d  OrWc = &pOrInfo-
9590: 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  >wc;.  whereClau
95a0: 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57  seInit(pOrWc, pW
95b0: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C->pParse, pMask
95c0: 53 65 74 2c 20 70 57 43 2d 3e 77 63 74 72 6c 46  Set, pWC->wctrlF
95d0: 6c 61 67 73 29 3b 0a 20 20 77 68 65 72 65 53 70  lags);.  whereSp
95e0: 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72  lit(pOrWc, pExpr
95f0: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72  , TK_OR);.  expr
9600: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
9610: 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64   pOrWc);.  if( d
9620: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9630: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
9640: 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  rt( pOrWc->nTerm
9650: 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  >=2 );..  /*.  *
9660: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65  * Compute the se
9670: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
9680: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
9690: 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a  ases 1 or 2..  *
96a0: 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20  /.  indexable = 
96b0: 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63  ~(Bitmask)0;.  c
96c0: 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d  hngToIN = ~(Bitm
96d0: 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70  ask)0;.  for(i=p
96e0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
96f0: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
9700: 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62   i>=0 && indexab
9710: 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  le; i--, pOrTerm
9720: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f  ++){.    if( (pO
9730: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
9740: 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30   & WO_SINGLE)==0
9750: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41   ){.      WhereA
9760: 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f  ndInfo *pAndInfo
9770: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9780: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
9790: 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46  s & (TERM_ANDINF
97a0: 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d  O|TERM_ORINFO))=
97b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67  =0 );.      chng
97c0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
97d0: 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pAndInfo = sqlit
97e0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
97f0: 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e  , sizeof(*pAndIn
9800: 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fo));.      if( 
9810: 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pAndInfo ){.    
9820: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
9830: 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20  *pAndWC;.       
9840: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64   WhereTerm *pAnd
9850: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Term;.        in
9860: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74  t j;.        Bit
9870: 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20  mask b = 0;.    
9880: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70      pOrTerm->u.p
9890: 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e  AndInfo = pAndIn
98a0: 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54  fo;.        pOrT
98b0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
98c0: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20  TERM_ANDINFO;.  
98d0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65        pOrTerm->e
98e0: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e  Operator = WO_AN
98f0: 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  D;.        pAndW
9900: 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77  C = &pAndInfo->w
9910: 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  c;.        where
9920: 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57  ClauseInit(pAndW
9930: 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  C, pWC->pParse, 
9940: 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77  pMaskSet, pWC->w
9950: 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
9960: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
9970: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
9980: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
9990: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
99a0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
99b0: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
99c0: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
99d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
99e0: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
99f0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
9a00: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
9a10: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
9a20: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
9a30: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
9a40: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
9a50: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
9a60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
9a70: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
9a80: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
9a90: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
9aa0: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
9ab0: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
9ad0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
9ae0: 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66  t, pAndTerm->lef
9af0: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
9b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9b10: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9b20: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
9b30: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
9b40: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
9b50: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
9b60: 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20  ERM_COPIED ){.  
9b70: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73      /* Skip this
9b80: 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20   term for now.  
9b90: 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68  We revisit it wh
9ba0: 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68  en we process th
9bb0: 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65  e.      ** corre
9bc0: 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49  sponding TERM_VI
9bd0: 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20  RTUAL term */.  
9be0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
9bf0: 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20  itmask b;.      
9c00: 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  b = getMask(pMas
9c10: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
9c20: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
9c30: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77    if( pOrTerm->w
9c40: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
9c50: 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  RTUAL ){.       
9c60: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
9c70: 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70  er = &pOrWc->a[p
9c80: 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  OrTerm->iParent]
9c90: 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67  ;.        b |= g
9ca0: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
9cb0: 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72   pOther->leftCur
9cc0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
9cd0: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
9ce0: 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   b;.      if( (p
9cf0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9d00: 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b  r & WO_EQ)==0 ){
9d10: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
9d20: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  N = 0;.      }el
9d30: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67  se{.        chng
9d40: 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20  ToIN &= b;.     
9d50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
9d60: 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74  /*.  ** Record t
9d70: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
9d80: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
9d90: 73 65 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d  se 2.  The set m
9da0: 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70  ight be.  ** emp
9db0: 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e  ty..  */.  pOrIn
9dc0: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20  fo->indexable = 
9dd0: 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65  indexable;.  pTe
9de0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
9df0: 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30  indexable==0 ? 0
9e00: 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a   : WO_OR;..  /*.
9e10: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f    ** chngToIN ho
9e20: 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62  lds a set of tab
9e30: 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a  les that *might*
9e40: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e   satisfy case 1.
9e50: 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61    But.  ** we ha
9e60: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64  ve to do some ad
9e70: 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e  ditional checkin
9e80: 67 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65  g to see if case
9e90: 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69   1 really.  ** i
9ea0: 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a  s satisfied..  *
9eb0: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
9ec0: 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72  will hold either
9ed0: 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73   0, 1, or 2 bits
9ee0: 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73  .  The 0-bit cas
9ef0: 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  e means.  ** tha
9f00: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  t there is no po
9f10: 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61  ssibility of tra
9f20: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52  nsforming the OR
9f30: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a   clause into an.
9f40: 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72    ** IN operator
9f50: 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20   because one or 
9f60: 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68  more terms in th
9f70: 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74  e OR clause cont
9f80: 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69  ain.  ** somethi
9f90: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d  ng other than ==
9fa0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   on a column in 
9fb0: 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  the single table
9fc0: 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a  .  The 1-bit.  *
9fd0: 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61  * case means tha
9fe0: 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  t every term of 
9ff0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73  the OR clause is
a000: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a   of the form.  *
a010: 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d  * "table.column=
a020: 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73  expr" for some s
a030: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
a040: 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69  e one bit that i
a050: 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20  s set.  ** will 
a060: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
a070: 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20  e common table. 
a080: 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   We still need t
a090: 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a  o check to make.
a0a0: 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61    ** sure the sa
a0b0: 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  me column is use
a0c0: 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20  d on all terms. 
a0d0: 20 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   The 2-bit case 
a0e0: 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65  is when.  ** the
a0f0: 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f   all terms are o
a100: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
a110: 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32  e1.column=table2
a120: 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20  .column".  It.  
a130: 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73  ** might be poss
a140: 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20  ible to form an 
a150: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
a160: 20 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63   either table1.c
a170: 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61  olumn.  ** or ta
a180: 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74  ble2.column as t
a190: 68 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72  he LHS if either
a1a0: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76   is common to ev
a1b0: 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a  ery term of.  **
a1c0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a   the OR clause..
a1d0: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
a1e0: 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  hat terms of the
a1f0: 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c   form "table.col
a200: 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d  umn1=table.colum
a210: 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61  n2" (the.  ** sa
a220: 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68  me table on both
a230: 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d   sizes of the ==
a240: 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  ) cannot be opti
a250: 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  mized..  */.  if
a260: 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ( chngToIN ){.  
a270: 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    int okToChngTo
a280: 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  IN = 0;     /* T
a290: 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65  rue if the conve
a2a0: 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76  rsion to IN is v
a2b0: 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alid */.    int 
a2c0: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  iColumn = -1;   
a2d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
a2e0: 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20  index on lhs of 
a2f0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
a300: 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d     int iCursor =
a310: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
a320: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d  Table cursor com
a330: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73  mon to all terms
a340: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20   */.    int j = 
a350: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
a360: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a370: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  r */..    /* Sea
a380: 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20  rch for a table 
a390: 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  and column that 
a3a0: 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73  appears on one s
a3b0: 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ide or the.    *
a3c0: 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d  * other of the =
a3d0: 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76  = operator in ev
a3e0: 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68  ery subterm.  Th
a3f0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  at table and col
a400: 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  umn.    ** will 
a410: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69  be recorded in i
a420: 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75  Cursor and iColu
a430: 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74  mn.  There might
a440: 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20   not be any.    
a450: 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e  ** such table an
a460: 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f  d column.  Set o
a470: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61  kToChngToIN if a
a480: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61  n appropriate ta
a490: 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63  ble.    ** and c
a4a0: 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62  olumn is found b
a4b0: 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e  ut leave okToChn
a4c0: 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e  gToIN false if n
a4d0: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f  ot found..    */
a4e0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
a4f0: 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f  2 && !okToChngTo
a500: 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  IN; j++){.      
a510: 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d  pOrTerm = pOrWc-
a520: 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  >a;.      for(i=
a530: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20  pOrWc->nTerm-1; 
a540: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
a550: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
a560: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
a570: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
a580: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  Q );.        pOr
a590: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
a5a0: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
a5b0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
a5c0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
a5d0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
a5e0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
a5f0: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e  he 2-bit case an
a600: 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20  d we are on the 
a610: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
a620: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
a630: 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  * current term i
a640: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  s from the first
a650: 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20   iteration.  So 
a660: 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20  skip this term. 
a670: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
a680: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
a690: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
a6a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a6b0: 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e     if( (chngToIN
a6c0: 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
a6d0: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
a6e0: 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b  ftCursor))==0 ){
a6f0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
a700: 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  is term must be 
a710: 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61  of the form t1.a
a720: 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20  ==t2.b where t2 
a730: 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  is in the.      
a740: 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20      ** chngToIN 
a750: 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f  set but t1 is no
a760: 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69  t.  This term wi
a770: 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65  ll be either pre
a780: 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20 20  ceeded.         
a790: 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62   ** or follwed b
a7a0: 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f  y an inverted co
a7b0: 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e  py (t2.b==t1.a).
a7c0: 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d    Skip this term
a7d0: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
a7e0: 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65 72  nd use its inver
a7f0: 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  sion. */.       
a800: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72     testcase( pOr
a810: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
a820: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20  TERM_COPIED );. 
a830: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
a840: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
a850: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
a860: 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  AL );.          
a870: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
a880: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
a890: 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52  _COPIED|TERM_VIR
a8a0: 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20  TUAL) );.       
a8b0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
a8c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a8d0: 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d  Column = pOrTerm
a8e0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
a8f0: 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 20          iCursor 
a900: 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  = pOrTerm->leftC
a910: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62  ursor;.        b
a920: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a930: 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
a940: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e         /* No can
a950: 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c  didate table+col
a960: 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  umn was found.  
a970: 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
a980: 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  cur.        ** o
a990: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65  n the second ite
a9a0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
a9b0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
a9c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a9d0: 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63  ( IsPowerOfTwo(c
a9e0: 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20  hngToIN) );.    
a9f0: 20 20 20 20 61 73 73 65 72 74 28 20 63 68 6e 67      assert( chng
aa00: 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d  ToIN==getMask(pM
aa10: 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29  askSet, iCursor)
aa20: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
aa30: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
aa40: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20   testcase( j==1 
aa50: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  );..      /* We 
aa60: 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e  have found a can
aa70: 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64  didate table and
aa80: 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20   column.  Check 
aa90: 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20  to see if that. 
aaa0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e       ** table an
aab0: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d  d column is comm
aac0: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
aad0: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
aae0: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43  e */.      okToC
aaf0: 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  hngToIN = 1;.   
ab00: 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26     for(; i>=0 &&
ab10: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69   okToChngToIN; i
ab20: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
ab30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ab40: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
ab50: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
ab60: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
ab70: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
ab80: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
ab90: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
aba0: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
abb0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
abc0: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
abd0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
abe0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
abf0: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
ac00: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
ac10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
ac20: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
ac30: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
ac40: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
ac50: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
ac60: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
ac70: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
ac80: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
ac90: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
aca0: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
acb0: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
acc0: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
acd0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
ace0: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
acf0: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
ad00: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
ad10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
ad20: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
ad30: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
ad40: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
ad50: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
ad60: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
ad70: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
ad80: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
ad90: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
ada0: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
adb0: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
adc0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
add0: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
ade0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
adf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ae00: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
ae10: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
ae20: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
ae30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ae40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
ae50: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
ae60: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
ae70: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
ae80: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
ae90: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
aea0: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
aeb0: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
aec0: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
aed0: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
aee0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
aef0: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
af00: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a     **.    ** EV:
af10: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20   R-00211-15100. 
af20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
af30: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
af40: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
af50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
af60: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
af70: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
af80: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
af90: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
afa0: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
afb0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
afc0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
afd0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
afe0: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
aff0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
b000: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
b010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b020: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
b030: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
b040: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
b050: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
b060: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
b070: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
b080: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
b090: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
b0a0: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
b0b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b0c0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
b0d0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
b0e0: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
b0f0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
b100: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
b110: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
b120: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
b130: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
b140: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
b150: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
b160: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
b170: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
b180: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
b190: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
b1a0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
b1b0: 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  WC->pParse, pLis
b1c0: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
b1d0: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
b1e0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
b1f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
b200: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
b210: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
b220: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b230: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
b240: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
b250: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
b260: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
b270: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
b280: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
b290: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
b2a0: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
b2b0: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
b2c0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
b2d0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
b2e0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
b2f0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
b300: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
b310: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
b320: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
b330: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
b340: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
b350: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
b360: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
b370: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
b380: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
b390: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
b3a0: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
b3b0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
b3c0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
b3d0: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
b3e0: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
b3f0: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
b400: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
b410: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
b420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b430: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
b440: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
b450: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
b460: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
b470: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
b480: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
b490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
b4a0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
b4b0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
b4c0: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
b4d0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
b4e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
b4f0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
b500: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
b510: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
b520: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
b530: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
b540: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
b550: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
b560: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
b570: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
b580: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
b590: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
b5a0: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
b5b0: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
b5c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
b5d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
b5e0: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
b5f0: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
b600: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
b610: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
b620: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
b630: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
b640: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b650: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
b660: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
b670: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
b680: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
b690: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
b6a0: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
b6b0: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
b6c0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
b6d0: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
b6e0: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
b6f0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
b700: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
b710: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
b720: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
b730: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
b740: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
b750: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
b760: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
b770: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
b780: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
b790: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
b7a0: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
b7b0: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
b7c0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
b7d0: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
b7e0: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
b7f0: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
b800: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
b810: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
b820: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
b830: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
b840: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
b850: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
b860: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
b870: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
b880: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
b890: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
b8a0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
b8b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
b8c0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
b8d0: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
b8e0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
b8f0: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
b900: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
b910: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
b920: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
b930: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  /* The term to b
b960: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
b970: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
b980: 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20  askSet;         
b990: 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65   /* Set of table
b9a0: 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a   index masks */.
b9b0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
b9e0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
b9f0: 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  zed */.  Bitmask
ba00: 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20   prereqLeft;    
ba10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
ba20: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74 68  requesites of th
ba30: 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a  e pExpr->pLeft *
ba40: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
ba50: 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  eqAll;          
ba60: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
ba70: 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a  sites of pExpr *
ba80: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
ba90: 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20  aRight = 0;     
baa0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65       /* Extra de
bab0: 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45  pendencies on LE
bac0: 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70  FT JOIN */.  Exp
bad0: 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20  r *pStr1 = 0;   
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
baf0: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
bb00: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
bb10: 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d  int isComplete =
bb20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bb30: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
bb40: 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77  GLOB ends with w
bb50: 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74  ildcard */.  int
bb60: 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20   noCase = 0;    
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb80: 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69   LIKE/GLOB disti
bb90: 6e 67 75 69 73 68 65 73 20 63 61 73 65 20 2a 2f  nguishes case */
bba0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c      /* Top-level
bbd0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70   operator.  pExp
bbe0: 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65  r->op */.  Parse
bbf0: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
bc00: 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50  pParse;     /* P
bc10: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
bc20: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
bc30: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
bc40: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
bc50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
bc60: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
bc70: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
bc80: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72  turn;.  }.  pTer
bc90: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
bca0: 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74  erm];.  pMaskSet
bcb0: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
bcc0: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
bcd0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
bce0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
bcf0: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
bd00: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
bd10: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
bd20: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
bd30: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
bd40: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
bd50: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
bd60: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
bd70: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
bd80: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
bd90: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
bda0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
bdb0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
bdc0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
bdd0: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
bde0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
bdf0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
be00: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
be10: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
be20: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
be30: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
be40: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
be50: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
be60: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
be70: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
be80: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
be90: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
bea0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
beb0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
bec0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
bed0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
bee0: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
bef0: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
bf00: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
bf10: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
bf20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
bf30: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
bf40: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
bf50: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
bf60: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
bf70: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
bf80: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
bf90: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
bfa0: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
bfb0: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
bfc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
bfd0: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
c000: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
c010: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
c020: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
c030: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
c040: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
c050: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
c060: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
c070: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
c080: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c090: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
c0a0: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
c0b0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
c0c0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
c0d0: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
c0e0: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
c0f0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
c100: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
c110: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
c120: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
c130: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
c140: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
c150: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
c160: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
c170: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
c180: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
c190: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
c1a0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
c1b0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
c1c0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
c1d0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
c1e0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
c1f0: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
c200: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
c210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c220: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
c230: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
c240: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
c250: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
c260: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
c270: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
c280: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
c290: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
c2a0: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
c2b0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
c2c0: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
c2d0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
c2e0: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
c2f0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
c300: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
c310: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
c320: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c330: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
c340: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
c350: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
c360: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c370: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
c380: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
c390: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
c3a0: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
c3b0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
c3c0: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
c3d0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
c3e0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
c3f0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
c400: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
c410: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
c420: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
c430: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
c440: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
c450: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
c460: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
c470: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
c480: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
c490: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
c4a0: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
c4b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
c4c0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
c4d0: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
c4e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
c4f0: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
c500: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
c510: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
c520: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c530: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
c540: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
c550: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
c560: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
c570: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
c580: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
c590: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
c5a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
c5b0: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
c5c0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
c5d0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
c5e0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
c5f0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
c600: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
c610: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
c620: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
c630: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
c640: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
c650: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
c660: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
c670: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
c680: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
c690: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
c6a0: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
c6b0: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
c6c0: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
c6d0: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
c6e0: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
c6f0: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
c700: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
c710: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
c720: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
c730: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c740: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
c750: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
c760: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
c770: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
c780: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
c790: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
c7a0: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
c7b0: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
c7c0: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
c7d0: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
c7e0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
c7f0: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
c800: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
c810: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
c820: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
c830: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
c840: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
c850: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
c860: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
c870: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
c880: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
c890: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
c8a0: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
c8b0: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
c8c0: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
c8d0: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
c8e0: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
c8f0: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
c900: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
c910: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
c920: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
c930: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
c940: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
c950: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
c960: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
c970: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
c980: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
c990: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
c9a0: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
c9b0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
c9c0: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
c9d0: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
c9e0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
c9f0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
ca00: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
ca10: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
ca20: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
ca30: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
ca40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
ca50: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
ca60: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
ca70: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
ca80: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
ca90: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
caa0: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
cab0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
cac0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
cad0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
cae0: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
cb10: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
cb20: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cb50: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
cb60: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
cb70: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
cb80: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
cb90: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
cba0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
cbb0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
cbc0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
cbd0: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
cbe0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
cbf0: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
cc00: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
cc10: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
cc20: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
cc30: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
cc40: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
cc50: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
cc60: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
cc70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
cc80: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
cc90: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64  ATION */..#if !d
cca0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ccb0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
ccc0: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
ccd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
cce0: 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79  UERY).  /* Analy
ccf0: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69  ze a term that i
cd00: 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77  s composed of tw
cd10: 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72  o or more subter
cd20: 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  ms connected by.
cd30: 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61    ** an OR opera
cd40: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  tor..  */.  else
cd50: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
cd60: 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73  TK_OR ){.    ass
cd70: 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  ert( pWC->op==TK
cd80: 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72  _AND );.    expr
cd90: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53  AnalyzeOrTerm(pS
cda0: 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d  rc, pWC, idxTerm
cdb0: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
cdc0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
cdd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
cde0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
cdf0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
ce00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ce10: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
ce20: 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f  TION.  /* Add co
ce30: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64  nstraints to red
ce40: 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
ce50: 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f  pace on a LIKE o
ce60: 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72  r GLOB.  ** oper
ce70: 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
ce80: 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f  A like pattern o
ce90: 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49  f the form "x LI
cea0: 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68  KE 'abc%'" is ch
ceb0: 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74  anged into const
cec0: 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a  raints.  **.  **
ced0: 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62            x>='ab
cee0: 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41  c' AND x<'abd' A
cef0: 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  ND x LIKE 'abc%'
cf00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
cf10: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ast character of
cf20: 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63   the prefix "abc
cf30: 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  " is incremented
cf40: 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a   to form the.  *
cf50: 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  * termination co
cf60: 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20  ndition "abd".. 
cf70: 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f   */.  if( pWC->o
cf80: 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26  p==TK_AND .   &&
cf90: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50   isLikeOrGlob(pP
cfa0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53  arse, pExpr, &pS
cfb0: 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65  tr1, &isComplete
cfc0: 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a  , &noCase).  ){.
cfd0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
cfe0: 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66         /* LHS of
cff0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
d000: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
d010: 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a  *pStr2;       /*
d020: 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d   Copy of pStr1 -
d030: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
d040: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
d050: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
d060: 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  1;.    Expr *pNe
d070: 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20  wExpr2;.    int 
d080: 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74  idxNew1;.    int
d090: 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f   idxNew2;.    To
d0a0: 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  ken sCollSeqName
d0b0: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ;  /* Name of co
d0c0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d0d0: 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d   */..    pLeft =
d0e0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
d0f0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
d100: 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33   pStr2 = sqlite3
d110: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72  ExprDup(db, pStr
d120: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 0);.    if( !
d130: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d140: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20   ){.      u8 c, 
d150: 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61  *pC;       /* La
d160: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
d170: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69  ore the first wi
d180: 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20  ldcard */.      
d190: 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32  pC = (u8*)&pStr2
d1a0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74  ->u.zToken[sqlit
d1b0: 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32  e3Strlen30(pStr2
d1c0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a  ->u.zToken)-1];.
d1d0: 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20        c = *pC;. 
d1e0: 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20       if( noCase 
d1f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
d200: 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e  e point is to in
d210: 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74  crement the last
d220: 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72   character befor
d230: 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  e the first.    
d240: 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e      ** wildcard.
d250: 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72    But if we incr
d260: 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20  ement '@', that 
d270: 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74  will push it int
d280: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
d290: 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67   alphabetic rang
d2a0: 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e  e where case con
d2b0: 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65  versions will me
d2c0: 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20  ss up the .     
d2d0: 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79     ** inequality
d2e0: 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73  .  To avoid this
d2f0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61  , make sure to a
d300: 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c  lso run the full
d310: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45  .        ** LIKE
d320: 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74   on all candidat
d330: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  e expressions by
d340: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73   clearing the is
d350: 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20  Complete flag.  
d360: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d370: 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20   if( c=='A'-1 ) 
d380: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
d390: 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33 39    /* EV: R-64339
d3a0: 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20 20  -08207 */...    
d3b0: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
d3c0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
d3d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
d3e0: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
d3f0: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
d400: 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
d410: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
d420: 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
d430: 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
d440: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
d450: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
d460: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
d470: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
d480: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
d490: 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
d4a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
d4b0: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
d4c0: 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
d4d0: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
d4e0: 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
d4f0: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20  0);.    idxNew1 
d500: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
d510: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
d520: 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r1, TERM_VIRTUAL
d530: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
d540: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
d550: 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20  xNew1==0 );.    
d560: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
d570: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b  , pWC, idxNew1);
d580: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
d590: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
d5a0: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
d5b0: 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
d5c0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
d5d0: 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20  se, TK_LT,.     
d5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d5f0: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
d600: 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72  (pParse,pNewExpr
d610: 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29  2,&sCollSeqName)
d620: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74  ,.           pSt
d630: 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e  r2, 0);.    idxN
d640: 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
d650: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
d660: 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
d670: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
d680: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
d690: 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a  ( idxNew2==0 );.
d6a0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
d6b0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
d6c0: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
d6d0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
d6e0: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
d6f0: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
d700: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
d710: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
d720: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
d730: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
d740: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
d750: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
d760: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
d770: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d780: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
d790: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
d7a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
d7b0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
d7c0: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
d7d0: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
d7e0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
d7f0: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
d800: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
d810: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
d820: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
d830: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
d840: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
d850: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
d860: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
d870: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
d880: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
d890: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
d8a0: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
d8b0: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
d8c0: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
d8d0: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
d8e0: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
d8f0: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
d900: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
d910: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
d920: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
d930: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
d940: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
d950: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
d960: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
d970: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
d980: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
d990: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
d9a0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
d9b0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
d9c0: 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
d9d0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
d9e0: 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
d9f0: 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
da00: 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
da10: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
da20: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
da30: 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
da40: 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
da50: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
da60: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
da70: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
da80: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
da90: 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
dac0: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
dad0: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
dae0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
daf0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
db00: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
db10: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
db20: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
db30: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
db40: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
db50: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
db60: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
db70: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
db80: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
db90: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
dba0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
dbb0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
dbc0: 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
dbd0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
dbe0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
dbf0: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
dc00: 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
dc10: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
dc20: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
dc30: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
dc40: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
dc50: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
dc60: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
dc70: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
dc80: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
dc90: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
dca0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
dcb0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
dcc0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
dcd0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
dce0: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
dcf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
dd00: 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20  ABLE_STAT3.  /* 
dd10: 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74  When sqlite_stat
dd20: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
dd30: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e   is available an
dd40: 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65   operator of the
dd50: 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53  .  ** form "x IS
dd60: 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73   NOT NULL" can s
dd70: 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c  ometimes be eval
dd80: 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63  uated more effic
dd90: 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22  iently.  ** as "
dda0: 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20  x>NULL" if x is 
ddb0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
ddc0: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20  RIMARY KEY.  So 
ddd0: 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a  construct a.  **
dde0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66   virtual term of
ddf0: 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a   that form..  **
de00: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
de10: 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  the virtual term
de20: 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20   must be tagged 
de30: 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e  with TERM_VNULL.
de40: 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d    This.  ** TERM
de50: 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20  _VNULL tag will 
de60: 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74  suppress the not
de70: 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74  -null check at t
de80: 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
de90: 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  * of the loop.  
dea0: 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d  Without the TERM
deb0: 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65  _VNULL flag, the
dec0: 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
ded0: 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72  at.  ** the star
dee0: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69  t of the loop wi
def0: 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72  ll prevent any r
df00: 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e  esults from bein
df10: 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  g returned..  */
df20: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
df30: 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
df40: 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
df50: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
df60: 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
df70: 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  t->iColumn>=0.  
df80: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
df90: 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
dfa0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
dfb0: 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
dfc0: 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
dfd0: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
dfe0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
dff0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
e000: 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e030: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
e040: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
e070: 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
e080: 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
e090: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
e0a0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
e0b0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
e0e0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
e0f0: 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
e100: 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
e110: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
e120: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
e130: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
e140: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
e150: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
e160: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
e170: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
e180: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
e190: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
e1a0: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
e1b0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
e1c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
e1d0: 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  _GT;.      pNewT
e1e0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
e1f0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
e200: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
e210: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
e220: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
e230: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
e240: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
e250: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
e260: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
e270: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
e280: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
e290: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
e2a0: 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20  NABLE_STAT */.. 
e2b0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63   /* Prevent ON c
e2c0: 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61  lause terms of a
e2d0: 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20   LEFT JOIN from 
e2e0: 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72  being used to dr
e2f0: 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ive.  ** an inde
e300: 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  x for tables to 
e310: 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
e320: 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  join..  */.  pTe
e330: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
e340: 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d  |= extraRight;.}
e350: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
e360: 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74  ction searches t
e370: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
e380: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
e390: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
e3a0: 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78 70 72 65  .** for an expre
e3b0: 73 73 69 6f 6e 20 6f 66 20 74 79 70 65 20 54 4b  ssion of type TK
e3c0: 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65 66  _COLUMN that ref
e3d0: 65 72 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ers to the same 
e3e0: 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a 20 75 73  column and.** us
e3f0: 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
e400: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
e410: 73 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f  s the iCol'th co
e420: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
e430: 64 78 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  dx..** Argument 
e440: 69 42 61 73 65 20 69 73 20 74 68 65 20 63 75 72  iBase is the cur
e450: 73 6f 72 20 6e 75 6d 62 65 72 20 75 73 65 64 20  sor number used 
e460: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 68  for the table th
e470: 61 74 20 70 49 64 78 20 72 65 66 65 72 73 0a 2a  at pIdx refers.*
e480: 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  * to..**.** If s
e490: 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f  uch an expressio
e4a0: 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20  n is found, its 
e4b0: 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e  index in pList->
e4c0: 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  a[] is returned.
e4d0: 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73   If.** no expres
e4e0: 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d  sion is found, -
e4f0: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
e500: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
e510: 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72  dIndexCol(.  Par
e520: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e540: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
e550: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
e560: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
e570: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
e580: 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20   list to search 
e590: 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20  */.  int iBase, 
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66       /* Cursor f
e5c0: 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  or table associa
e5d0: 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f  ted with pIdx */
e5e0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d     /* Index to m
e610: 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a  atch column of *
e620: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66      /* Column of
e650: 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20   index to match 
e660: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
e670: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
e680: 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
e690: 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28  l[iCol];..  for(
e6a0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
e6b0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
e6c0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
e6d0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
e6e0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
e6f0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  r);.    if( p->o
e700: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
e710: 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d    && p->iColumn=
e720: 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
e730: 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d  iCol].     && p-
e740: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20  >iTable==iBase. 
e750: 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c     ){.      Coll
e760: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
e770: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
e780: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
e790: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
e7a0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f    if( ALWAYS(pCo
e7b0: 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  ll) && 0==sqlite
e7c0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
e7d0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  zName, zColl) ){
e7e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e7f0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
e800: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d  .  }..  return -
e810: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  1;.}../*.** This
e820: 20 72 6f 75 74 69 6e 65 20 64 65 74 65 72 6d 69   routine determi
e830: 6e 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20  nes if pIdx can 
e840: 62 65 20 75 73 65 64 20 74 6f 20 61 73 73 69 73  be used to assis
e850: 74 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  t in processing 
e860: 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 71 75  a.** DISTINCT qu
e870: 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f 74 68 65  alifier. In othe
e880: 72 20 77 6f 72 64 73 2c 20 69 74 20 74 65 73 74  r words, it test
e890: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
e8a0: 20 75 73 69 6e 67 20 74 68 69 73 0a 2a 2a 20 69   using this.** i
e8b0: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6f 75 74  ndex for the out
e8c0: 65 72 20 6c 6f 6f 70 20 67 75 61 72 61 6e 74 65  er loop guarante
e8d0: 65 73 20 74 68 61 74 20 72 6f 77 73 20 77 69 74  es that rows wit
e8e0: 68 20 65 71 75 61 6c 20 76 61 6c 75 65 73 20 66  h equal values f
e8f0: 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70 72 65 73  or.** all expres
e900: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 70 44 69  sions in the pDi
e910: 73 74 69 6e 63 74 20 6c 69 73 74 20 61 72 65 20  stinct list are 
e920: 64 65 6c 69 76 65 72 65 64 20 67 72 6f 75 70 65  delivered groupe
e930: 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a  d together..**.*
e940: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  * For example, t
e950: 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a 2a 2a 20  he query .**.** 
e960: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
e970: 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  T a, b, c FROM t
e980: 62 6c 20 57 48 45 52 45 20 61 20 3d 20 3f 0a 2a  bl WHERE a = ?.*
e990: 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65 66 69 74  *.** can benefit
e9a0: 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64 65 78 20   from any index 
e9b0: 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62 22 20 61  on columns "b" a
e9c0: 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74 61 74 69  nd "c"..*/.stati
e9d0: 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74  c int isDistinct
e9e0: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
e9f0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
ea00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
ea10: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ea20: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
ea30: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
ea40: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
ea50: 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ause */.  Index 
ea60: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
ea70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ea80: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e   index being con
ea90: 73 69 64 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  sidered */.  int
eaa0: 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20   base,          
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eac0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
ead0: 72 20 74 68 65 20 74 61 62 6c 65 20 70 49 64 78  r the table pIdx
eae0: 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45 78 70 72   is on */.  Expr
eaf0: 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c  List *pDistinct,
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
eb10: 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72  he DISTINCT expr
eb20: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  essions */.  int
eb30: 20 6e 45 71 43 6f 6c 20 20 20 20 20 20 20 20 20   nEqCol         
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb50: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
eb60: 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20  columns with == 
eb70: 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  */.){.  Bitmask 
eb80: 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  mask = 0;       
eb90: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
eba0: 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65 64 20 66  of unaccounted f
ebb0: 6f 72 20 70 44 69 73 74 69 6e 63 74 20 65 78 70  or pDistinct exp
ebc0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rs */.  int i;  
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
ebf0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
ec00: 0a 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74  .  assert( pDist
ec10: 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  inct!=0 );.  if(
ec20: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 3d 3d 30 20   pIdx->zName==0 
ec30: 7c 7c 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45  || pDistinct->nE
ec40: 78 70 72 3e 3d 42 4d 53 20 29 20 72 65 74 75 72  xpr>=BMS ) retur
ec50: 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28  n 0;.  testcase(
ec60: 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70   pDistinct->nExp
ec70: 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 0a 20 20 2f  r==BMS-1 );..  /
ec80: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
ec90: 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
eca0: 6e 73 20 69 6e 20 74 68 65 20 64 69 73 74 69 6e  ns in the distin
ecb0: 63 74 20 6c 69 73 74 2e 20 49 66 20 61 6e 79 20  ct list. If any 
ecc0: 6f 66 20 74 68 65 6d 0a 20 20 2a 2a 20 61 72 65  of them.  ** are
ecd0: 20 6e 6f 74 20 73 69 6d 70 6c 65 20 63 6f 6c 75   not simple colu
ece0: 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 2c 20 72  mn references, r
ecf0: 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 4f 74 68  eturn early. Oth
ed00: 65 72 77 69 73 65 2c 20 74 65 73 74 20 69 66 20  erwise, test if 
ed10: 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 20 63  the.  ** WHERE c
ed20: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
ed30: 20 22 63 6f 6c 3d 58 22 20 63 6c 61 75 73 65 2e   "col=X" clause.
ed40: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65   If it does, the
ed50: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
ed60: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
ed70: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
ed80: 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20   and the column 
ed90: 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20  does not belong 
eda0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  to the.  ** same
edb0: 20 74 61 62 6c 65 20 61 73 20 69 6e 64 65 78 20   table as index 
edc0: 70 49 64 78 2c 20 72 65 74 75 72 6e 20 65 61 72  pIdx, return ear
edd0: 6c 79 2e 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  ly. Finally, if 
ede0: 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 2a 2a  there is no.  **
edf0: 20 6d 61 74 63 68 69 6e 67 20 22 63 6f 6c 3d 58   matching "col=X
ee00: 22 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  " expression and
ee10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6f   the column is o
ee20: 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
ee30: 20 61 73 20 70 49 64 78 2c 0a 20 20 2a 2a 20 73   as pIdx,.  ** s
ee40: 65 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  et the correspon
ee50: 64 69 6e 67 20 62 69 74 20 69 6e 20 76 61 72 69  ding bit in vari
ee60: 61 62 6c 65 20 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  able mask..  */.
ee70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
ee80: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
ee90: 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  ++){.    WhereTe
eea0: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 45  rm *pTerm;.    E
eeb0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
eec0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
eed0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
eee0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
eef0: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
ef00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
ef10: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
ef20: 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61 62 6c 65  m(pWC, p->iTable
ef30: 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7e 28  , p->iColumn, ~(
ef40: 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
ef50: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
ef60: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  erm ){.      Exp
ef70: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
ef80: 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
ef90: 53 65 71 20 2a 70 31 20 3d 20 73 71 6c 69 74 65  Seq *p1 = sqlite
efa0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
efb0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
efc0: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
efd0: 67 68 74 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  ght);.      Coll
efe0: 53 65 71 20 2a 70 32 20 3d 20 73 71 6c 69 74 65  Seq *p2 = sqlite
eff0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
f000: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  rse, p);.      i
f010: 66 28 20 70 31 3d 3d 70 32 20 29 20 63 6f 6e 74  f( p1==p2 ) cont
f020: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
f030: 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 62  if( p->iTable!=b
f040: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
f050: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28 28 28 42      mask |= (((B
f060: 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 29 3b  itmask)1) << i);
f070: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 45  .  }..  for(i=nE
f080: 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26 20 69 3c  qCol; mask && i<
f090: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
f0a0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 78  ++){.    int iEx
f0b0: 70 72 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f  pr = findIndexCo
f0c0: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
f0d0: 6e 63 74 2c 20 62 61 73 65 2c 20 70 49 64 78 2c  nct, base, pIdx,
f0e0: 20 69 29 3b 0a 20 20 20 20 69 66 28 20 69 45 78   i);.    if( iEx
f0f0: 70 72 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  pr<0 ) break;.  
f100: 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28 28 42 69    mask &= ~(((Bi
f110: 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 45 78 70  tmask)1) << iExp
f120: 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
f130: 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d 0a 0a  n (mask==0);.}..
f140: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
f150: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
f160: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
f170: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
f180: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
f190: 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
f1a0: 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74   A DISTINCT list
f1b0: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66   is redundant if
f1c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
f1d0: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e 49 51  ntains a.** UNIQ
f1e0: 55 45 20 69 6e 64 65 78 20 74 68 61 74 20 67 75  UE index that gu
f1f0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
f200: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
f210: 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 64 69  query will be di
f220: 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77 61 79  stinct.** anyway
f230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f240: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
f250: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
f260: 61 72 73 65 2c 0a 20 20 53 72 63 4c 69 73 74 20  arse,.  SrcList 
f270: 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20 57 68 65  *pTabList,.  Whe
f280: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
f290: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
f2a0: 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c 65 20  inct.){.  Table 
f2b0: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
f2c0: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2e0: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
f2f0: 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
f300: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
f310: 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
f320: 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
f330: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
f340: 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
f350: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
f360: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
f370: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
f380: 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
f390: 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
f3a0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
f3b0: 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
f3c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
f3d0: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
f3e0: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
f3f0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
f400: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
f410: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
f420: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
f430: 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
f440: 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
f450: 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
f460: 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
f470: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
f480: 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
f490: 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
f4a0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
f4b0: 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
f4c0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
f4d0: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
f4e0: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
f4f0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f500: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
f510: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
f520: 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61  ate(pDistinct->a
f530: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
f540: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
f550: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
f560: 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69  e==iBase && p->i
f570: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
f580: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  n 1;.  }..  /* L
f590: 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
f5a0: 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
f5b0: 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65  able, checking e
f5c0: 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74  ach to see if it
f5d0: 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20   makes.  ** the 
f5e0: 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
f5f0: 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74  er redundant. It
f600: 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a   does so if:.  *
f610: 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20  *.  **   1. The 
f620: 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20  index is itself 
f630: 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a  UNIQUE, and.  **
f640: 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f  .  **   2. All o
f650: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
f660: 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65   the index are e
f670: 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68  ither part of th
f680: 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a  e pDistinct.  **
f690: 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65        list, or e
f6a0: 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  lse the WHERE cl
f6b0: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ause contains a 
f6c0: 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
f6d0: 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20   "col=X",.  **  
f6e0: 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61      where X is a
f6f0: 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e   constant value.
f700: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
f710: 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  equences of the.
f720: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72    **      compar
f730: 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d  ison and select-
f740: 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  list expressions
f750: 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73   must match thos
f760: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  e of the index..
f770: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41    **.  **   3. A
f780: 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65  ll of those inde
f790: 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  x columns for wh
f7a0: 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  ich the WHERE cl
f7b0: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ause does not.  
f7c0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
f7d0: 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61  a "col=X" term a
f7e0: 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  re subject to a 
f7f0: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
f800: 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
f810: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f820: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f830: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f840: 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
f850: 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e  r==OE_None ) con
f860: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
f870: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
f880: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
f890: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78   int iCol = pIdx
f8a0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
f8b0: 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64       if( 0==find
f8c0: 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c  Term(pWC, iBase,
f8d0: 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b   iCol, ~(Bitmask
f8e0: 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
f8f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
f900: 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e  iIdxCol = findIn
f910: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
f920: 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c  Distinct, iBase,
f930: 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20   pIdx, i);.     
f940: 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30     if( iIdxCol<0
f950: 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   || pTab->aCol[p
f960: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
f970: 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  ].notNull==0 ){.
f980: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f990: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f9a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
f9b0: 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
f9c0: 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  n ){.      /* Th
f9d0: 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73  is index implies
f9e0: 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
f9f0: 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  CT qualifier is 
fa00: 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20  redundant. */.  
fa10: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
fa20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
fa30: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
fa40: 65 70 61 72 65 20 61 20 63 72 75 64 65 20 65 73  epare a crude es
fa50: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f  timate of the lo
fa60: 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69  garithm of the i
fa70: 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  nput value..** T
fa80: 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20  he results need 
fa90: 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20 54  not be exact.  T
faa0: 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  his is only used
fab0: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
fac0: 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73  ** the total cos
fad0: 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20  t of performing 
fae0: 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20  operations with 
faf0: 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f  O(logN) or O(Nlo
fb00: 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74  gN).** complexit
fb10: 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69 73  y.  Because N is
fb20: 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20 69   just a guess, i
fb30: 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72  t is no great tr
fb40: 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e  agedy if.** logN
fb50: 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66   is a little off
fb60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  ..*/.static doub
fb70: 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65  le estLog(double
fb80: 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f   N){.  double lo
fb90: 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65  gN = 1;.  double
fba0: 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65   x = 10;.  while
fbb0: 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67  ( N>x ){.    log
fbc0: 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d  N += 1;.    x *=
fbd0: 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   10;.  }.  retur
fbe0: 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n logN;.}../*.**
fbf0: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
fc00: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
fc10: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
fc20: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
fc30: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
fc40: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
fc50: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
fc60: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
fc70: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
fc80: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
fc90: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
fca0: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
fcb0: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
fcc0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
fcd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
fce0: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
fcf0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
fd00: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  ).static void TR
fd10: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73  ACE_IDX_INPUTS(s
fd20: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
fd30: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
fd40: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
fd50: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
fd60: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
fd70: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
fd80: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
fd90: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
fda0: 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20  constraint[%d]: 
fdb0: 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64  col=%d termid=%d
fdc0: 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25   op=%d usabled=%
fdd0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
fde0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
fdf0: 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  raint[i].iColumn
fe00: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
fe10: 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d  straint[i].iTerm
fe20: 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70  Offset,.       p
fe30: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
fe40: 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  .op,.       p->a
fe50: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
fe60: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  able);.  }.  for
fe70: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65  (i=0; i<p->nOrde
fe80: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  rBy; i++){.    s
fe90: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
fea0: 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d  f("  orderby[%d]
feb0: 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64  : col=%d desc=%d
fec0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
fed0: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
fee0: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  y[i].iColumn,.  
fef0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
ff00: 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d  [i].desc);.  }.}
ff10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
ff20: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73  CE_IDX_OUTPUTS(s
ff30: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
ff40: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
ff50: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
ff60: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
ff70: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
ff80: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
ff90: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
ffa0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
ffb0: 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49  usage[%d]: argvI
ffc0: 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22  dx=%d omit=%d\n"
ffd0: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
ffe0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
fff0: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
10000 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  dex,.       p->a
10010 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10020 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  i].omit);.  }.  
10030 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
10040 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c  tf("  idxNum=%d\
10050 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a  n", p->idxNum);.
10060 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
10070 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25  intf("  idxStr=%
10080 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29  s\n", p->idxStr)
10090 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
100a0 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42  Printf("  orderB
100b0 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c  yConsumed=%d\n",
100c0 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75   p->orderByConsu
100d0 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  med);.  sqlite3D
100e0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
100f0 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e  timatedCost=%g\n
10100 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43  ", p->estimatedC
10110 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ost);.}.#else.#d
10120 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
10130 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
10140 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
10150 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 2f  UTS(A).#endif../
10160 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65 64 20 62  * .** Required b
10170 65 63 61 75 73 65 20 62 65 73 74 49 6e 64 65 78  ecause bestIndex
10180 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  () is called by 
10190 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
101a0 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  x() .*/.static v
101b0 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 57 68  oid bestIndex(Wh
101c0 65 72 65 42 65 73 74 49 64 78 2a 29 3b 0a 0a 2f  ereBestIdx*);../
101d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
101e0 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  e attempts to fi
101f0 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20 73  nd an scanning s
10200 74 72 61 74 65 67 79 20 74 68 61 74 20 63 61 6e  trategy that can
10210 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   be used .** to 
10220 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52 27  optimize an 'OR'
10230 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
10240 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 57 48   is part of a WH
10250 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a  ERE clause. .**.
10260 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 73 73  ** The table ass
10270 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 52 4f  ociated with FRO
10280 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 53  M clause term pS
10290 72 63 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  rc may be either
102a0 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42 2d   a.** regular B-
102b0 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20 61 20  Tree table or a 
102c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
102d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
102e0 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
102f0 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29  WhereBestIdx *p)
10300 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
10310 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
10320 41 54 49 4f 4e 0a 20 20 57 68 65 72 65 43 6c 61  ATION.  WhereCla
10330 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57  use *pWC = p->pW
10340 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
10350 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
10360 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
10370 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20  List_item *pSrc 
10380 3d 20 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68  = p->pSrc; /* Th
10390 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
103a0 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
103b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 75 72    const int iCur
103c0 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
103d0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ;      /* The cu
103e0 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
103f0 65 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69  e  */.  const Bi
10400 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20  tmask maskSrc = 
10410 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
10420 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20 2f  skSet, iCur);  /
10430 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 70 53  * Bitmask for pS
10440 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  rc */.  WhereTer
10450 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e 64  m * const pWCEnd
10460 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
10470 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f  nTerm];        /
10480 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
10490 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
104a0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
104b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
104c0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
104d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
104e0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 52   */..  /* The OR
104f0 2d 63 6c 61 75 73 65 20 6f 70 74 69 6d 69 7a 61  -clause optimiza
10500 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
10510 65 64 20 69 66 20 74 68 65 20 49 4e 44 45 58 45  ed if the INDEXE
10520 44 20 42 59 20 6f 72 0a 20 20 2a 2a 20 4e 4f 54  D BY or.  ** NOT
10530 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 73   INDEXED clauses
10540 20 61 72 65 20 75 73 65 64 20 6f 72 20 69 66 20   are used or if 
10550 74 68 65 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  the WHERE_AND_ON
10560 4c 59 20 62 69 74 20 69 73 20 73 65 74 2e 20 2a  LY bit is set. *
10570 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f  /.  if( pSrc->no
10580 74 49 6e 64 65 78 65 64 20 7c 7c 20 70 53 72 63  tIndexed || pSrc
10590 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  ->pIndex!=0 ){. 
105a0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
105b0 20 69 66 28 20 70 57 43 2d 3e 77 63 74 72 6c 46   if( pWC->wctrlF
105c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44  lags & WHERE_AND
105d0 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 72 65 74  _ONLY ){.    ret
105e0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  urn;.  }..  /* S
105f0 65 61 72 63 68 20 74 68 65 20 57 48 45 52 45 20  earch the WHERE 
10600 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72  clause terms for
10610 20 61 20 75 73 61 62 6c 65 20 57 4f 5f 4f 52 20   a usable WO_OR 
10620 74 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  term. */.  for(p
10630 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
10640 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
10650 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
10660 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
10670 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
10680 26 26 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72  && ((pTerm->prer
10690 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63  eqAll & ~maskSrc
106a0 29 20 26 20 70 2d 3e 6e 6f 74 52 65 61 64 79 29  ) & p->notReady)
106b0 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  ==0.     && (pTe
106c0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
106d0 6e 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53  ndexable & maskS
106e0 72 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  rc)!=0 .    ){. 
106f0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
10700 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
10710 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
10720 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
10730 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
10740 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
10750 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
10760 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
10770 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
10780 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
10790 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
107a0 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f        double rTo
107b0 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  tal = 0;.      d
107c0 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a  ouble nRow = 0;.
107d0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73        Bitmask us
107e0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 57 68  ed = 0;.      Wh
107f0 65 72 65 42 65 73 74 49 64 78 20 73 42 4f 49 3b  ereBestIdx sBOI;
10800 0a 0a 20 20 20 20 20 20 73 42 4f 49 20 3d 20 2a  ..      sBOI = *
10810 70 3b 0a 20 20 20 20 20 20 73 42 4f 49 2e 70 4f  p;.      sBOI.pO
10820 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
10830 20 20 73 42 4f 49 2e 70 44 69 73 74 69 6e 63 74    sBOI.pDistinct
10840 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 42 4f 49   = 0;.      sBOI
10850 2e 70 70 49 64 78 49 6e 66 6f 20 3d 20 30 3b 0a  .ppIdxInfo = 0;.
10860 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72        for(pOrTer
10870 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54  m=pOrWC->a; pOrT
10880 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
10890 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
108a0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
108b0 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f  .. Multi-index O
108c0 52 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 65  R testing for te
108d0 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c  rm %d of %d....\
108e0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  n", .          (
108f0 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72 57 43 2d  pOrTerm - pOrWC-
10900 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d 20 70 57  >a), (pTerm - pW
10910 43 2d 3e 61 29 0a 20 20 20 20 20 20 20 20 29 29  C->a).        ))
10920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
10930 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
10940 72 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b  r& WO_AND)!=0 ){
10950 0a 20 20 20 20 20 20 20 20 20 20 73 42 4f 49 2e  .          sBOI.
10960 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
10970 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
10980 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49 6e            bestIn
10990 64 65 78 28 26 73 42 4f 49 29 3b 0a 20 20 20 20  dex(&sBOI);.    
109a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
109b0 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
109c0 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
109d0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
109e0 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20   tempWC;.       
109f0 20 20 20 74 65 6d 70 57 43 2e 70 50 61 72 73 65     tempWC.pParse
10a00 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a   = pWC->pParse;.
10a10 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
10a20 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d  .pMaskSet = pWC-
10a30 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20 20  >pMaskSet;.     
10a40 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74       tempWC.pOut
10a50 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20  er = pWC;.      
10a60 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20      tempWC.op = 
10a70 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  TK_AND;.        
10a80 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
10a90 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
10aa0 74 65 6d 70 57 43 2e 77 63 74 72 6c 46 6c 61 67  tempWC.wctrlFlag
10ab0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
10ac0 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20   tempWC.nTerm = 
10ad0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 42 4f  1;.          sBO
10ae0 49 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b  I.pWC = &tempWC;
10af0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49  .          bestI
10b00 6e 64 65 78 28 26 73 42 4f 49 29 3b 0a 20 20 20  ndex(&sBOI);.   
10b10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10b20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
10b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10b40 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 42 4f 49    rTotal += sBOI
10b50 2e 63 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20 20  .cost.rCost;.   
10b60 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73 42 4f       nRow += sBO
10b70 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77  I.cost.plan.nRow
10b80 3b 0a 20 20 20 20 20 20 20 20 75 73 65 64 20 7c  ;.        used |
10b90 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 75 73 65 64  = sBOI.cost.used
10ba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 54  ;.        if( rT
10bb0 6f 74 61 6c 3e 3d 70 2d 3e 63 6f 73 74 2e 72 43  otal>=p->cost.rC
10bc0 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ost ) break;.   
10bd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
10be0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
10bf0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
10c00 6e 63 72 65 61 73 65 20 74 68 65 20 73 63 61 6e  ncrease the scan
10c10 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75 6e 74   cost to account
10c20 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74   .      ** for t
10c30 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73  he cost of the s
10c40 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ort. */.      if
10c50 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ( p->pOrderBy!=0
10c60 20 29 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52   ){.        WHER
10c70 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72  ETRACE(("... sor
10c80 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 4f  ting increases O
10c90 52 20 63 6f 73 74 20 25 2e 39 67 20 74 6f 20 25  R cost %.9g to %
10ca0 2e 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  .9g\n",.        
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 72 54 6f 74              rTot
10cc0 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f 77 2a  al, rTotal+nRow*
10cd0 65 73 74 4c 6f 67 28 6e 52 6f 77 29 29 29 3b 0a  estLog(nRow)));.
10ce0 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b          rTotal +
10cf0 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52  = nRow*estLog(nR
10d00 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ow);.      }..  
10d10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
10d20 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75  st of scanning u
10d30 73 69 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72  sing this OR ter
10d40 6d 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69  m for optimizati
10d50 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  on is.      ** l
10d60 65 73 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ess than the cur
10d70 72 65 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64  rent cost stored
10d80 20 69 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61   in pCost, repla
10d90 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ce the contents.
10da0 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73        ** of pCos
10db0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52  t. */.      WHER
10dc0 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c  ETRACE(("... mul
10dd0 74 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74  ti-index OR cost
10de0 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c  =%.9g nrow=%.9g\
10df0 6e 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77  n", rTotal, nRow
10e00 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54  ));.      if( rT
10e10 6f 74 61 6c 3c 70 2d 3e 63 6f 73 74 2e 72 43 6f  otal<p->cost.rCo
10e20 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  st ){.        p-
10e30 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 72 54  >cost.rCost = rT
10e40 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  otal;.        p-
10e50 3e 63 6f 73 74 2e 75 73 65 64 20 3d 20 75 73 65  >cost.used = use
10e60 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  d;.        p->co
10e70 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e  st.plan.nRow = n
10e80 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Row;.        p->
10e90 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  cost.plan.nOBSat
10ea0 20 3d 20 70 2d 3e 69 20 3f 20 70 2d 3e 61 4c 65   = p->i ? p->aLe
10eb0 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e  vel[p->i-1].plan
10ec0 2e 6e 4f 42 53 61 74 20 3a 20 30 3b 0a 20 20 20  .nOBSat : 0;.   
10ed0 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61       p->cost.pla
10ee0 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c 61 67  n.wsFlags = flag
10ef0 73 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  s;.        p->co
10f00 73 74 2e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 20  st.plan.u.pTerm 
10f10 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
10f20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
10f30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
10f40 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
10f50 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   */.}..#ifndef S
10f60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
10f70 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
10f80 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10f90 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10fa0 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
10fb0 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
10fc0 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
10fd0 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
10fe0 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
10ff0 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
11000 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
11010 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
11020 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
11030 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
11040 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11060 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11070 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
11080 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
11090 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
110a0 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
110b0 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
110c0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
110d0 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
110e0 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
110f0 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
11100 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
11110 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
11120 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
11130 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
11140 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
11150 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
11160 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d  rator & WO_EQ)==
11170 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11180 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
11190 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
111a0 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  dy)!=0 ) return 
111b0 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
111c0 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
111d0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
111e0 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
111f0 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
11200 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
11210 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
11220 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
11230 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   1;.}.#endif..#i
11240 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11250 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
11260 58 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71  X./*.** If the q
11270 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 70 53  uery plan for pS
11280 72 63 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  rc specified in 
11290 70 43 6f 73 74 20 69 73 20 61 20 66 75 6c 6c 20  pCost is a full 
112a0 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 61 6e  table scan.** an
112b0 64 20 69 6e 64 65 78 69 6e 67 20 69 73 20 61 6c  d indexing is al
112c0 6c 6f 77 73 20 28 69 66 20 74 68 65 72 65 20 69  lows (if there i
112d0 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44  s no NOT INDEXED
112e0 20 63 6c 61 75 73 65 29 20 61 6e 64 20 69 74 0a   clause) and it.
112f0 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ** possible to c
11300 6f 6e 73 74 72 75 63 74 20 61 20 74 72 61 6e 73  onstruct a trans
11310 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61 74 20  ient index that 
11320 77 6f 75 6c 64 20 70 65 72 66 6f 72 6d 20 62 65  would perform be
11330 74 74 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20 66  tter.** than a f
11340 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 65  ull table scan e
11350 76 65 6e 20 77 68 65 6e 20 74 68 65 20 63 6f 73  ven when the cos
11360 74 20 6f 66 20 63 6f 6e 73 74 72 75 63 74 69 6e  t of constructin
11370 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69  g the index.** i
11380 73 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63  s taken into acc
11390 6f 75 6e 74 2c 20 74 68 65 6e 20 61 6c 74 65 72  ount, then alter
113a0 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
113b0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 74 72  to use the.** tr
113c0 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 2e 0a 2a  ansient index..*
113d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
113e0 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  stAutomaticIndex
113f0 28 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70  (WhereBestIdx *p
11400 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
11410 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20  se = p->pParse; 
11420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11430 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
11440 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
11450 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43  se *pWC = p->pWC
11460 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
11470 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
11480 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
11490 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20  List_item *pSrc 
114a0 3d 20 70 2d 3e 70 53 72 63 3b 20 20 2f 2a 20 54  = p->pSrc;  /* T
114b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
114c0 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
114d0 0a 20 20 64 6f 75 62 6c 65 20 6e 54 61 62 6c 65  .  double nTable
114e0 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
114f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
11500 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61   in the input ta
11510 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ble */.  double 
11520 6c 6f 67 4e 3b 20 20 20 20 20 20 20 20 20 20 20  logN;           
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11540 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29  * log(nTableRow)
11550 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73   */.  double cos
11560 74 54 65 6d 70 49 64 78 3b 20 20 20 20 20 20 20  tTempIdx;       
11570 20 20 2f 2a 20 70 65 72 2d 71 75 65 72 79 20 63    /* per-query c
11580 6f 73 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ost of the trans
11590 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
115a0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
115b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
115c0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
115d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
115e0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
115f0 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20  *pWCEnd;        
11600 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
11610 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20  >a[] */.  Table 
11620 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
11630 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
11640 68 74 20 6d 69 67 68 74 20 62 65 20 69 6e 64 65  ht might be inde
11650 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  xed */..  if( pP
11660 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
11670 3c 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20  <=(double)1 ){. 
11680 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
11690 6f 20 70 6f 69 6e 74 20 69 6e 20 62 75 69 6c 64  o point in build
116a0 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
116b0 20 69 6e 64 65 78 20 66 6f 72 20 61 20 73 69 6e   index for a sin
116c0 67 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  gle scan */.    
116d0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
116e0 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  ( (pParse->db->f
116f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
11700 74 6f 49 6e 64 65 78 29 3d 3d 30 20 29 7b 0a 20  toIndex)==0 ){. 
11710 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20     /* Automatic 
11720 69 6e 64 69 63 65 73 20 61 72 65 20 64 69 73 61  indices are disa
11730 62 6c 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  bled at run-time
11740 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
11750 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 63 6f    }.  if( (p->co
11760 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
11770 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
11780 53 43 41 4e 29 21 3d 30 0a 20 20 20 26 26 20 28  SCAN)!=0.   && (
11790 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46  p->cost.plan.wsF
117a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 56  lags & WHERE_COV
117b0 45 52 5f 53 43 41 4e 29 3d 3d 30 0a 20 20 29 7b  ER_SCAN)==0.  ){
117c0 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c 72 65 61  .    /* We alrea
117d0 64 79 20 68 61 76 65 20 73 6f 6d 65 20 6b 69 6e  dy have some kin
117e0 64 20 6f 66 20 69 6e 64 65 78 20 69 6e 20 75 73  d of index in us
117f0 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
11800 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
11810 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
11820 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  >viaCoroutine ){
11830 0a 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 69  .    /* Cannot i
11840 6e 64 65 78 20 61 20 63 6f 2d 72 6f 75 74 69 6e  ndex a co-routin
11850 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  e */.    return;
11860 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
11870 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a 20  >notIndexed ){. 
11880 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20 49 4e     /* The NOT IN
11890 44 45 58 45 44 20 63 6c 61 75 73 65 20 61 70 70  DEXED clause app
118a0 65 61 72 73 20 69 6e 20 74 68 65 20 53 51 4c 2e  ears in the SQL.
118b0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
118c0 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
118d0 69 73 43 6f 72 72 65 6c 61 74 65 64 20 29 7b 0a  isCorrelated ){.
118e0 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63      /* The sourc
118f0 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
11900 64 20 73 75 62 2d 71 75 65 72 79 2e 20 4e 6f 20  d sub-query. No 
11910 70 6f 69 6e 74 20 69 6e 20 69 6e 64 65 78 69 6e  point in indexin
11920 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74  g it. */.    ret
11930 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  urn;.  }..  asse
11940 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  rt( pParse->nQue
11950 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62 6c  ryLoop >= (doubl
11960 65 29 31 20 29 3b 0a 20 20 70 54 61 62 6c 65 20  e)1 );.  pTable 
11970 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
11980 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70 54 61 62  nTableRow = pTab
11990 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 6c  le->nRowEst;.  l
119a0 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54 61  ogN = estLog(nTa
119b0 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74 54  bleRow);.  costT
119c0 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a  empIdx = 2*logN*
119d0 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61 72 73  (nTableRow/pPars
119e0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 20  e->nQueryLoop + 
119f0 31 29 3b 0a 20 20 69 66 28 20 63 6f 73 74 54 65  1);.  if( costTe
11a00 6d 70 49 64 78 3e 3d 70 2d 3e 63 6f 73 74 2e 72  mpIdx>=p->cost.r
11a10 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Cost ){.    /* T
11a20 68 65 20 63 6f 73 74 20 6f 66 20 63 72 65 61 74  he cost of creat
11a30 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
11a40 74 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 62 65  t table would be
11a50 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20   greater than.  
11a60 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20 66    ** doing the f
11a70 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a  ull table scan *
11a80 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
11a90 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  }..  /* Search f
11aa0 6f 72 20 61 6e 79 20 65 71 75 61 6c 69 74 79 20  or any equality 
11ab0 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d 20  comparison term 
11ac0 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  */.  pWCEnd = &p
11ad0 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
11ae0 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ];.  for(pTerm=p
11af0 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
11b00 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
11b10 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
11b20 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
11b30 70 53 72 63 2c 20 70 2d 3e 6e 6f 74 52 65 61 64  pSrc, p->notRead
11b40 79 29 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52  y) ){.      WHER
11b50 45 54 52 41 43 45 28 28 22 61 75 74 6f 2d 69 6e  ETRACE(("auto-in
11b60 64 65 78 20 72 65 64 75 63 65 73 20 63 6f 73 74  dex reduces cost
11b70 20 66 72 6f 6d 20 25 2e 31 66 20 74 6f 20 25 2e   from %.1f to %.
11b80 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  1f\n",.         
11b90 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63 6f             p->co
11ba0 73 74 2e 72 43 6f 73 74 2c 20 63 6f 73 74 54 65  st.rCost, costTe
11bb0 6d 70 49 64 78 29 29 3b 0a 20 20 20 20 20 20 70  mpIdx));.      p
11bc0 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 63  ->cost.rCost = c
11bd0 6f 73 74 54 65 6d 70 49 64 78 3b 0a 20 20 20 20  ostTempIdx;.    
11be0 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e    p->cost.plan.n
11bf0 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20 31 3b 0a  Row = logN + 1;.
11c00 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c        p->cost.pl
11c10 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  an.wsFlags = WHE
11c20 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  RE_TEMP_INDEX;. 
11c30 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 75 73 65       p->cost.use
11c40 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  d = pTerm->prere
11c50 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62 72  qRight;.      br
11c60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
11c70 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
11c80 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  bestAutomaticInd
11c90 65 78 28 41 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ex(A)  /* no-op 
11ca0 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  */.#endif /* SQL
11cb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
11cc0 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69  IC_INDEX */...#i
11cd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11ce0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
11cf0 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  X./*.** Generate
11d00 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75   code to constru
11d10 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
11d20 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d  ect for an autom
11d30 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  atic index.** an
11d40 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20  d to set up the 
11d50 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63  WhereLevel objec
11d60 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74  t pLevel so that
11d70 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
11d80 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65  tor.** makes use
11d90 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69   of the automati
11da0 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  c index..*/.stat
11db0 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63  ic void construc
11dc0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
11dd0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11df0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
11e00 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
11e10 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
11e20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
11e30 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
11e40 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
11e50 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
11e60 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
11e70 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e  erm to get the n
11e80 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  ext index */.  B
11e90 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
11ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
11eb0 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
11ec0 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
11ed0 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  able */.  WhereL
11ee0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20  evel *pLevel    
11ef0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
11f00 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f  ew index here */
11f10 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d  .){.  int nColum
11f20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
11f30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
11f40 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
11f50 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20  nstructed index 
11f60 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
11f70 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
11f80 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
11f90 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
11fa0 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
11fb0 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
11fc0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
11fd0 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69   pWC->a[] */.  i
11fe0 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
11ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
12000 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65  te of memory nee
12010 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a  ded for pIdx */.
12020 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12040 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   Object describi
12050 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  ng the transient
12060 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
12070 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
12080 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
12090 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
120a0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
120b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e   */.  int addrIn
120c0 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
120d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
120e0 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
120f0 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a  on bypass jump *
12100 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  /.  Table *pTabl
12110 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12120 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
12130 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  ng indexed */.  
12140 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66  KeyInfo *pKeyinf
12150 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  o;          /* K
12160 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ey information f
12170 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20  or the index */ 
12180 20 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70    .  int addrTop
12190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
121a0 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
121b0 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
121c0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
121d0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
121e0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
121f0 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
12200 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12220 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
12230 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
12240 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
12250 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
12260 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
12270 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
12280 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
12290 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
122a0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
122b0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122d0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
122e0 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
122f0 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  n */.  Bitmask i
12300 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  dxCols;         
12310 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
12320 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72  columns used for
12330 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
12340 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73  itmask extraCols
12350 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69  ;          /* Bi
12360 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e  tmap of addition
12370 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  al columns */.. 
12380 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
12390 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
123a0 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
123b0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
123c0 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
123d0 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
123e0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
123f0 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
12400 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
12410 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
12420 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
12430 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
12440 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
12450 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43  pParse);..  /* C
12460 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
12470 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
12480 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
12490 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
124a0 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
124b0 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
124c0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
124d0 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70  nColumn = 0;.  p
124e0 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
124f0 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
12500 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
12510 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20  m];.  idxCols = 
12520 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
12530 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
12540 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
12550 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
12560 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
12570 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
12580 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
12590 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
125a0 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
125b0 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
125c0 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74  Col>=BMS ? ((Bit
125d0 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
125e0 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   : ((Bitmask)1)<
125f0 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73  <iCol;.      tes
12600 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
12610 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12620 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
12630 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  );.      if( (id
12640 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
12650 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f  0 ){.        nCo
12660 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
12670 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
12680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12690 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43    }.  assert( nC
126a0 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65  olumn>0 );.  pLe
126b0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20  vel->plan.nEq = 
126c0 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43  nColumn;..  /* C
126d0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
126e0 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
126f0 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
12700 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
12710 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
12720 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
12730 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
12740 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
12750 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
12760 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
12770 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
12780 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
12790 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
127a0 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
127b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
127c0 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
127d0 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
127e0 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
127f0 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
12800 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
12810 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
12820 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
12830 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
12840 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
12850 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
12860 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
12870 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
12880 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
12890 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
128a0 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
128b0 64 78 43 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d  dxCols | (((Bitm
128c0 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29  ask)1)<<(BMS-1))
128d0 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
128e0 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d  (pTable->nCol >=
128f0 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20   BMS-1) ? BMS-1 
12900 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a  : pTable->nCol;.
12910 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
12920 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
12930 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
12940 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
12950 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
12960 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
12970 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
12980 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73  Cols & (((Bitmas
12990 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75  k)1)<<i) ) nColu
129a0 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
129b0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
129c0 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
129d0 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e  BMS-1)) ){.    n
129e0 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65  Column += pTable
129f0 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
12a00 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e  ;.  }.  pLevel->
12a10 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
12a20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
12a30 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  | WHERE_IDX_ONLY
12a40 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20   | WO_EQ;..  /* 
12a50 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
12a60 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
12a70 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
12a80 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73  x */.  nByte = s
12a90 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20  izeof(Index);.  
12aa0 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
12ab0 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20  *sizeof(int);   
12ac0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
12ad0 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  umn */.  nByte +
12ae0 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
12af0 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e  (char*);   /* In
12b00 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20  dex.azColl */.  
12b10 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
12b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12b30 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
12b40 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20  Order */.  pIdx 
12b50 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
12b60 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
12b70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
12b80 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
12b90 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  ;.  pLevel->plan
12ba0 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  .u.pIdx = pIdx;.
12bb0 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d    pIdx->azColl =
12bc0 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78 5b 31   (char**)&pIdx[1
12bd0 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ];.  pIdx->aiCol
12be0 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 64  umn = (int*)&pId
12bf0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d  x->azColl[nColum
12c00 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72  n];.  pIdx->aSor
12c10 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
12c20 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  Idx->aiColumn[nC
12c30 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e  olumn];.  pIdx->
12c40 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e  zName = "auto-in
12c50 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43  dex";.  pIdx->nC
12c60 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  olumn = nColumn;
12c70 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
12c80 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
12c90 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
12ca0 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
12cb0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
12cc0 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
12cd0 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
12ce0 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
12cf0 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
12d00 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
12d10 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
12d20 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
12d30 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
12d40 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d  ol>=BMS ? ((Bitm
12d50 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20  ask)1)<<(BMS-1) 
12d60 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  : ((Bitmask)1)<<
12d70 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  iCol;.      if( 
12d80 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
12d90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12da0 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
12db0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
12dc0 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
12dd0 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
12de0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
12df0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
12e00 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
12e10 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
12e20 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
12e30 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
12e40 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
12e50 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
12e60 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53  Coll[n] = ALWAYS
12e70 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d  (pColl) ? pColl-
12e80 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59  >zName : "BINARY
12e90 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  ";.        n++;.
12ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12eb0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32  }.  assert( (u32
12ec0 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  )n==pLevel->plan
12ed0 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
12ee0 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
12ef0 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
12f00 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
12f10 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
12f20 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
12f30 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
12f40 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
12f50 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
12f60 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73  Cols & (((Bitmas
12f70 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20 20 20 20  k)1)<<i) ){.    
12f80 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
12f90 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
12fa0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
12fb0 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
12fc0 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
12fd0 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
12fe0 73 65 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b  sed & (((Bitmask
12ff0 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b  )1)<<(BMS-1)) ){
13000 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31  .    for(i=BMS-1
13010 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
13020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  ; i++){.      pI
13030 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
13040 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
13050 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
13060 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
13070 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
13080 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e  sert( n==nColumn
13090 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   );..  /* Create
130a0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
130b0 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e  ndex */.  pKeyin
130c0 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  fo = sqlite3Inde
130d0 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
130e0 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65 72 74   pIdx);.  assert
130f0 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
13100 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  r>=0 );.  sqlite
13110 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13120 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c  P_OpenAutoindex,
13130 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
13140 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a  , nColumn+1, 0,.
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69      (char*)pKeyi
13170 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
13180 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65  HANDOFF);.  Vdbe
13190 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72  Comment((v, "for
131a0 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e   %s", pTable->zN
131b0 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ame));..  /* Fil
131c0 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  l the automatic 
131d0 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65  index with conte
131e0 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  nt */.  addrTop 
131f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13200 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
13210 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
13220 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  r);.  regRecord 
13230 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
13240 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
13250 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
13260 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
13270 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  Idx, pLevel->iTa
13280 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  bCur, regRecord,
13290 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   1);.  sqlite3Vd
132a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
132b0 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
132c0 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
132d0 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
132e0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
132f0 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
13300 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
13310 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13320 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  _Next, pLevel->i
13330 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b  TabCur, addrTop+
13340 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
13350 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
13360 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
13370 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c  UTOINDEX);.  sql
13380 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
13390 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
133a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
133b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
133c0 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f  gRecord);.  .  /
133d0 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
133e0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
133f0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
13400 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13410 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69  pHere(v, addrIni
13420 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  t);.}.#endif /* 
13430 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13440 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
13450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13460 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13470 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
13480 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
13490 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
134a0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
134b0 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
134c0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
134d0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
134e0 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
134f0 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
13500 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
13510 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
13520 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
13530 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
13540 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
13550 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13560 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
13570 6e 66 6f 28 57 68 65 72 65 42 65 73 74 49 64 78  nfo(WhereBestIdx
13580 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
13590 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
135a0 65 3b 20 0a 20 20 57 68 65 72 65 43 6c 61 75 73  e; .  WhereClaus
135b0 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b  e *pWC = p->pWC;
135c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
135d0 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70  t_item *pSrc = p
135e0 2d 3e 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69  ->pSrc;.  ExprLi
135f0 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
13600 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
13610 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
13620 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
13630 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13640 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
13650 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
13660 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
13670 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
13680 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
13690 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
136a0 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
136b0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
136c0 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
136d0 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
136e0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
136f0 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43  fo;..  WHERETRAC
13700 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20  E(("Recomputing 
13710 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25  index info for %
13720 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  s...\n", pSrc->p
13730 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  Tab->zName));.. 
13740 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
13750 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
13760 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
13770 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
13780 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ing.  ** to this
13790 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
137a0 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d  /.  for(i=nTerm=
137b0 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
137c0 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
137d0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
137e0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
137f0 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
13800 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
13810 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
13820 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
13830 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
13840 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
13850 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
13860 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
13870 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
13880 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
13890 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
138a0 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ULL );.    if( p
138b0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
138c0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  & (WO_ISNULL) ) 
138d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
138e0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
138f0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
13900 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
13910 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
13920 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
13930 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
13940 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
13950 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
13960 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
13970 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
13980 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
13990 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
139a0 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
139b0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
139c0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
139d0 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
139e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
139f0 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
13a00 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
13a10 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
13a20 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
13a30 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
13a40 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
13a50 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
13a60 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
13a70 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
13a80 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
13a90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
13aa0 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
13ab0 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
13ac0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
13ad0 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
13ae0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
13af0 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
13b00 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
13b10 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
13b20 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
13b30 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b50 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
13b60 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
13b70 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
13b80 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
13ba0 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
13bb0 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
13bc0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
13bd0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13be0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13bf0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
13c00 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62  ");.    /* (doub
13c10 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
13c20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
13c30 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
13c40 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13c50 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
13c60 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
13c70 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
13c80 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
13c90 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
13ca0 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
13cb0 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
13cc0 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
13cd0 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
13ce0 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
13cf0 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
13d00 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
13d10 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
13d20 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
13d30 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
13d40 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
13d50 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
13d60 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13d70 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
13d80 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
13d90 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
13da0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
13db0 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
13dc0 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
13dd0 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
13de0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
13df0 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
13e00 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
13e10 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
13e20 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
13e30 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
13e40 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
13e50 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
13e60 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
13e70 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13e80 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
13e90 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
13ea0 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
13eb0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
13ec0 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
13ed0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
13ee0 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
13ef0 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
13f00 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13f10 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
13f20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
13f30 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f80 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
13f90 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
13fa0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
13fb0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
13fc0 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
13fd0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
13fe0 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
13ff0 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
14000 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
14010 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
14020 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
14030 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
14040 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
14050 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
14060 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
14070 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
14080 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
14090 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
140a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
140b0 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  (WO_ISNULL) ) co
140c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
140d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
140e0 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
140f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
14100 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
14110 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
14120 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
14130 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
14140 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
14150 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
14160 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
14170 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
14180 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
14190 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
141a0 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
141b0 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
141c0 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
141d0 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
141e0 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
141f0 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
14200 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
14210 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
14220 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
14230 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
14240 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
14250 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
14260 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
14270 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
14280 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
14290 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
142a0 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
142b0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
142c0 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
142d0 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
142e0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
142f0 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
14300 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
14310 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
14320 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
14330 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
14340 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14350 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
14360 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
14370 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
14380 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
14390 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
143a0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
143b0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
143c0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
143d0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
143e0 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
143f0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
14400 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
14410 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
14420 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
14430 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
14440 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
14450 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
14460 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
14470 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
14480 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
14490 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
144a0 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
144b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
144c0 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
144d0 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
144e0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
144f0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
14500 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
14510 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
14520 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
14530 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
14540 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
14550 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
14560 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
14570 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
14580 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65 72 20  ex_info pointer 
14590 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
145a0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
145b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
145c0 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
145d0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
145e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
145f0 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
14600 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
14610 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
14620 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
14630 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
14640 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
14650 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14660 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
14670 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
14680 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
14690 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
146a0 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
146b0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
146c0 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
146d0 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
146e0 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
146f0 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
14700 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
14710 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
14720 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
14730 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
14740 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
14750 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
14760 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14770 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
14780 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
14790 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
147a0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
147b0 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
147c0 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
147d0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78 42   WHERETRACE(("xB
147e0 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c  estIndex for %s\
147f0 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
14800 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  );.  TRACE_IDX_I
14810 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
14820 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
14830 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
14840 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
14850 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
14860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14870 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
14880 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
14890 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
148a0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
148b0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
148c0 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
148d0 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
148e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
148f0 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
14900 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
14910 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14920 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14930 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
14940 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
14950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
14960 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
14970 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
14980 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
14990 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
149a0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
149b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  +){.    if( !p->
149c0 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
149d0 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e  sable && p->aCon
149e0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
149f0 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
14a00 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14a10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
14a20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
14a30 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65  s: xBestIndex re
14a40 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
14a50 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a  d plan", pTab->z
14a60 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
14a70 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ..  return pPars
14a80 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a  e->nErr;.}.../*.
14a90 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 62  ** Compute the b
14aa0 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20  est index for a 
14ab0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
14ac0 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69 6e  *.** The best in
14ad0 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64 20  dex is computed 
14ae0 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
14af0 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  x method of the 
14b00 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65  virtual.** table
14b10 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20 72   module.  This r
14b20 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c 79  outine is really
14b30 20 6a 75 73 74 20 61 20 77 72 61 70 70 65 72 20   just a wrapper 
14b40 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a 20  that sets up.** 
14b50 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
14b60 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14b70 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
14b80 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74   communicate wit
14b90 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e  h.** xBestIndex.
14ba0 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e  .**.** In a join
14bb0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
14bc0 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20 6d  ight be called m
14bd0 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66 6f  ultiple times fo
14be0 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69  r the.** same vi
14bf0 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
14c00 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
14c10 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
14c20 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
14c30 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20   initialized on 
14c40 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61  the first invoca
14c50 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
14c60 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  on all subsequen
14c70 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73  t.** invocations
14c80 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
14c90 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
14ca0 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ure is also used
14cb0 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73   when.** code is
14cc0 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61 63   generated to ac
14cd0 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61 6c  cess the virtual
14ce0 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68 65   table.  The whe
14cf0 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a  reInfoDelete() .
14d00 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65 73  ** routine takes
14d10 20 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e 67   care of freeing
14d20 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
14d30 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14d40 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72 79  e after.** every
14d50 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68 65  body has finishe
14d60 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74  d with it..*/.st
14d70 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 56 69  atic void bestVi
14d80 72 74 75 61 6c 49 6e 64 65 78 28 57 68 65 72 65  rtualIndex(Where
14d90 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20 20 50  BestIdx *p){.  P
14da0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
14db0 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 2f  ->pParse;      /
14dc0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
14dd0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
14de0 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d  Clause *pWC = p-
14df0 3e 70 57 43 3b 20 20 20 20 20 20 2f 2a 20 54 68  >pWC;      /* Th
14e00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
14e10 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
14e20 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20  st_item *pSrc = 
14e30 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65 20  p->pSrc; /* The 
14e40 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
14e50 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
14e60 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53  Table *pTab = pS
14e70 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  rc->pTab;.  sqli
14e80 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
14e90 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75  pIdxInfo;.  stru
14ea0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14eb0 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
14ec0 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
14ed0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
14ee0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
14ef0 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
14f00 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
14f10 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74  t i, j, k;.  int
14f20 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74   nOrderBy;.  int
14f30 20 73 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20   sortOrder;     
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f50 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 49  Sort order for I
14f60 4e 20 63 6c 61 75 73 65 73 20 2a 2f 0a 20 20 69  N clauses */.  i
14f70 6e 74 20 62 41 6c 6c 6f 77 49 4e 3b 20 20 20 20  nt bAllowIN;    
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14f90 2a 20 41 6c 6c 6f 77 20 49 4e 20 6f 70 74 69 6d  * Allow IN optim
14fa0 69 7a 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 64 6f  izations */.  do
14fb0 75 62 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f  uble rCost;..  /
14fc0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c  * Make sure wsFl
14fd0 61 67 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ags is initializ
14fe0 65 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20  ed to some sane 
14ff0 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65  value. Otherwise
15000 2c 20 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d  , if the .  ** m
15010 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74  alloc in allocat
15020 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69  eIndexInfo() fai
15030 6c 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ls and this func
15040 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61  tion returns lea
15050 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67  ving.  ** wsFlag
15060 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61  s in an uninitia
15070 6c 69 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65  lized state, the
15080 20 63 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61   caller may beha
15090 76 65 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79  ve unpredictably
150a0 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
150b0 26 70 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69 7a  &p->cost, 0, siz
150c0 65 6f 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a 20  eof(p->cost));. 
150d0 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73   p->cost.plan.ws
150e0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
150f0 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f  RTUALTABLE;..  /
15100 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33  * If the sqlite3
15110 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
15120 63 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65  cture has not be
15130 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  en previously.  
15140 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
15150 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68   initialized, th
15160 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  en allocate and 
15170 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f  initialize it no
15180 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  w..  */.  pIdxIn
15190 66 6f 20 3d 20 2a 70 2d 3e 70 70 49 64 78 49 6e  fo = *p->ppIdxIn
151a0 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  fo;.  if( pIdxIn
151b0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 2d  fo==0 ){.    *p-
151c0 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64  >ppIdxInfo = pId
151d0 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
151e0 49 6e 64 65 78 49 6e 66 6f 28 70 29 3b 0a 20 20  IndexInfo(p);.  
151f0 7d 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  }.  if( pIdxInfo
15200 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
15210 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  n;.  }..  /* At 
15220 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
15230 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
15240 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
15250 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74  t pIdxInfo point
15260 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68  s.  ** to will h
15270 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ave been initial
15280 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75 72  ized, either dur
15290 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
152a0 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20  invocation or.  
152b0 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70  ** during some p
152c0 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  rior invocation.
152d0 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61    Now we just ha
152e0 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20  ve to customize 
152f0 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73  the.  ** details
15300 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72   of pIdxInfo for
15310 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76   the current inv
15320 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73  ocation and pass
15330 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73   it to.  ** xBes
15340 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20  tIndex..  */..  
15350 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61  /* The module na
15360 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  me must be defin
15370 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69  ed. Also, by thi
15380 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75  s point there mu
15390 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69  st.  ** be a poi
153a0 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
153b0 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
153c0 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a  e. Otherwise.  *
153d0 2a 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  * sqlite3ViewGet
153e0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f  ColumnNames() wo
153f0 75 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64 20  uld have picked 
15400 75 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20  up the error. . 
15410 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
15420 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20  ab->azModuleArg 
15430 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  && pTab->azModul
15440 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73  eArg[0] );.  ass
15450 65 72 74 28 20 73 71 6c 69 74 65 33 47 65 74 56  ert( sqlite3GetV
15460 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
15470 2c 20 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a  , pTab) );..  /*
15480 20 54 72 79 20 6f 6e 63 65 20 6f 72 20 74 77 69   Try once or twi
15490 63 65 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  ce.  On the firs
154a0 74 20 61 74 74 65 6d 70 74 2c 20 61 6c 6c 6f 77  t attempt, allow
154b0 20 49 4e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   IN optimization
154c0 73 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 20 49 4e  s..  ** If an IN
154d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
154e0 20 61 63 63 65 70 74 65 64 20 62 79 20 74 68 65   accepted by the
154f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78   virtual table x
15500 42 65 73 74 49 6e 64 65 78 0a 20 20 2a 2a 20 6d  BestIndex.  ** m
15510 65 74 68 6f 64 2c 20 62 75 74 20 74 68 65 20 20  ethod, but the  
15520 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  pInfo->aConstrai
15530 6e 55 73 61 67 65 2e 6f 6d 69 74 20 66 6c 61 67  nUsage.omit flag
15540 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
15550 6e 0a 20 20 2a 2a 20 74 68 65 20 71 75 65 72 79  n.  ** the query
15560 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 62   will not work b
15570 65 63 61 75 73 65 20 69 74 20 6d 69 67 68 74 20  ecause it might 
15580 61 6c 6c 6f 77 20 64 75 70 6c 69 63 61 74 65 20  allow duplicate 
15590 72 6f 77 73 20 69 6e 0a 20 20 2a 2a 20 6f 75 74  rows in.  ** out
155a0 70 75 74 2e 20 20 49 6e 20 74 68 61 74 20 63 61  put.  In that ca
155b0 73 65 2c 20 72 75 6e 20 74 68 65 20 78 42 65 73  se, run the xBes
155c0 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 20  tIndex method a 
155d0 73 65 63 6f 6e 64 20 74 69 6d 65 0a 20 20 2a 2a  second time.  **
155e0 20 77 69 74 68 6f 75 74 20 74 68 65 20 49 4e 20   without the IN 
155f0 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 55 73  constraints.  Us
15600 75 61 6c 6c 79 20 74 68 69 73 20 6c 6f 6f 70 20  ually this loop 
15610 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
15620 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 77 69    ** The loop wi
15630 6c 6c 20 65 78 69 74 20 75 73 69 6e 67 20 61 20  ll exit using a 
15640 22 62 72 65 61 6b 22 20 73 74 61 74 65 6d 65 6e  "break" statemen
15650 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 62 41  t..  */.  for(bA
15660 6c 6c 6f 77 49 4e 3d 31 3b 20 31 3b 20 62 41 6c  llowIN=1; 1; bAl
15670 6c 6f 77 49 4e 2d 2d 29 7b 0a 20 20 20 20 61 73  lowIN--){.    as
15680 73 65 72 74 28 20 62 41 6c 6c 6f 77 49 4e 3d 3d  sert( bAllowIN==
15690 30 20 7c 7c 20 62 41 6c 6c 6f 77 49 4e 3d 3d 31  0 || bAllowIN==1
156a0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   );..    /* Set 
156b0 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  the aConstraint[
156c0 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20  ].usable fields 
156d0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
156e0 6c 6c 20 0a 20 20 20 20 2a 2a 20 6f 75 74 70 75  ll .    ** outpu
156f0 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a  t variables to z
15700 65 72 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ero..    **.    
15710 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  ** aConstraint[]
15720 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75 65 20  .usable is true 
15730 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
15740 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
15750 68 61 6e 64 0a 20 20 20 20 2a 2a 20 73 69 64 65  hand.    ** side
15760 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72   contains only r
15770 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
15780 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
15790 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
157a0 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e     ** table.  In
157b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
157c0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
157d0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
157e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
157f0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d          column =
15800 20 65 78 70 72 0a 20 20 20 20 2a 2a 0a 20 20 20   expr.    **.   
15810 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65   ** and we are e
15820 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e  valuating a join
15830 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
15840 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20  raint on column 
15850 69 73 20 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20  is .    ** only 
15860 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62  valid if all tab
15870 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 69  les referenced i
15880 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20  n expr occur to 
15890 74 68 65 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  the left.    ** 
158a0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e  of the table con
158b0 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a  taining column..
158c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
158d0 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d  e aConstraints[]
158e0 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
158f0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
15900 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
15910 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
15920 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77  t table.  That w
15930 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20  ay we only have 
15940 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e  to compute it on
15950 63 65 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 74  ce.    ** even t
15960 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74  hough we might t
15970 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62  ry to pick the b
15980 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70  est index multip
15990 6c 65 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2a  le times..    **
159a0 20 46 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70   For each attemp
159b0 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20  t at picking an 
159c0 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72  index, the order
159d0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
159e0 65 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69  e.    ** join mi
159f0 67 68 74 20 62 65 20 64 69 66 66 65 72 65 6e 74  ght be different
15a00 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72   so we have to r
15a10 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61  ecompute the usa
15a20 62 6c 65 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ble flag.    ** 
15a30 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 2a  each time..    *
15a40 2f 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  /.    pIdxCons =
15a50 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
15a60 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
15a70 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
15a80 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
15a90 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
15aa0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
15ab0 73 61 67 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  sage;.    for(i=
15ac0 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
15ad0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
15ae0 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
15af0 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
15b00 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
15b10 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
15b20 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  C->a[j];.      i
15b30 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
15b40 71 52 69 67 68 74 26 70 2d 3e 6e 6f 74 52 65 61  qRight&p->notRea
15b50 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  dy)==0.       &&
15b60 20 28 62 41 6c 6c 6f 77 49 4e 20 7c 7c 20 28 70   (bAllowIN || (p
15b70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
15b80 26 20 57 4f 5f 49 4e 29 3d 3d 30 29 0a 20 20 20  & WO_IN)==0).   
15b90 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49     ){.        pI
15ba0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
15bb0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
15bc0 0a 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e  .        pIdxCon
15bd0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
15be0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15bf0 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
15c00 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
15c10 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e  [0])*pIdxInfo->n
15c20 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
15c30 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
15c40 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
15c50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15c60 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
15c70 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20  idxStr);.    }. 
15c80 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
15c90 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
15ca0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
15cb0 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
15cc0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
15cd0 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
15ce0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
15cf0 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  umed = 0;.    /*
15d00 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49 6e 20   ((double)2) In 
15d10 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  case of SQLITE_O
15d20 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
15d30 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 70 49 64  NT... */.    pId
15d40 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
15d50 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
15d60 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65  G_DBL / ((double
15d70 29 32 29 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42  )2);.    nOrderB
15d80 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  y = pIdxInfo->nO
15d90 72 64 65 72 42 79 3b 0a 20 20 20 20 69 66 28 20  rderBy;.    if( 
15da0 21 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  !p->pOrderBy ){.
15db0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
15dc0 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
15dd0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 76    }.  .    if( v
15de0 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61  tabBestIndex(pPa
15df0 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49  rse, pTab, pIdxI
15e00 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65  nfo) ){.      re
15e10 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  turn;.    }.  . 
15e20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
15e30 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20  QLITE_SO_ASC;.  
15e40 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
15e50 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15e60 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
15e70 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
15e80 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72  straint;.    for
15e90 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
15ea0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
15eb0 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
15ec0 0a 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67  .      if( pUsag
15ed0 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
15ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   ){.        j = 
15ef0 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
15f00 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70  ffset;.        p
15f10 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
15f20 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  ];.        p->co
15f30 73 74 2e 75 73 65 64 20 7c 3d 20 70 54 65 72 6d  st.used |= pTerm
15f40 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
15f50 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
15f60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
15f70 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
15f80 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67 65        if( pUsage
15f90 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20  [i].omit==0 ){. 
15fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
15fb0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
15fc0 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  use an IN constr
15fd0 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72 74  aint if the virt
15fe0 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
15ff0 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68        ** says th
16000 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  at the equivalen
16010 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  t EQ constraint 
16020 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79  cannot be safely
16030 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20   omitted..      
16040 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64        ** If we d
16050 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  o attempt to use
16060 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69   such a constrai
16070 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69  nt, some rows mi
16080 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20 20  ght be.         
16090 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69     ** repeated i
160a0 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f  n the output. */
160b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
160c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
160d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
160e0 30 3b 20 6b 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; k<pIdxInfo->n
160f0 4f 72 64 65 72 42 79 3b 20 6b 2b 2b 29 7b 0a 20  OrderBy; k++){. 
16100 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
16110 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
16120 79 5b 6b 5d 2e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  y[k].iColumn==pI
16130 64 78 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 20  dxCons->iColumn 
16140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
16150 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64   sortOrder = pId
16160 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b  xInfo->aOrderBy[
16170 6b 5d 2e 64 65 73 63 3b 0a 20 20 20 20 20 20 20  k].desc;.       
16180 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
161a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
161b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
161c0 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78 49      if( i>=pIdxI
161d0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
161e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
161f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
16200 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
16210 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20 73 65  ause, and the se
16220 6c 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 74  lected virtual t
16230 61 62 6c 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20  able index.  ** 
16240 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79  does not satisfy
16250 20 69 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68   it, increase th
16260 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73 63  e cost of the sc
16270 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  an accordingly. 
16280 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74 63 68 65  This.  ** matche
16290 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
162a0 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74 75 61 6c   for non-virtual
162b0 20 74 61 62 6c 65 73 20 69 6e 20 62 65 73 74 42   tables in bestB
162c0 74 72 65 65 49 6e 64 65 78 28 29 2e 0a 20 20 2a  treeIndex()..  *
162d0 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70 49 64 78  /.  rCost = pIdx
162e0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
162f0 6f 73 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  ost;.  if( p->pO
16300 72 64 65 72 42 79 20 26 26 20 70 49 64 78 49 6e  rderBy && pIdxIn
16310 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
16320 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43  med==0 ){.    rC
16330 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43  ost += estLog(rC
16340 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a  ost)*rCost;.  }.
16350 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69  .  /* The cost i
16360 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
16370 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
16380 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28  SQLITE_BIG_DBL (
16390 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20  the.  ** inital 
163a0 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43  value of lowestC
163b0 6f 73 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70  ost in this loop
163c0 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  . If it is, then
163d0 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c   the.  ** (cost<
163e0 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74  lowestCost) test
163f0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65   below will neve
16400 72 20 62 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20  r be true..  ** 
16410 0a 20 20 2a 2a 20 55 73 65 20 22 28 64 6f 75 62  .  ** Use "(doub
16420 6c 65 29 32 22 20 69 6e 73 74 65 61 64 20 6f 66  le)2" instead of
16430 20 22 32 2e 30 22 20 69 6e 20 63 61 73 65 20 4f   "2.0" in case O
16440 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
16450 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64 65 66 69  NT .  ** is defi
16460 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
16470 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f  (SQLITE_BIG_DBL/
16480 28 28 64 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f  ((double)2))<rCo
16490 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73  st ){.    p->cos
164a0 74 2e 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54  t.rCost = (SQLIT
164b0 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62  E_BIG_DBL/((doub
164c0 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  le)2));.  }else{
164d0 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f  .    p->cost.rCo
164e0 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 7d 0a  st = rCost;.  }.
164f0 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75    p->cost.plan.u
16500 2e 70 56 74 61 62 49 64 78 20 3d 20 70 49 64 78  .pVtabIdx = pIdx
16510 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78  Info;.  if( pIdx
16520 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
16530 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 61 73 73  sumed ){.    ass
16540 65 72 74 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d  ert( sortOrder==
16550 30 20 7c 7c 20 73 6f 72 74 4f 72 64 65 72 3d 3d  0 || sortOrder==
16560 31 20 29 3b 0a 20 20 20 20 70 2d 3e 63 6f 73 74  1 );.    p->cost
16570 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
16580 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 20 2b   WHERE_ORDERED +
16590 20 73 6f 72 74 4f 72 64 65 72 2a 57 48 45 52 45   sortOrder*WHERE
165a0 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 70 2d  _REVERSE;.    p-
165b0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61  >cost.plan.nOBSa
165c0 74 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  t = nOrderBy;.  
165d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f  }else{.    p->co
165e0 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d  st.plan.nOBSat =
165f0 20 70 2d 3e 69 20 3f 20 70 2d 3e 61 4c 65 76 65   p->i ? p->aLeve
16600 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e  l[p->i-1].plan.n
16610 4f 42 53 61 74 20 3a 20 30 3b 0a 20 20 7d 0a 20  OBSat : 0;.  }. 
16620 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 45   p->cost.plan.nE
16630 71 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  q = 0;.  pIdxInf
16640 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f  o->nOrderBy = nO
16650 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72  rderBy;..  /* Tr
16660 79 20 74 6f 20 66 69 6e 64 20 61 20 6d 6f 72 65  y to find a more
16670 20 65 66 66 69 63 69 65 6e 74 20 61 63 63 65 73   efficient acces
16680 73 20 70 61 74 74 65 72 6e 20 62 79 20 75 73 69  s pattern by usi
16690 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 65  ng multiple inde
166a0 78 65 73 0a 20 20 2a 2a 20 74 6f 20 6f 70 74 69  xes.  ** to opti
166b0 6d 69 7a 65 20 61 6e 20 4f 52 20 65 78 70 72 65  mize an OR expre
166c0 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
166d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a   WHERE clause. .
166e0 20 20 2a 2f 0a 20 20 62 65 73 74 4f 72 43 6c 61    */.  bestOrCla
166f0 75 73 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 23  useIndex(p);.}.#
16700 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16710 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
16720 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
16730 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
16740 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
16750 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
16760 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
16770 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
16780 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
16790 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
167a0 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
167b0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
167c0 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
167d0 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
167e0 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61  ws less than pVa
167f0 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  l.**    aStat[1]
16800 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
16810 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
16820 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65  to pVal.**.** Re
16830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
16840 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
16850 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
16860 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
16870 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16880 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16890 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
168a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
168c0 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
168d0 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
168e0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
168f0 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a  *pVal,        /*
16900 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64   Value to consid
16910 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
16920 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
16930 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
16940 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
16950 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
16960 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
16970 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
16980 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
16990 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
169a0 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49    tRowcnt n;.  I
169b0 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
169c0 70 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54  ple;.  int i, eT
169d0 79 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20  ype;.  int isEq 
169e0 3d 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  = 0;.  i64 v;.  
169f0 64 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20  double r, rS;.. 
16a00 20 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70   assert( roundUp
16a10 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d  ==0 || roundUp==
16a20 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
16a30 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  Idx->nSample>0 )
16a40 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20  ;.  if( pVal==0 
16a50 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16a60 45 52 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64  ERROR;.  n = pId
16a70 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  x->aiRowEst[0];.
16a80 20 20 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78    aSample = pIdx
16a90 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79  ->aSample;.  eTy
16aa0 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
16ab0 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a  ue_type(pVal);..
16ac0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
16ad0 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
16ae0 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76     v = sqlite3_v
16af0 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29  alue_int64(pVal)
16b00 3b 0a 20 20 20 20 72 20 3d 20 28 69 36 34 29 76  ;.    r = (i64)v
16b10 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
16b20 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
16b30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
16b40 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16b50 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
16b60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16b70 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
16b80 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58  Type>=SQLITE_TEX
16b90 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  T ) break;.     
16ba0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16bb0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e  eType==SQLITE_IN
16bc0 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
16bd0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16be0 75 2e 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20  u.i>=v ){.      
16bf0 20 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70      isEq = aSamp
16c00 6c 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20  le[i].u.i==v;.  
16c10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
16c40 73 65 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d  sert( aSample[i]
16c50 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46  .eType==SQLITE_F
16c60 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20  LOAT );.        
16c70 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  if( aSample[i].u
16c80 2e 72 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20  .r>=r ){.       
16c90 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c     isEq = aSampl
16ca0 65 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20  e[i].u.r==r;.   
16cb0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16cd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
16ce0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
16cf0 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d  FLOAT ){.    r =
16d00 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
16d10 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20  ouble(pVal);.   
16d20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
16d30 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
16d40 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
16d50 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
16d60 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
16d70 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61  nue;.      if( a
16d80 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e  Sample[i].eType>
16d90 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62  =SQLITE_TEXT ) b
16da0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
16db0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16dc0 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29  ==SQLITE_FLOAT )
16dd0 7b 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61  {.        rS = a
16de0 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20  Sample[i].u.r;. 
16df0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16e00 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65      rS = aSample
16e10 5b 69 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d  [i].u.i;.      }
16e20 0a 20 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72  .      if( rS>=r
16e30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71   ){.        isEq
16e40 20 3d 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20   = rS==r;.      
16e50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16e60 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
16e70 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
16e80 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d  _NULL ){.    i =
16e90 20 30 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d   0;.    if( aSam
16ea0 70 6c 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[0].eType==SQ
16eb0 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71  LITE_NULL ) isEq
16ec0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
16ed0 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
16ee0 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
16ef0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42   eType==SQLITE_B
16f00 4c 4f 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  LOB );.    for(i
16f10 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  =0; i<pIdx->nSam
16f20 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
16f30 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16f40 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45  eType==SQLITE_TE
16f50 58 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d  XT || aSample[i]
16f60 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42  .eType==SQLITE_B
16f70 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62  LOB ){.        b
16f80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
16f90 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49    }.    if( i<pI
16fa0 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20  dx->nSample ){  
16fb0 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74      .      sqlit
16fc0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16fd0 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  >db;.      CollS
16fe0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
16ff0 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20   const u8 *z;.  
17000 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53      if( eType==S
17010 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20  QLITE_BLOB ){.  
17020 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74        z = (const
17030 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61   u8 *)sqlite3_va
17040 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a  lue_blob(pVal);.
17050 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
17060 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
17070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17080 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Coll->enc==SQLIT
17090 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20  E_UTF8 );.      
170a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
170b0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
170c0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
170d0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
170e0 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b   *pIdx->azColl);
170f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
17100 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
17110 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17120 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
17130 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63  }.        z = (c
17140 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65  onst u8 *)sqlite
17150 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
17160 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
17170 20 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a        if( !z ){.
17180 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17190 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
171a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
171b0 20 61 73 73 65 72 74 28 20 7a 20 26 26 20 70 43   assert( z && pC
171c0 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
171d0 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mp );.      }.  
171e0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56      n = sqlite3V
171f0 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20  alueBytes(pVal, 
17200 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 0a  pColl->enc);.  .
17210 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3c 70 49        for(; i<pI
17220 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  dx->nSample; i++
17230 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  ){.        int c
17240 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53  ;.        int eS
17250 61 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d  ampletype = aSam
17260 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20  ple[i].eType;.  
17270 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c        if( eSampl
17280 65 74 79 70 65 3c 65 54 79 70 65 20 29 20 63 6f  etype<eType ) co
17290 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
172a0 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65 21  if( eSampletype!
172b0 3d 65 54 79 70 65 20 29 20 62 72 65 61 6b 3b 0a  =eType ) break;.
172c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
172d0 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 20  MIT_UTF16.      
172e0 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63    if( pColl->enc
172f0 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b  !=SQLITE_UTF8 ){
17300 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
17310 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20 20  Sample;.        
17320 20 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20    char *zSample 
17330 3d 20 73 71 6c 69 74 65 33 55 74 66 38 74 6f 31  = sqlite3Utf8to1
17340 36 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  6(.             
17350 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c   db, pColl->enc,
17360 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c   aSample[i].u.z,
17370 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74   aSample[i].nByt
17380 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20  e, &nSample.    
17390 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
173a0 20 20 20 69 66 28 20 21 7a 53 61 6d 70 6c 65 20     if( !zSample 
173b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
173c0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
173d0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
173e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
173f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
17400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17410 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d    c = pColl->xCm
17420 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
17430 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65  nSample, zSample
17440 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  , n, z);.       
17450 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
17460 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20  (db, zSample);. 
17470 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
17480 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
17490 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c          c = pCol
174a0 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
174b0 55 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  User, aSample[i]
174c0 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b  .nByte, aSample[
174d0 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20  i].u.z, n, z);. 
174e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
174f0 20 69 66 28 20 63 3e 3d 30 20 29 7b 0a 20 20 20   if( c>=0 ){.   
17500 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20         if( c==0 
17510 29 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 20 20  ) isEq = 1;.    
17520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17540 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
17550 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53  t this point, aS
17560 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20  ample[i] is the 
17570 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61  first sample tha
17580 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
17590 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20  n.  ** or equal 
175a0 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20  to pVal.  Or if 
175b0 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
175c0 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c  , then all sampl
175d0 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a  es are less.  **
175e0 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20   than pVal.  If 
175f0 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c  aSample[i]==pVal
17600 2c 20 74 68 65 6e 20 69 73 45 71 3d 3d 31 2e 0a  , then isEq==1..
17610 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 71 20    */.  if( isEq 
17620 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
17630 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  <pIdx->nSample )
17640 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  ;.    aStat[0] =
17650 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b   aSample[i].nLt;
17660 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
17670 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b 0a  aSample[i].nEq;.
17680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f    }else{.    tRo
17690 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70  wcnt iLower, iUp
176a0 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
176b0 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
176c0 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
176d0 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d     iUpper = aSam
176e0 70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20 20  ple[0].nLt;.    
176f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70  }else{.      iUp
17700 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e  per = i>=pIdx->n
17710 53 61 6d 70 6c 65 20 3f 20 6e 20 3a 20 61 53 61  Sample ? n : aSa
17720 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20  mple[i].nLt;.   
17730 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
17740 70 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20 61  ple[i-1].nEq + a
17750 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74 3b  Sample[i-1].nLt;
17760 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74  .    }.    aStat
17770 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 76 67 45  [1] = pIdx->avgE
17780 71 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65  q;.    if( iLowe
17790 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20  r>=iUpper ){.   
177a0 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20     iGap = 0;.   
177b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
177c0 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  ap = iUpper - iL
177d0 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ower;.    }.    
177e0 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20  if( roundUp ){. 
177f0 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61       iGap = (iGa
17800 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73  p*2)/3;.    }els
17810 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
17820 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20  iGap/3;.    }.  
17830 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f    aStat[0] = iLo
17840 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a  wer + iGap;.  }.
17850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17860 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
17870 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
17880 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  AT3 */../*.** If
17890 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
178a0 72 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 6c  r represents a l
178b0 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20 73 65  iteral value, se
178c0 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
178d0 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f  o.** an sqlite3_
178e0 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
178f0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
17900 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74 68 20  ame value, with 
17910 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20  affinity.** aff 
17920 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 62  applied to it, b
17930 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
17940 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
17950 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
17960 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65   .** caller to e
17970 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
17980 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
17990 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74   by passing it t
179a0 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c  o .** sqlite3Val
179b0 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  ueFree()..**.** 
179c0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  If the current p
179d0 61 72 73 65 20 69 73 20 61 20 72 65 63 6f 6d 70  arse is a recomp
179e0 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65 70 72  ile (sqlite3Repr
179f0 65 70 61 72 65 28 29 29 20 61 6e 64 20 70 45 78  epare()) and pEx
17a00 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20  pr.** is an SQL 
17a10 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 63 75  variable that cu
17a20 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f  rrently has a no
17a30 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75  n-NULL value bou
17a40 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65  nd to it,.** cre
17a50 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  ate an sqlite3_v
17a60 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
17a70 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 76  ontaining this v
17a80 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69 74 68  alue, again with
17a90 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61 66 66  .** affinity aff
17aa0 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20   applied to it, 
17ab0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
17ac0 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68 65  f neither of the
17ad0 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20 73 65   above apply, se
17ae0 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  t *pp to NULL..*
17af0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
17b00 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
17b10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
17b20 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
17b30 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  _OK..*/.#ifdef S
17b40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17b50 54 33 0a 73 74 61 74 69 63 20 69 6e 74 20 76 61  T3.static int va
17b60 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50  lueFromExpr(.  P
17b70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
17b80 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20   Expr *pExpr, . 
17b90 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71 6c 69   u8 aff, .  sqli
17ba0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29  te3_value **pp.)
17bb0 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
17bc0 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20  p==TK_VARIABLE. 
17bd0 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d    || (pExpr->op=
17be0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
17bf0 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56  pExpr->op2==TK_V
17c00 41 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20  ARIABLE).  ){.  
17c10 20 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45 78    int iVar = pEx
17c20 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
17c30 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
17c40 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
17c50 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20  Vdbe, iVar);.   
17c60 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56 64   *pp = sqlite3Vd
17c70 62 65 47 65 74 56 61 6c 75 65 28 70 50 61 72 73  beGetValue(pPars
17c80 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
17c90 56 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 72  Var, aff);.    r
17ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
17cc0 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78  lite3ValueFromEx
17cd0 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
17ce0 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46  Expr, SQLITE_UTF
17cf0 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23  8, aff, pp);.}.#
17d00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
17d10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
17d20 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
17d30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
17d40 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
17d50 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
17d60 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
17d70 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
17d80 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
17d90 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
17da0 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
17db0 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
17dc0 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
17dd0 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
17de0 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
17df0 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
17e00 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
17e10 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
17e20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
17e30 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
17e40 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
17e50 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
17e60 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
17e70 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
17e80 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
17e90 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
17eb0 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17ee0 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
17ef0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
17f00 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
17f10 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
17f20 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
17f30 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
17f40 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
17f50 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
17f60 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
17f70 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
17f80 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
17f90 20 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20 69   nEq parameter i
17fa0 73 20 70 61 73 73 65 64 20 74 68 65 20 69 6e 64  s passed the ind
17fb0 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ex of the index 
17fc0 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
17fd0 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63  o the.** range c
17fe0 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
17ff0 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
18000 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   number of equal
18010 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
18020 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ** optimized by 
18030 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
18040 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
18050 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69  mple, assuming i
18060 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20  ndex p is.** on 
18070 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
18080 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
18090 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
180a0 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
180b0 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
180c0 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
180d0 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65  en nEq should be
180e0 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75   passed the valu
180f0 65 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  e 1 (as the rang
18100 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
18110 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68  umn,.** b, is th
18120 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f  e second left-mo
18130 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
18140 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
18150 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
18160 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
18170 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
18180 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
18190 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c  * then nEq shoul
181a0 64 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a  d be passed 0..*
181b0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
181c0 64 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  d value is an in
181d0 74 65 67 65 72 20 64 69 76 69 73 6f 72 20 74 6f  teger divisor to
181e0 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69   reduce the esti
181f0 6d 61 74 65 64 0a 2a 2a 20 73 65 61 72 63 68 20  mated.** search 
18200 73 70 61 63 65 2e 20 20 41 20 72 65 74 75 72 6e  space.  A return
18210 20 76 61 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e   value of 1 mean
18220 73 20 74 68 61 74 20 72 61 6e 67 65 20 63 6f 6e  s that range con
18230 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20  straints are.** 
18240 6e 6f 20 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20  no help at all. 
18250 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20   A return value 
18260 6f 66 20 32 20 6d 65 61 6e 73 20 72 61 6e 67 65  of 2 means range
18270 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
18280 0a 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20  .** expected to 
18290 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
182a0 68 20 73 70 61 63 65 20 62 79 20 68 61 6c 66 2e  h space by half.
182b0 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e    And so forth..
182c0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61  ..**.** In the a
182d0 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65  bsence of sqlite
182e0 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a 45 20 64  _stat3 ANALYZE d
182f0 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67 65 20  ata, each range 
18300 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65  inequality.** re
18310 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
18320 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74   space by a fact
18330 6f 72 20 6f 66 20 34 2e 20 20 48 65 6e 63 65 20  or of 4.  Hence 
18340 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61  a single constra
18350 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73  int (x>?).** res
18360 75 6c 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e  ults in a return
18370 20 6f 66 20 34 20 61 6e 64 20 61 20 72 61 6e 67   of 4 and a rang
18380 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e  e constraint (x>
18390 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c  ? AND x<?) resul
183a0 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72  ts.** in a retur
183b0 6e 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74  n of 16..*/.stat
183c0 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
183d0 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  eScanEst(.  Pars
183e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
183f0 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
18400 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
18410 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
18420 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
18430 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63 6f 6e  /* The index con
18440 74 61 69 6e 69 6e 67 20 74 68 65 20 72 61 6e 67  taining the rang
18450 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d  e-compared colum
18460 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20  n; "x" */.  int 
18470 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  nEq,            
18480 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 70   /* index into p
18490 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20  ->aCol[] of the 
184a0 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63  range-compared c
184b0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
184c0 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
184d0 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
184e0 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
184f0 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
18500 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
18510 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
18520 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
18530 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
18540 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
18550 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 64 6f 75  be NULL */.  dou
18560 62 6c 65 20 2a 70 52 61 6e 67 65 44 69 76 20 20  ble *pRangeDiv  
18570 20 2f 2a 20 4f 55 54 3a 20 52 65 64 75 63 65 20   /* OUT: Reduce 
18580 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
18590 74 68 69 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a  this divisor */.
185a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
185b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66  LITE_OK;..#ifdef
185c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
185d0 54 41 54 33 0a 0a 20 20 69 66 28 20 6e 45 71 3d  TAT3..  if( nEq=
185e0 3d 30 20 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65  =0 && p->nSample
185f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
18600 76 61 6c 75 65 20 2a 70 52 61 6e 67 65 56 61 6c  value *pRangeVal
18610 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  ;.    tRowcnt iL
18620 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 74 52  ower = 0;.    tR
18630 6f 77 63 6e 74 20 69 55 70 70 65 72 20 3d 20 70  owcnt iUpper = p
18640 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
18650 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
18660 0a 20 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d  .    u8 aff = p-
18670 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
18680 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66  >aiColumn[0]].af
18690 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66 28  finity;..    if(
186a0 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20   pLower ){.     
186b0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
186c0 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
186d0 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  ight;.      rc =
186e0 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70   valueFromExpr(p
186f0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66  Parse, pExpr, af
18700 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a  f, &pRangeVal);.
18710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
18720 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
18730 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
18740 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
18750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
18760 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b         && whereK
18770 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
18780 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c  p, pRangeVal, 0,
18790 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   a)==SQLITE_OK. 
187a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
187b0 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iLower = a[0];. 
187c0 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 77         if( (pLow
187d0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
187e0 57 4f 5f 47 54 29 21 3d 30 20 29 20 69 4c 6f 77  WO_GT)!=0 ) iLow
187f0 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  er += a[1];.    
18800 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
18810 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67  3ValueFree(pRang
18820 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eVal);.    }.   
18830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18840 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a  OK && pUpper ){.
18850 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
18860 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
18870 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
18880 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45   rc = valueFromE
18890 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
188a0 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56  r, aff, &pRangeV
188b0 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
188c0 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  t( (pUpper->eOpe
188d0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
188e0 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_LE))!=0 );.   
188f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18900 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77  E_OK.       && w
18910 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
18920 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61  rse, p, pRangeVa
18930 6c 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45  l, 1, a)==SQLITE
18940 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  _OK.      ){.   
18950 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b       iUpper = a[
18960 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
18970 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
18980 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
18990 20 69 55 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b   iUpper += a[1];
189a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
189b0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
189c0 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20  pRangeVal);.    
189d0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
189e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
189f0 20 69 66 28 20 69 55 70 70 65 72 3c 3d 69 4c 6f   if( iUpper<=iLo
18a00 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  wer ){.        *
18a10 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75  pRangeDiv = (dou
18a20 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b  ble)p->aiRowEst[
18a30 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0];.      }else{
18a40 0a 20 20 20 20 20 20 20 20 2a 70 52 61 6e 67 65  .        *pRange
18a50 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d  Div = (double)p-
18a60 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f 28 64 6f  >aiRowEst[0]/(do
18a70 75 62 6c 65 29 28 69 55 70 70 65 72 20 2d 20 69  uble)(iUpper - i
18a80 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Lower);.      }.
18a90 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
18aa0 28 28 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65  (("range scan re
18ab0 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64  gions: %u..%u  d
18ac0 69 76 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20  iv=%g\n",.      
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
18ae0 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
18af0 70 70 65 72 2c 20 2a 70 52 61 6e 67 65 44 69 76  pper, *pRangeDiv
18b00 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18b10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18b20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
18b30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
18b40 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44  Parse);.  UNUSED
18b50 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
18b60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18b70 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20  R(nEq);.#endif. 
18b80 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20   assert( pLower 
18b90 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20 2a  || pUpper );.  *
18ba0 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75  pRangeDiv = (dou
18bb0 62 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 4c 6f  ble)1;.  if( pLo
18bc0 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e  wer && (pLower->
18bd0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
18be0 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70 52 61 6e  NULL)==0 ) *pRan
18bf0 67 65 44 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65  geDiv *= (double
18c00 29 34 3b 0a 20 20 69 66 28 20 70 55 70 70 65 72  )4;.  if( pUpper
18c10 20 29 20 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d   ) *pRangeDiv *=
18c20 20 28 64 6f 75 62 6c 65 29 34 3b 0a 20 20 72 65   (double)4;.  re
18c30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
18c40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18c50 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT3./*.** Est
18c60 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
18c70 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
18c80 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
18c90 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
18ca0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
18cb0 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
18cc0 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
18cd0 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
18ce0 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
18cf0 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
18d00 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
18d10 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
18d20 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
18d30 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
18d40 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
18d50 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
18d60 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
18d70 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
18d80 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
18d90 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
18da0 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
18db0 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
18dc0 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
18dd0 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
18de0 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
18df0 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
18e00 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
18e10 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
18e20 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
18e30 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
18e40 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
18e50 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
18e60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
18e70 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
18e80 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
18e90 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
18ea0 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
18eb0 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
18ec0 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
18ed0 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
18ee0 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
18ef0 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
18f00 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
18f10 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
18f20 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
18f30 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
18f40 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
18f50 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
18f60 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
18f70 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18f80 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
18f90 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
18fa0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
18fb0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
18fc0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
18fd0 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  se left-most col
18fe0 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a  umn is pTerm */.
18ff0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
19000 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
19010 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
19020 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
19030 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 64 6f  nstraint */.  do
19040 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20 20  uble *pnRow     
19050 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
19060 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
19070 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
19080 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
19090 2a 70 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56  *pRhs = 0;  /* V
190a0 41 4c 55 45 20 6f 6e 20 72 69 67 68 74 2d 68 61  ALUE on right-ha
190b0 6e 64 20 73 69 64 65 20 6f 66 20 70 54 65 72 6d  nd side of pTerm
190c0 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20 20 20   */.  u8 aff;   
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  /* Column affini
190f0 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ty */.  int rc; 
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
19120 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
19130 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20    tRowcnt a[2]; 
19140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19150 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20  tatistics */..  
19160 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
19170 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
19180 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  t( p->nSample>0 
19190 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  );.  aff = p->pT
191a0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
191b0 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e  Column[0]].affin
191c0 69 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ity;.  if( pExpr
191d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c   ){.    rc = val
191e0 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
191f0 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26  e, pExpr, aff, &
19200 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 72  pRhs);.    if( r
19210 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71  c ) goto whereEq
19220 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65  ualScanEst_cance
19230 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
19240 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56 61  pRhs = sqlite3Va
19250 6c 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e 64  lueNew(pParse->d
19260 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52  b);.  }.  if( pR
19270 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  hs==0 ) return S
19280 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
19290 20 20 72 63 20 3d 20 77 68 65 72 65 4b 65 79 53    rc = whereKeyS
192a0 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
192b0 70 52 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69  pRhs, 0, a);.  i
192c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
192d0 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
192e0 43 45 28 28 22 65 71 75 61 6c 69 74 79 20 73 63  CE(("equality sc
192f0 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
19300 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  ", (int)a[1]));.
19310 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31      *pnRow = a[1
19320 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45 71 75 61  ];.  }.whereEqua
19330 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a  lScanEst_cancel:
19340 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
19350 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74  ree(pRhs);.  ret
19360 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
19370 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
19380 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
19390 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
193a0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
193b0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
193c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
193d0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
193e0 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
193f0 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
19400 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
19410 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
19420 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
19430 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
19440 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
19450 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
19460 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
19470 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
19480 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
19490 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
194a0 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
194b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
194c0 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
194d0 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
194e0 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
194f0 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
19500 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
19510 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19520 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
19530 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
19540 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
19550 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
19560 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
19570 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
19580 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
19590 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
195a0 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
195b0 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
195c0 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
195d0 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
195e0 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
195f0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
19600 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
19610 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  nScanEst(.  Pars
19620 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19630 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
19640 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
19650 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
19660 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
19670 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
19680 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  se left-most col
19690 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a  umn is pTerm */.
196a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
196b0 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
196c0 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
196d0 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
196e0 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
196f0 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20    double *pnRow 
19700 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
19710 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
19720 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
19730 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
19740 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
19750 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
19760 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
19770 20 20 64 6f 75 62 6c 65 20 6e 45 73 74 3b 20 20    double nEst;  
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19790 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
197a0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
197b0 6d 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52  m */.  double nR
197c0 6f 77 45 73 74 20 3d 20 28 64 6f 75 62 6c 65 29  owEst = (double)
197d0 30 3b 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61  0; /* New estima
197e0 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
197f0 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e   of rows */.  in
19800 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
19810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
19820 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
19830 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
19840 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  le!=0 );.  for(i
19850 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
19860 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  K && i<pList->nE
19870 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  xpr; i++){.    n
19880 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  Est = p->aiRowEs
19890 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77  t[0];.    rc = w
198a0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
198b0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 69 73  (pParse, p, pLis
198c0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
198d0 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
198e0 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a  st += nEst;.  }.
198f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19900 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
19910 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f  RowEst > p->aiRo
19920 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73  wEst[0] ) nRowEs
19930 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
19940 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  0];.    *pnRow =
19950 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
19960 45 52 45 54 52 41 43 45 28 28 22 49 4e 20 72 6f  ERETRACE(("IN ro
19970 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
19980 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %g\n", nRowEst))
19990 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
199a0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64  c;.}.#endif /* d
199b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
199c0 41 42 4c 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a  ABLE_STAT3) */..
199d0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
199e0 65 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 43 6f  ee if column iCo
199f0 6c 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  l of the table w
19a00 69 74 68 20 63 75 72 73 6f 72 20 69 54 61 62 20  ith cursor iTab 
19a10 77 69 6c 6c 20 61 70 70 65 61 72 0a 2a 2a 20 69  will appear.** i
19a20 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 61  n sorted order a
19a30 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
19a40 63 75 72 72 65 6e 74 20 71 75 65 72 79 20 70 6c  current query pl
19a50 61 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  an..**.** Return
19a60 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
19a70 20 20 30 20 20 20 69 43 6f 6c 20 69 73 20 6e 6f    0   iCol is no
19a80 74 20 6f 72 64 65 72 65 64 0a 2a 2a 20 20 20 20  t ordered.**    
19a90 31 20 20 20 69 43 6f 6c 20 68 61 73 20 6f 6e 6c  1   iCol has onl
19aa0 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65  y a single value
19ab0 0a 2a 2a 20 20 20 20 32 20 20 20 69 43 6f 6c 20  .**    2   iCol 
19ac0 69 73 20 69 6e 20 41 53 43 20 6f 72 64 65 72 0a  is in ASC order.
19ad0 2a 2a 20 20 20 20 33 20 20 20 69 43 6f 6c 20 69  **    3   iCol i
19ae0 73 20 69 6e 20 44 45 53 43 20 6f 72 64 65 72 0a  s in DESC order.
19af0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
19b00 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28 0a 20  OrderedColumn(. 
19b10 20 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70   WhereBestIdx *p
19b20 2c 0a 20 20 69 6e 74 20 69 54 61 62 2c 0a 20 20  ,.  int iTab,.  
19b30 69 6e 74 20 69 43 6f 6c 0a 29 7b 0a 20 20 69 6e  int iCol.){.  in
19b40 74 20 69 2c 20 6a 3b 0a 20 20 57 68 65 72 65 4c  t i, j;.  WhereL
19b50 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26  evel *pLevel = &
19b60 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31  p->aLevel[p->i-1
19b70 5d 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ];.  Index *pIdx
19b80 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72  ;.  u8 sortOrder
19b90 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 69 2d 31  ;.  for(i=p->i-1
19ba0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4c 65  ; i>=0; i--, pLe
19bb0 76 65 6c 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  vel--){.    if( 
19bc0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 21  pLevel->iTabCur!
19bd0 3d 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  =iTab ) continue
19be0 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  ;.    if( (pLeve
19bf0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
19c00 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51  & WHERE_ALL_UNIQ
19c10 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  UE)!=0 ){.      
19c20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
19c30 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 65      assert( (pLe
19c40 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
19c50 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 45  s & WHERE_ORDERE
19c60 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  D)!=0 );.    if(
19c70 20 28 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d   (pIdx = pLevel-
19c80 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 29 21 3d 30  >plan.u.pIdx)!=0
19c90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43   ){.      if( iC
19ca0 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
19cb0 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  sortOrder = 0;. 
19cc0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19cd0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
19ce0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
19cf0 45 56 45 52 53 45 29 21 3d 30 20 29 3b 0a 20 20  EVERSE)!=0 );.  
19d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19d10 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 64 78 2d     int n = pIdx-
19d20 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
19d30 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
19d40 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
19d50 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e  if( iCol==pIdx->
19d60 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 20 62 72  aiColumn[j] ) br
19d70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
19d80 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 6e 20         if( j>=n 
19d90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
19da0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
19db0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
19dc0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 74 65 73  [j];.        tes
19dd0 74 63 61 73 65 28 20 28 70 4c 65 76 65 6c 2d 3e  tcase( (pLevel->
19de0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
19df0 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
19e00 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
19e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
19e20 20 69 43 6f 6c 21 3d 28 2d 31 29 20 29 20 72 65   iCol!=(-1) ) re
19e30 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 73 6f  turn 0;.      so
19e40 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20  rtOrder = 0;.   
19e50 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 4c     testcase( (pL
19e60 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
19e70 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52  gs & WHERE_REVER
19e80 53 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  SE)!=0 );.    }.
19e90 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
19ea0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
19eb0 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d  WHERE_REVERSE)!=
19ec0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
19ed0 74 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20  t( sortOrder==0 
19ee0 7c 7c 20 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20  || sortOrder==1 
19ef0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19f00 65 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20  e( sortOrder==1 
19f10 29 3b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64  );.      sortOrd
19f20 65 72 20 3d 20 31 20 2d 20 73 6f 72 74 4f 72 64  er = 1 - sortOrd
19f30 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  er;.    }.    re
19f40 74 75 72 6e 20 73 6f 72 74 4f 72 64 65 72 2b 32  turn sortOrder+2
19f50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
19f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19f70 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20  routine decides 
19f80 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75  if pIdx can be u
19f90 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  sed to satisfy t
19fa0 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
19fb0 6c 61 75 73 65 2c 20 65 69 74 68 65 72 20 69 6e  lause, either in
19fc0 20 77 68 6f 6c 65 20 6f 72 20 69 6e 20 70 61 72   whole or in par
19fd0 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  t.  The return v
19fe0 61 6c 75 65 20 69 73 20 74 68 65 20 0a 2a 2a 20  alue is the .** 
19ff0 63 75 6d 75 6c 61 74 69 76 65 20 6e 75 6d 62 65  cumulative numbe
1a000 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
1a010 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1a020 65 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73  e that are satis
1a030 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 69  fied.** by the i
1a040 6e 64 65 78 20 70 49 64 78 20 61 6e 64 20 6f 74  ndex pIdx and ot
1a050 68 65 72 20 69 6e 64 69 63 65 73 20 69 6e 20 6f  her indices in o
1a060 75 74 65 72 20 6c 6f 6f 70 73 2e 0a 2a 2a 0a 2a  uter loops..**.*
1a070 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
1a080 67 20 71 75 65 72 69 65 64 20 68 61 73 20 61 20  g queried has a 
1a090 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
1a0a0 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
1a0b0 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 74  s the.** index t
1a0c0 68 61 74 20 69 73 20 70 6f 73 74 75 6c 61 74 65  hat is postulate
1a0d0 64 20 66 6f 72 20 75 73 65 20 74 6f 20 61 63 63  d for use to acc
1a0e0 65 73 73 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  ess the table..*
1a0f0 2a 0a 2a 2a 20 54 68 65 20 2a 70 62 52 65 76 20  *.** The *pbRev 
1a100 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
1a110 30 20 6f 72 64 65 72 20 31 20 64 65 70 65 6e 64  0 order 1 depend
1a120 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1a130 72 20 6e 6f 74 0a 2a 2a 20 70 49 64 78 20 73 68  r not.** pIdx sh
1a140 6f 75 6c 64 20 62 65 20 72 75 6e 20 69 6e 20 74  ould be run in t
1a150 68 65 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72  he forward order
1a160 20 6f 72 20 69 6e 20 72 65 76 65 72 73 65 20 6f   or in reverse o
1a170 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1a180 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
1a190 65 78 28 0a 20 20 57 68 65 72 65 42 65 73 74 49  ex(.  WhereBestI
1a1a0 64 78 20 2a 70 2c 20 20 20 20 2f 2a 20 42 65 73  dx *p,    /* Bes
1a1b0 74 20 69 6e 64 65 78 20 73 65 61 72 63 68 20 63  t index search c
1a1c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
1a1d0 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
1a1e0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
1a1f0 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20  are testing */. 
1a200 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
1a210 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
1a220 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
1a230 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
1a240 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
1a250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
1a260 20 74 6f 20 31 20 66 6f 72 20 72 65 76 65 72 73   to 1 for revers
1a270 65 2d 6f 72 64 65 72 20 73 63 61 6e 20 6f 66 20  e-order scan of 
1a280 70 49 64 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pIdx */.){.  int
1a290 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1a2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a2b0 6d 62 65 72 20 6f 66 20 70 49 64 78 20 74 65 72  mber of pIdx ter
1a2c0 6d 73 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ms used */.  int
1a2d0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
1a2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a2f0 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
1a300 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64   terms satisfied
1a310 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
1a320 64 65 72 20 3d 20 32 3b 20 20 20 20 20 20 20 20  der = 2;        
1a330 20 20 20 20 2f 2a 20 30 3a 20 66 6f 72 77 61 72      /* 0: forwar
1a340 64 2e 20 20 31 3a 20 62 61 63 6b 77 61 72 64 2e  d.  1: backward.
1a350 20 20 32 3a 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a    2: unknown */.
1a360 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a380 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
1a390 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
1a3a0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a3b0 5f 69 74 65 6d 20 2a 70 4f 42 49 74 65 6d 3b 2f  _item *pOBItem;/
1a3c0 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
1a3d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1a3e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1a3f0 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
1a400 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 61 74     /* Table that
1a410 20 6f 77 6e 73 20 69 6e 64 65 78 20 70 49 64 78   owns index pIdx
1a420 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1a430 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
1a440 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
1a450 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1a460 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1a470 70 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 2f 2a  p->pParse;    /*
1a480 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
1a490 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1a4a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
1a4b0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1a4c0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
1a4d0 6e 74 20 6e 50 72 69 6f 72 53 61 74 3b 20 20 20  nt nPriorSat;   
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a4f0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
1a500 61 74 69 73 66 69 65 64 20 62 79 20 6f 75 74 65  atisfied by oute
1a510 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 69 6e 74  r loops */.  int
1a520 20 73 65 65 6e 52 6f 77 69 64 20 3d 20 30 3b 20   seenRowid = 0; 
1a530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1a540 75 65 20 69 66 20 61 6e 20 4f 52 44 45 52 20 42  ue if an ORDER B
1a550 59 20 72 6f 77 69 64 20 74 65 72 6d 20 69 73 20  Y rowid term is 
1a560 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 75 6e  seen */.  int un
1a570 69 71 75 65 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20  iqueNotNull;    
1a580 20 20 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20          /* pIdx 
1a590 69 73 20 55 4e 49 51 55 45 20 77 69 74 68 20 61  is UNIQUE with a
1a5a0 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 4e 4f 54  ll terms are NOT
1a5b0 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 69 66 28 20   NULL */..  if( 
1a5c0 70 2d 3e 69 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  p->i==0 ){.    n
1a5d0 50 72 69 6f 72 53 61 74 20 3d 20 30 3b 0a 20 20  PriorSat = 0;.  
1a5e0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 69 6f  }else{.    nPrio
1a5f0 72 53 61 74 20 3d 20 70 2d 3e 61 4c 65 76 65 6c  rSat = p->aLevel
1a600 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f  [p->i-1].plan.nO
1a610 42 53 61 74 3b 0a 20 20 20 20 69 66 28 20 28 70  BSat;.    if( (p
1a620 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
1a630 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1a640 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 3d 3d  WHERE_ORDERED)==
1a650 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
1a660 69 73 20 6c 6f 6f 70 20 63 61 6e 6e 6f 74 20 62  is loop cannot b
1a670 65 20 6f 72 64 65 72 65 64 20 75 6e 6c 65 73 73  e ordered unless
1a680 20 74 68 65 20 6e 65 78 74 20 6f 75 74 65 72 20   the next outer 
1a690 6c 6f 6f 70 20 69 73 0a 20 20 20 20 20 20 2a 2a  loop is.      **
1a6a0 20 61 6c 73 6f 20 6f 72 64 65 72 65 64 20 2a 2f   also ordered */
1a6b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 50  .      return nP
1a6c0 72 69 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a 20  riorSat;.    }. 
1a6d0 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74     if( Optimizat
1a6e0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
1a6f0 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
1a700 78 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  xJoin) ){.      
1a710 2f 2a 20 4f 6e 6c 79 20 6c 6f 6f 6b 20 61 74 20  /* Only look at 
1a720 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 20 6c  the outer-most l
1a730 6f 6f 70 20 69 66 20 74 68 65 20 4f 72 64 65 72  oop if the Order
1a740 42 79 49 64 78 4a 6f 69 6e 0a 20 20 20 20 20 20  ByIdxJoin.      
1a750 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
1a760 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
1a770 20 20 20 20 20 72 65 74 75 72 6e 20 6e 50 72 69       return nPri
1a780 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  orSat;.    }.  }
1a790 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
1a7a0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
1a7b0 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
1a7c0 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e   );.  if( pIdx->
1a7d0 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20  bUnordered ){.  
1a7e0 20 20 2f 2a 20 48 61 73 68 20 69 6e 64 69 63 65    /* Hash indice
1a7f0 73 20 28 69 6e 64 69 63 61 74 65 64 20 62 79 20  s (indicated by 
1a800 74 68 65 20 22 75 6e 6f 72 64 65 72 65 64 22 20  the "unordered" 
1a810 74 61 67 20 6f 6e 20 73 71 6c 69 74 65 5f 73 74  tag on sqlite_st
1a820 61 74 31 29 20 63 61 6e 6e 6f 74 0a 20 20 20 20  at1) cannot.    
1a830 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 73  ** be used for s
1a840 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65  orting */.    re
1a850 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a  turn nPriorSat;.
1a860 20 20 7d 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f    }.  nTerm = pO
1a870 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
1a880 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d   uniqueNotNull =
1a890 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
1a8a0 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 61 73 73 65 72  OE_None;.  asser
1a8b0 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20  t( nTerm>0 );.. 
1a8c0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64   /* Argument pId
1a8d0 78 20 6d 75 73 74 20 65 69 74 68 65 72 20 70 6f  x must either po
1a8e0 69 6e 74 20 74 6f 20 61 20 27 72 65 61 6c 27 20  int to a 'real' 
1a8f0 6e 61 6d 65 64 20 69 6e 64 65 78 20 73 74 72 75  named index stru
1a900 63 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20  cture, .  ** or 
1a910 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  an index structu
1a920 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  re allocated on 
1a930 74 68 65 20 73 74 61 63 6b 20 62 79 20 62 65 73  the stack by bes
1a940 74 42 74 72 65 65 49 6e 64 65 78 28 29 20 74 6f  tBtreeIndex() to
1a950 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20  .  ** represent 
1a960 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78 20  the rowid index 
1a970 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
1a980 65 76 65 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f  every table.  */
1a990 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
1a9a0 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d  >zName || (pIdx-
1a9b0 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70  >nColumn==1 && p
1a9c0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
1a9d0 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==-1) );..  /* M
1a9e0 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68  atch terms of th
1a9f0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1aa00 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e  e against column
1aa10 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e  s of.  ** the in
1aa20 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  dex..  **.  ** N
1aa30 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73  ote that indices
1aa40 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c   have pIdx->nCol
1aa50 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75  umn regular colu
1aa60 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e  mns plus.  ** on
1aa70 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  e additional col
1aa80 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  umn containing t
1aa90 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72  he rowid.  The r
1aaa0 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a  owid column.  **
1aab0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
1aac0 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f   also allowed to
1aad0 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
1aae0 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
1aaf0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
1ab00 6a 20 3d 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20  j = nPriorSat;. 
1ab10 20 66 6f 72 28 69 3d 30 2c 70 4f 42 49 74 65 6d   for(i=0,pOBItem
1ab20 3d 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a 5d  =&pOrderBy->a[j]
1ab30 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d  ; j<nTerm && i<=
1ab40 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
1ab50 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1ab60 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  OBExpr;         
1ab70 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1ab80 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  on of the ORDER 
1ab90 42 59 20 70 4f 42 49 74 65 6d 20 2a 2f 0a 20 20  BY pOBItem */.  
1aba0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1abb0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
1abc0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1abd0 6e 63 65 20 6f 66 20 70 4f 42 45 78 70 72 20 2a  nce of pOBExpr *
1abe0 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f  /.    int termSo
1abf0 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 2f 2a  rtOrder;      /*
1ac00 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20   Sort order for 
1ac10 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20  this term */.   
1ac20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
1ac30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ac40 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i-th column of t
1ac50 68 65 20 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f  he index.  -1 fo
1ac60 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  r rowid */.    i
1ac70 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 3b 20 20  nt iSortOrder;  
1ac80 20 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20         /* 1 for 
1ac90 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20  DESC, 0 for ASC 
1aca0 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  on the i-th inde
1acb0 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e  x term */.    in
1acc0 74 20 69 73 45 71 3b 20 20 20 20 20 20 20 20 20  t isEq;         
1acd0 20 20 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74        /* Subject
1ace0 20 74 6f 20 61 6e 20 3d 3d 20 6f 72 20 49 53 20   to an == or IS 
1acf0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
1ad00 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 61 74  */.    int isMat
1ad10 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ch;            /
1ad20 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  * ORDER BY term 
1ad30 6d 61 74 63 68 65 73 20 74 68 65 20 69 6e 64 65  matches the inde
1ad40 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f  x term */.    co
1ad50 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
1ad60 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1ad70 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1ad80 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64  nce for i-th ind
1ad90 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 57  ex term */.    W
1ada0 68 65 72 65 54 65 72 6d 20 2a 70 43 6f 6e 73 74  hereTerm *pConst
1adb0 72 61 69 6e 74 3b 20 2f 2a 20 41 20 63 6f 6e 73  raint; /* A cons
1adc0 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 57 48  traint in the WH
1add0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20  ERE clause */.. 
1ade0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 78     /* If the nex
1adf0 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  t term of the OR
1ae00 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 72 65  DER BY clause re
1ae10 66 65 72 73 20 74 6f 20 61 6e 79 74 68 69 6e 67  fers to anything
1ae20 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 20 20   other than.    
1ae30 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
1ae40 68 65 20 22 62 61 73 65 22 20 74 61 62 6c 65 2c  he "base" table,
1ae50 20 74 68 65 6e 20 74 68 69 73 20 69 6e 64 65 78   then this index
1ae60 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6f 66 20   will not be of 
1ae70 61 6e 79 0a 20 20 20 20 2a 2a 20 66 75 72 74 68  any.    ** furth
1ae80 65 72 20 75 73 65 20 69 6e 20 68 61 6e 64 6c 69  er use in handli
1ae90 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  ng the ORDER BY.
1aea0 20 2a 2f 0a 20 20 20 20 70 4f 42 45 78 70 72 20   */.    pOBExpr 
1aeb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1aec0 70 43 6f 6c 6c 61 74 65 28 70 4f 42 49 74 65 6d  pCollate(pOBItem
1aed0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ->pExpr);.    if
1aee0 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
1aef0 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 4f 42 45  K_COLUMN || pOBE
1af00 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73  xpr->iTable!=bas
1af10 65 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  e ){.      break
1af20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1af30 46 69 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  Find column numb
1af40 65 72 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  er and collating
1af50 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
1af60 65 20 6e 65 78 74 20 65 6e 74 72 79 0a 20 20 20  e next entry.   
1af70 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
1af80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
1af90 2d 3e 7a 4e 61 6d 65 20 26 26 20 69 3c 70 49 64  ->zName && i<pId
1afa0 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
1afb0 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
1afc0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
1afd0 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75  .      if( iColu
1afe0 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65  mn==pIdx->pTable
1aff0 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
1b000 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
1b010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b020 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78  SortOrder = pIdx
1b030 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
1b040 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
1b050 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
1b060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43        assert( zC
1b070 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 7d 65  oll!=0 );.    }e
1b080 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  lse{.      iColu
1b090 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  mn = -1;.      i
1b0a0 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  SortOrder = 0;. 
1b0b0 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a       zColl = 0;.
1b0c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
1b0d0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1b0e0 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
1b0f0 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
1b100 71 75 65 6e 63 65 20 6f 66 20 74 68 65 0a 20 20  quence of the.  
1b110 20 20 2a 2a 20 69 6e 64 65 78 20 6d 61 74 63 68    ** index match
1b120 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
1b130 65 72 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  er and collating
1b140 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65   sequence of the
1b150 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a   ORDER BY.    **
1b160 20 63 6c 61 75 73 65 20 65 6e 74 72 79 2e 20 20   clause entry.  
1b170 53 65 74 20 69 73 4d 61 74 63 68 20 74 6f 20 31  Set isMatch to 1
1b180 20 69 66 20 74 68 65 79 20 62 6f 74 68 20 6d 61   if they both ma
1b190 74 63 68 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tch. */.    if( 
1b1a0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
1b1b0 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
1b1c0 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a     if( zColl ){.
1b1d0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1b1e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1b1f0 65 71 28 70 50 61 72 73 65 2c 20 70 4f 42 49 74  eq(pParse, pOBIt
1b200 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
1b210 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1b220 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
1b230 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
1b240 69 73 4d 61 74 63 68 20 3d 20 73 71 6c 69 74 65  isMatch = sqlite
1b250 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
1b260 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 3d 3d 30  zName, zColl)==0
1b270 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b280 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
1b290 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1b2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 73 4d  }else{.      isM
1b2b0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  atch = 0;.    }.
1b2c0 0a 20 20 20 20 2f 2a 20 74 65 72 6d 53 6f 72 74  .    /* termSort
1b2d0 4f 72 64 65 72 20 69 73 20 30 20 6f 72 20 31 20  Order is 0 or 1 
1b2e0 66 6f 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  for whether or n
1b2f0 6f 74 20 74 68 65 20 61 63 63 65 73 73 20 6c 6f  ot the access lo
1b300 6f 70 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a  op should.    **
1b310 20 72 75 6e 20 66 6f 72 77 61 72 64 20 6f 72 20   run forward or 
1b320 62 61 63 6b 77 61 72 64 73 20 28 72 65 73 70 65  backwards (respe
1b330 63 74 69 76 65 6c 79 29 20 69 6e 20 6f 72 64 65  ctively) in orde
1b340 72 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 69  r to satisfy thi
1b350 73 20 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20 6f  s .    ** term o
1b360 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1b370 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 61 73  lause. */.    as
1b380 73 65 72 74 28 20 70 4f 42 49 74 65 6d 2d 3e 73  sert( pOBItem->s
1b390 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70  ortOrder==0 || p
1b3a0 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  OBItem->sortOrde
1b3b0 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  r==1 );.    asse
1b3c0 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d  rt( iSortOrder==
1b3d0 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d  0 || iSortOrder=
1b3e0 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f  =1 );.    termSo
1b3f0 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f  rtOrder = iSortO
1b400 72 64 65 72 20 5e 20 70 4f 42 49 74 65 6d 2d 3e  rder ^ pOBItem->
1b410 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20  sortOrder;..    
1b420 2f 2a 20 49 66 20 58 20 69 73 20 74 68 65 20 63  /* If X is the c
1b430 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64  olumn in the ind
1b440 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  ex and ORDER BY 
1b450 63 6c 61 75 73 65 2c 20 63 68 65 63 6b 20 74 6f  clause, check to
1b460 20 73 65 65 0a 20 20 20 20 2a 2a 20 69 66 20 74   see.    ** if t
1b470 68 65 72 65 20 61 72 65 20 61 6e 79 20 58 3d 20  here are any X= 
1b480 6f 72 20 58 20 49 53 20 4e 55 4c 4c 20 63 6f 6e  or X IS NULL con
1b490 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
1b4a0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 2a 2f  WHERE clause. */
1b4b0 0a 20 20 20 20 70 43 6f 6e 73 74 72 61 69 6e 74  .    pConstraint
1b4c0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 2d 3e 70   = findTerm(p->p
1b4d0 57 43 2c 20 62 61 73 65 2c 20 69 43 6f 6c 75 6d  WC, base, iColum
1b4e0 6e 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 0a  n, p->notReady,.
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 20 20 20 20 20 20 20 20 20 20 57 4f 5f 45 51             WO_EQ
1b510 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  |WO_ISNULL|WO_IN
1b520 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , pIdx);.    if(
1b530 20 70 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20   pConstraint==0 
1b540 29 7b 0a 20 20 20 20 20 20 69 73 45 71 20 3d 20  ){.      isEq = 
1b550 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1b560 20 28 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 65   (pConstraint->e
1b570 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1b580 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73  )!=0 ){.      is
1b590 45 71 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Eq = 0;.    }els
1b5a0 65 20 69 66 28 20 28 70 43 6f 6e 73 74 72 61 69  e if( (pConstrai
1b5b0 6e 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nt->eOperator & 
1b5c0 57 4f 5f 49 53 4e 55 4c 4c 29 21 3d 30 20 29 7b  WO_ISNULL)!=0 ){
1b5d0 0a 20 20 20 20 20 20 75 6e 69 71 75 65 4e 6f 74  .      uniqueNot
1b5e0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Null = 0;.      
1b5f0 69 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 22 58  isEq = 1;  /* "X
1b600 20 49 53 20 4e 55 4c 4c 22 20 6d 65 61 6e 73 20   IS NULL" means 
1b610 58 20 68 61 73 20 6f 6e 6c 79 20 61 20 73 69 6e  X has only a sin
1b620 67 6c 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  gle value */.   
1b630 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e 73   }else if( pCons
1b640 74 72 61 69 6e 74 2d 3e 70 72 65 72 65 71 52 69  traint->prereqRi
1b650 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
1b660 69 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 43 6f  isEq = 1;  /* Co
1b670 6e 73 74 72 61 69 6e 74 20 22 58 3d 63 6f 6e 73  nstraint "X=cons
1b680 74 61 6e 74 22 20 6d 65 61 6e 73 20 58 20 68 61  tant" means X ha
1b690 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
1b6a0 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 7d 65 6c  value */.    }el
1b6b0 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1b6c0 70 52 69 67 68 74 20 3d 20 70 43 6f 6e 73 74 72  pRight = pConstr
1b6d0 61 69 6e 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69  aint->pExpr->pRi
1b6e0 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ght;.      if( p
1b6f0 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
1b700 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
1b710 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20 20  WHERETRACE(("   
1b720 20 20 20 20 2e 2e 20 69 73 4f 72 64 65 72 65 64      .. isOrdered
1b730 43 6f 6c 75 6d 6e 28 74 61 62 3d 25 64 2c 63 6f  Column(tab=%d,co
1b740 6c 3d 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20  l=%d)",.        
1b750 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
1b760 68 74 2d 3e 69 54 61 62 6c 65 2c 20 70 52 69 67  ht->iTable, pRig
1b770 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 29 3b 0a 20  ht->iColumn));. 
1b780 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 69 73         isEq = is
1b790 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28 70 2c  OrderedColumn(p,
1b7a0 20 70 52 69 67 68 74 2d 3e 69 54 61 62 6c 65 2c   pRight->iTable,
1b7b0 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
1b7c0 29 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  );.        WHERE
1b7d0 54 52 41 43 45 28 28 22 20 2d 3e 20 69 73 45 71  TRACE((" -> isEq
1b7e0 3d 25 64 5c 6e 22 2c 20 69 73 45 71 29 29 3b 0a  =%d\n", isEq));.
1b7f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
1b800 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
1b810 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 59   of the form X=Y
1b820 20 77 68 65 72 65 20 59 20 69 73 20 61 6e 20 6f   where Y is an o
1b830 72 64 65 72 65 64 20 76 61 6c 75 65 0a 20 20 20  rdered value.   
1b840 20 20 20 20 20 2a 2a 20 69 6e 20 61 6e 20 6f 75       ** in an ou
1b850 74 65 72 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 6d  ter loop, then m
1b860 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72  ake sure the sor
1b870 74 20 6f 72 64 65 72 20 6f 66 20 59 20 6d 61 74  t order of Y mat
1b880 63 68 65 73 20 74 68 65 0a 20 20 20 20 20 20 20  ches the.       
1b890 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 20 72   ** sort order r
1b8a0 65 71 75 69 72 65 64 20 66 6f 72 20 58 2e 20 2a  equired for X. *
1b8b0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  /.        if( is
1b8c0 4d 61 74 63 68 20 26 26 20 69 73 45 71 3e 3d 32  Match && isEq>=2
1b8d0 20 26 26 20 69 73 45 71 21 3d 70 4f 42 49 74 65   && isEq!=pOBIte
1b8e0 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 2b 32 20 29  m->sortOrder+2 )
1b8f0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
1b900 63 61 73 65 28 20 69 73 45 71 3d 3d 32 20 29 3b  case( isEq==2 );
1b910 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
1b920 61 73 65 28 20 69 73 45 71 3d 3d 33 20 29 3b 0a  ase( isEq==3 );.
1b930 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1b940 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b960 69 73 45 71 20 3d 20 30 3b 20 20 2f 2a 20 22 58  isEq = 0;  /* "X
1b970 3d 65 78 70 72 22 20 70 6c 61 63 65 73 20 6e 6f  =expr" places no
1b980 20 6f 72 64 65 72 69 6e 67 20 63 6f 6e 73 74 72   ordering constr
1b990 61 69 6e 74 73 20 6f 6e 20 58 20 2a 2f 0a 20 20  aints on X */.  
1b9a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b9b0 69 66 28 20 21 69 73 4d 61 74 63 68 20 29 7b 0a  if( !isMatch ){.
1b9c0 20 20 20 20 20 20 69 66 28 20 69 73 45 71 3d 3d        if( isEq==
1b9d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
1b9e0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
1b9f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
1ba00 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
1ba10 65 6c 73 65 20 69 66 28 20 69 73 45 71 21 3d 31  else if( isEq!=1
1ba20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 6f   ){.      if( so
1ba30 72 74 4f 72 64 65 72 3d 3d 32 20 29 7b 0a 20 20  rtOrder==2 ){.  
1ba40 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
1ba50 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b  = termSortOrder;
1ba60 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1ba70 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d   termSortOrder!=
1ba80 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  sortOrder ){.   
1ba90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1baa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b    }.    }.    j+
1bab0 2b 3b 0a 20 20 20 20 70 4f 42 49 74 65 6d 2b 2b  +;.    pOBItem++
1bac0 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d  ;.    if( iColum
1bad0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 65 65  n<0 ){.      see
1bae0 6e 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20  nRowid = 1;.    
1baf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
1bb00 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f  se if( pTab->aCo
1bb10 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  l[iColumn].notNu
1bb20 6c 6c 3d 3d 30 20 26 26 20 69 73 45 71 21 3d 31  ll==0 && isEq!=1
1bb30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
1bb40 73 65 28 20 69 73 45 71 3d 3d 30 20 29 3b 0a 20  se( isEq==0 );. 
1bb50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1bb60 73 45 71 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20  sEq==2 );.      
1bb70 74 65 73 74 63 61 73 65 28 20 69 73 45 71 3d 3d  testcase( isEq==
1bb80 33 20 29 3b 0a 20 20 20 20 20 20 75 6e 69 71 75  3 );.      uniqu
1bb90 65 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  eNotNull = 0;.  
1bba0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1bbb0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 66 6f 75   we have not fou
1bbc0 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  nd at least one 
1bbd0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68  ORDER BY term th
1bbe0 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 0a 20  at matches the. 
1bbf0 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
1bc00 73 68 6f 77 20 6e 6f 20 70 72 6f 67 72 65 73 73  show no progress
1bc10 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 42 49 74  . */.  if( pOBIt
1bc20 65 6d 3d 3d 26 70 4f 72 64 65 72 42 79 2d 3e 61  em==&pOrderBy->a
1bc30 5b 6e 50 72 69 6f 72 53 61 74 5d 20 29 20 72 65  [nPriorSat] ) re
1bc40 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a  turn nPriorSat;.
1bc50 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  .  /* Return the
1bc60 20 6e 65 63 65 73 73 61 72 79 20 73 63 61 6e 20   necessary scan 
1bc70 6f 72 64 65 72 20 62 61 63 6b 20 74 6f 20 74 68  order back to th
1bc80 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 2a 70  e caller */.  *p
1bc90 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
1bca0 20 26 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   & 1;..  /* If t
1bcb0 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
1bcc0 45 52 20 42 59 20 72 6f 77 69 64 22 20 74 65 72  ER BY rowid" ter
1bcd0 6d 20 74 68 61 74 20 6d 61 74 63 68 65 64 2c 20  m that matched, 
1bce0 6f 72 20 69 74 20 69 73 20 6f 6e 6c 79 0a 20 20  or it is only.  
1bcf0 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
1bd00 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 72 6f  a single row fro
1bd10 6d 20 74 68 69 73 20 74 61 62 6c 65 20 74 6f 20  m this table to 
1bd20 6d 61 74 63 68 2c 20 74 68 65 6e 20 73 6b 69 70  match, then skip
1bd30 20 6f 76 65 72 0a 20 20 2a 2a 20 61 6e 79 20 61   over.  ** any a
1bd40 64 64 69 74 69 6f 6e 61 6c 20 4f 52 44 45 52 20  dditional ORDER 
1bd50 42 59 20 74 65 72 6d 73 20 64 65 61 6c 69 6e 67  BY terms dealing
1bd60 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
1bd70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 65 65  ..  */.  if( see
1bd80 6e 52 6f 77 69 64 20 7c 7c 20 28 75 6e 69 71 75  nRowid || (uniqu
1bd90 65 4e 6f 74 4e 75 6c 6c 20 26 26 20 69 3e 3d 70  eNotNull && i>=p
1bda0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 7b  Idx->nColumn) ){
1bdb0 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
1bdc0 6a 20 6f 76 65 72 20 61 64 64 69 74 69 6f 6e 61  j over additiona
1bdd0 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
1bde0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1bdf0 20 62 61 73 65 20 2a 2f 0a 20 20 20 20 57 68 65   base */.    Whe
1be00 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 53 20 3d  reMaskSet *pMS =
1be10 20 70 2d 3e 70 57 43 2d 3e 70 4d 61 73 6b 53 65   p->pWC->pMaskSe
1be20 74 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  t;.    Bitmask m
1be30 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 53 2c   = ~getMask(pMS,
1be40 20 62 61 73 65 29 3b 0a 20 20 20 20 77 68 69 6c   base);.    whil
1be50 65 28 20 6a 3c 6e 54 65 72 6d 20 26 26 20 28 65  e( j<nTerm && (e
1be60 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
1be70 53 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a  S, pOrderBy->a[j
1be80 5d 2e 70 45 78 70 72 29 26 6d 29 3d 3d 30 20 29  ].pExpr)&m)==0 )
1be90 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1bea0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1beb0 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  j;.}../*.** Find
1bec0 20 74 68 65 20 62 65 73 74 20 71 75 65 72 79 20   the best query 
1bed0 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69  plan for accessi
1bee0 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ng a particular 
1bef0 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74 68  table.  Write th
1bf00 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
1bf10 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
1bf20 74 20 69 6e 74 6f 20 74 68 65 20 70 2d 3e 63 6f  t into the p->co
1bf30 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f  st..**.** The lo
1bf40 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20 77  west cost plan w
1bf50 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69  ins.  The cost i
1bf60 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1bf70 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a   the amount of.*
1bf80 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49  * CPU and disk I
1bf90 2f 4f 20 6e 65 65 64 65 64 20 74 6f 20 70 72 6f  /O needed to pro
1bfa0 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74  cess the request
1bfb0 65 64 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 46 61  ed result..** Fa
1bfc0 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75  ctors that influ
1bfd0 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64  ence cost includ
1bfe0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54  e:.**.**    *  T
1bff0 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
1c000 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
1c010 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76   will be retriev
1c020 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20  ed.  (The.**    
1c030 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74     fewer the bet
1c040 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ter.).**.**    *
1c050 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
1c060 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63   sorting must oc
1c070 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  cur..**.**    * 
1c080 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
1c090 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65  there must be se
1c0a0 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69  parate lookups i
1c0b0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69  n the.**       i
1c0c0 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20  ndex and in the 
1c0d0 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  main table..**.*
1c0e0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1c0f0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
1c100 75 73 65 20 28 70 53 72 63 2d 3e 70 49 6e 64 65  use (pSrc->pInde
1c110 78 29 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  x) attached to t
1c120 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  he table in.** t
1c130 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1c140 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1c150 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64  tion only consid
1c160 65 72 73 20 70 6c 61 6e 73 20 75 73 69 6e 67 20  ers plans using 
1c170 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e  the .** named in
1c180 64 65 78 2e 20 49 66 20 6e 6f 20 73 75 63 68 20  dex. If no such 
1c190 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74  plan is found, t
1c1a0 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64  hen the returned
1c1b0 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c 49   cost is.** SQLI
1c1c0 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20 61  TE_BIG_DBL. If a
1c1d0 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 20 74   plan is found t
1c1e0 68 61 74 20 75 73 65 73 20 74 68 65 20 6e 61 6d  hat uses the nam
1c1f0 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68  ed index, .** th
1c200 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 63  en the cost is c
1c210 61 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68 65  alculated in the
1c220 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a   usual way..**.*
1c230 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45 58  * If a NOT INDEX
1c240 45 44 20 63 6c 61 75 73 65 20 77 61 73 20 61 74  ED clause was at
1c250 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61  tached to the ta
1c260 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53  ble .** in the S
1c270 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1c280 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73   then no indexes
1c290 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
1c2a0 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 2a   However, the .*
1c2b0 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 20  * selected plan 
1c2c0 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61  may still take a
1c2d0 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
1c2e0 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20 70  built-in rowid p
1c2f0 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69 6e  rimary key.** in
1c300 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
1c310 6f 69 64 20 62 65 73 74 42 74 72 65 65 49 6e 64  oid bestBtreeInd
1c320 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20  ex(WhereBestIdx 
1c330 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
1c340 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
1c350 3b 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e  ;  /* The parsin
1c360 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1c370 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
1c380 3d 20 70 2d 3e 70 57 43 3b 20 20 2f 2a 20 54 68  = p->pWC;  /* Th
1c390 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1c3a0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1c3b0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20  st_item *pSrc = 
1c3c0 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65 20  p->pSrc; /* The 
1c3d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1c3e0 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
1c3f0 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d  int iCur = pSrc-
1c400 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54  >iCursor;   /* T
1c410 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
1c420 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63   table to be acc
1c430 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  essed */.  Index
1c440 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20   *pProbe;       
1c450 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1c460 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  ex we are evalua
1c470 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ting */.  Index 
1c480 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
1c490 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
1c4a0 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72 6f   pProbe, or zero
1c4b0 20 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20 2a   for IPK index *
1c4c0 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61  /.  int eqTermMa
1c4d0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1c4e0 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b 20  /* Current mask 
1c4f0 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74  of valid equalit
1c500 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  y operators */. 
1c510 20 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d 61   int idxEqTermMa
1c520 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  sk;          /* 
1c530 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76 61  Index mask of va
1c540 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  lid equality ope
1c550 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64 65  rators */.  Inde
1c560 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20  x sPk;          
1c570 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b          /* A fak
1c580 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e index object f
1c590 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  or the primary k
1c5a0 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  ey */.  tRowcnt 
1c5b0 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
1c5c0 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
1c5d0 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  Est[] value for 
1c5e0 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
1c5f0 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50  .  int aiColumnP
1c600 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f  k = -1;        /
1c610 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20  * The aColumn[] 
1c620 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
1c630 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  k index */.  int
1c640 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20 20   wsFlagMask;    
1c650 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
1c660 77 65 64 20 66 6c 61 67 73 20 69 6e 20 70 2d 3e  wed flags in p->
1c670 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
1c680 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 69 6f 72   */.  int nPrior
1c690 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sat;            
1c6a0 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
1c6b0 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62 79  rms satisfied by
1c6c0 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   outer loops */.
1c6d0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c6f0 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
1c700 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 63   BY terms */.  c
1c710 68 61 72 20 62 53 6f 72 74 49 6e 69 74 3b 20 20  har bSortInit;  
1c720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c730 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 62 53  itializer for bS
1c740 6f 72 74 20 69 6e 20 69 6e 6e 65 72 20 6c 6f 6f  ort in inner loo
1c750 70 20 2a 2f 0a 20 20 63 68 61 72 20 62 44 69 73  p */.  char bDis
1c760 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  tInit;          
1c770 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1c780 72 20 66 6f 72 20 62 44 69 73 74 20 69 6e 20 69  r for bDist in i
1c790 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 0a 0a 20  nner loop */... 
1c7a0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1c7b0 68 65 20 63 6f 73 74 20 74 6f 20 61 20 77 6f 72  he cost to a wor
1c7c0 73 74 2d 63 61 73 65 20 76 61 6c 75 65 20 2a 2f  st-case value */
1c7d0 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 63 6f  .  memset(&p->co
1c7e0 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  st, 0, sizeof(p-
1c7f0 3e 63 6f 73 74 29 29 3b 0a 20 20 70 2d 3e 63 6f  >cost));.  p->co
1c800 73 74 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54  st.rCost = SQLIT
1c810 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a  E_BIG_DBL;..  /*
1c820 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62   If the pSrc tab
1c830 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20  le is the right 
1c840 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
1c850 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79  JOIN then we may
1c860 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e   not.  ** use an
1c870 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66   index to satisf
1c880 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  y IS NULL constr
1c890 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61  aints on that ta
1c8a0 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20  ble.  This is.  
1c8b0 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d  ** because colum
1c8c0 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ns might end up 
1c8d0 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68  being NULL if th
1c8e0 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
1c8f0 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20   match -.  ** a 
1c900 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69  circumstance whi
1c910 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  ch the index can
1c920 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63  not help us disc
1c930 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32  over.  Ticket #2
1c940 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  177..  */.  if( 
1c950 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  pSrc->jointype &
1c960 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20   JT_LEFT ){.    
1c970 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20  idxEqTermMask = 
1c980 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d  WO_EQ|WO_IN;.  }
1c990 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 45 71 54  else{.    idxEqT
1c9a0 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c  ermMask = WO_EQ|
1c9b0 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b  WO_IN|WO_ISNULL;
1c9c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72 63  .  }..  if( pSrc
1c9d0 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
1c9e0 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
1c9f0 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
1ca00 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
1ca10 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
1ca20 20 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62 65     pIdx = pProbe
1ca30 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b   = pSrc->pIndex;
1ca40 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20  .    wsFlagMask 
1ca50 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f  = ~(WHERE_ROWID_
1ca60 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
1ca70 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72  ANGE);.    eqTer
1ca80 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72  mMask = idxEqTer
1ca90 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mMask;.  }else{.
1caa0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
1cab0 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
1cac0 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20  ause.  Create a 
1cad0 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63  fake Index objec
1cae0 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a  t in local.    *
1caf0 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74  * variable sPk t
1cb00 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
1cb10 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1cb20 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74  y index.  Make t
1cb30 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20  his.    ** fake 
1cb40 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20  index the first 
1cb50 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e  in a chain of In
1cb60 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68  dex objects with
1cb70 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c   all of the real
1cb80 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  .    ** indices 
1cb90 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20  to follow */.   
1cba0 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20   Index *pFirst; 
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61   /* First of rea
1cbd0 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
1cbe0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65   table */.    me
1cbf0 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69  mset(&sPk, 0, si
1cc00 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
1cc10 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
1cc20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
1cc30 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
1cc40 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
1cc50 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
1cc60 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
1cc70 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
1cc80 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
1cc90 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20   pSrc->pTab;.   
1cca0 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
1ccb0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f   pSrc->pTab->nRo
1ccc0 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  wEst;.    aiRowE
1ccd0 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20  stPk[1] = 1;.   
1cce0 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
1ccf0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1cd00 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49    if( pSrc->notI
1cd10 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
1cd20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
1cd30 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
1cd40 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
1cd50 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
1cd60 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
1cd70 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
1cd80 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
1cd90 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1cda0 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
1cdb0 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
1cdc0 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
1cdd0 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61  Pk;.    wsFlagMa
1cde0 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20 20  sk = ~(.        
1cdf0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
1ce00 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
1ce10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
1ce20 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  L|WHERE_COLUMN_R
1ce30 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  ANGE.    );.    
1ce40 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  eqTermMask = WO_
1ce50 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49  EQ|WO_IN;.    pI
1ce60 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 6e  dx = 0;.  }..  n
1ce70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1ce80 64 65 72 42 79 20 3f 20 70 2d 3e 70 4f 72 64 65  derBy ? p->pOrde
1ce90 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  rBy->nExpr : 0;.
1cea0 20 20 69 66 28 20 70 2d 3e 69 20 29 7b 0a 20 20    if( p->i ){.  
1ceb0 20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 70 2d    nPriorSat = p-
1cec0 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e  >aLevel[p->i-1].
1ced0 70 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20 20  plan.nOBSat;.   
1cee0 20 62 53 6f 72 74 49 6e 69 74 20 3d 20 6e 50 72   bSortInit = nPr
1cef0 69 6f 72 53 61 74 3c 6e 4f 72 64 65 72 42 79 3b  iorSat<nOrderBy;
1cf00 0a 20 20 20 20 62 44 69 73 74 49 6e 69 74 20 3d  .    bDistInit =
1cf10 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1cf20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 30 3b 0a   nPriorSat = 0;.
1cf30 20 20 20 20 62 53 6f 72 74 49 6e 69 74 20 3d 20      bSortInit = 
1cf40 6e 4f 72 64 65 72 42 79 3e 30 3b 0a 20 20 20 20  nOrderBy>0;.    
1cf50 62 44 69 73 74 49 6e 69 74 20 3d 20 70 2d 3e 70  bDistInit = p->p
1cf60 44 69 73 74 69 6e 63 74 21 3d 30 3b 0a 20 20 7d  Distinct!=0;.  }
1cf70 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
1cf80 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f   all indices loo
1cf90 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73  king for the bes
1cfa0 74 20 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a  t one to use.  *
1cfb0 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65  /.  for(; pProbe
1cfc0 3b 20 70 49 64 78 3d 70 50 72 6f 62 65 3d 70 50  ; pIdx=pProbe=pP
1cfd0 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  robe->pNext){.  
1cfe0 20 20 63 6f 6e 73 74 20 74 52 6f 77 63 6e 74 20    const tRowcnt 
1cff0 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45 73 74  * const aiRowEst
1d000 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
1d010 45 73 74 3b 0a 20 20 20 20 57 68 65 72 65 43 6f  Est;.    WhereCo
1d020 73 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  st pc;          
1d030 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
1d040 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a  using pProbe */.
1d050 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 67 31 30      double log10
1d060 4e 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 20 20  N = (double)1;  
1d070 2f 2a 20 62 61 73 65 2d 31 30 20 6c 6f 67 61 72  /* base-10 logar
1d080 69 74 68 6d 20 6f 66 20 6e 52 6f 77 20 28 69 6e  ithm of nRow (in
1d090 65 78 61 63 74 29 20 2a 2f 0a 0a 20 20 20 20 2f  exact) */..    /
1d0a0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1d0b0 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 70 6f  variables are po
1d0c0 70 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  pulated based on
1d0d0 20 74 68 65 20 70 72 6f 70 65 72 74 69 65 73 20   the properties 
1d0e0 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  of.    ** index 
1d0f0 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 2e  being evaluated.
1d100 20 54 68 65 79 20 61 72 65 20 74 68 65 6e 20 75   They are then u
1d110 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
1d120 20 74 68 65 20 65 78 70 65 63 74 65 64 0a 20 20   the expected.  
1d130 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20 6e 75    ** cost and nu
1d140 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74  mber of rows ret
1d150 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  urned..    **.  
1d160 20 20 2a 2a 20 20 70 63 2e 70 6c 61 6e 2e 6e 45    **  pc.plan.nE
1d170 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75  q: .    **    Nu
1d180 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
1d190 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20   terms that can 
1d1a0 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  be implemented u
1d1b0 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 0a  sing the index..
1d1c0 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68      **    In oth
1d1d0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6e 75  er words, the nu
1d1e0 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61 6c 20  mber of initial 
1d1f0 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 69 6e  fields in the in
1d200 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  dex that.    ** 
1d210 20 20 20 61 72 65 20 75 73 65 64 20 69 6e 20 3d     are used in =
1d220 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e  = or IN or NOT N
1d230 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
1d240 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1d250 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  use..    **.    
1d260 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20  **  nInMul:  .  
1d270 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d    **    The "in-
1d280 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69  multiplier". Thi
1d290 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  s is an estimate
1d2a0 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65   of how many see
1d2b0 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20  k operations .  
1d2c0 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d    **    SQLite m
1d2d0 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74  ust perform on t
1d2e0 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73  he index in ques
1d2f0 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tion. For exampl
1d300 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
1d310 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73  *    WHERE claus
1d320 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e is:.    **.   
1d330 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61   **      WHERE a
1d340 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e   IN (1, 2, 3) AN
1d350 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29  D b IN (4, 5, 6)
1d360 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d370 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65    SQLite must pe
1d380 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20  rform 9 lookups 
1d390 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  on an index on (
1d3a0 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c  a, b), so nInMul
1d3b0 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73   is .    **    s
1d3c0 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74  et to 9. Given t
1d3d0 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61  he same schema a
1d3e0 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  nd either of the
1d3f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45   following WHERE
1d400 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75   .    **    clau
1d410 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ses:.    **.    
1d420 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
1d430 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  =  1.    **     
1d440 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20   WHERE a >= 2.  
1d450 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e    **.    **    n
1d460 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20  InMul is set to 
1d470 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  1..    **.    **
1d480 20 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69      If there exi
1d490 73 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d  sts a WHERE term
1d4a0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
1d4b0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1d4c0 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20  , then .    **  
1d4d0 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74    the sub-select
1d4e0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72   is assumed to r
1d4f0 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f  eturn 25 rows fo
1d500 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
1d510 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74  f .    **    det
1d520 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e  ermining nInMul.
1d530 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d540 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a  bInEst:  .    **
1d550 20 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20      Set to true 
1d560 69 66 20 74 68 65 72 65 20 77 61 73 20 61 74 20  if there was at 
1d570 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20  least one "x IN 
1d580 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65  (SELECT ...)" te
1d590 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20  rm used .    ** 
1d5a0 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e     in determinin
1d5b0 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  g the value of n
1d5c0 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61  InMul.  Note tha
1d5d0 74 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  t the RHS of the
1d5e0 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70  .    **    IN op
1d5f0 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 61  erator must be a
1d600 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76   SELECT, not a v
1d610 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72 20 74  alue list, for t
1d620 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20 20 20  his variable.   
1d630 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74 72 75   **    to be tru
1d640 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1d650 20 20 72 61 6e 67 65 44 69 76 3a 0a 20 20 20 20    rangeDiv:.    
1d660 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d 61 74  **    An estimat
1d670 65 20 6f 66 20 61 20 64 69 76 69 73 6f 72 20 62  e of a divisor b
1d680 79 20 77 68 69 63 68 20 74 6f 20 72 65 64 75 63  y which to reduc
1d690 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
1d6a0 63 65 20 64 75 65 0a 20 20 20 20 2a 2a 20 20 20  ce due.    **   
1d6b0 20 74 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63   to inequality c
1d6c0 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 49 6e 20  onstraints.  In 
1d6d0 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
1d6e0 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c  qlite_stat3 ANAL
1d6f0 59 5a 45 0a 20 20 20 20 2a 2a 20 20 20 20 64 61  YZE.    **    da
1d700 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65  ta, a single ine
1d710 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
1d720 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
1d730 20 74 6f 20 31 2f 34 72 64 20 69 74 73 0a 20 20   to 1/4rd its.  
1d740 20 20 2a 2a 20 20 20 20 6f 72 69 67 69 6e 61 6c    **    original
1d750 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69 76 3d   size (rangeDiv=
1d760 3d 34 29 2e 20 20 54 77 6f 20 69 6e 65 71 75 61  =4).  Two inequa
1d770 6c 69 74 69 65 73 20 72 65 64 75 63 65 20 74 68  lities reduce th
1d780 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20  e search.    ** 
1d790 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f 31 36     space to 1/16
1d7a0 74 68 20 6f 66 20 69 74 73 20 6f 72 69 67 69 6e  th of its origin
1d7b0 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69  al size (rangeDi
1d7c0 76 3d 3d 31 36 29 2e 0a 20 20 20 20 2a 2a 0a 20  v==16)..    **. 
1d7d0 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20     **  bSort:   
1d7e0 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65  .    **    Boole
1d7f0 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68 65 72  an. True if ther
1d800 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1d810 20 63 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c   clause that wil
1d820 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20  l require an .  
1d830 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c    **    external
1d840 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63 61 6e   sort (i.e. scan
1d850 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 62  ning the index b
1d860 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 77  eing evaluated w
1d870 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20  ill not .    ** 
1d880 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f 72 64     correctly ord
1d890 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20 20 20  er records)..   
1d8a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 44 69 73   **.    **  bDis
1d8b0 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f  t:.    **    Boo
1d8c0 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68  lean. True if th
1d8d0 65 72 65 20 69 73 20 61 20 44 49 53 54 49 4e 43  ere is a DISTINC
1d8e0 54 20 63 6c 61 75 73 65 20 74 68 61 74 20 77 69  T clause that wi
1d8f0 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20  ll require an . 
1d900 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61     **    externa
1d910 6c 20 62 74 72 65 65 2e 0a 20 20 20 20 2a 2a 0a  l btree..    **.
1d920 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a      **  bLookup:
1d930 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c   .    **    Bool
1d940 65 61 6e 2e 20 54 72 75 65 20 69 66 20 61 20 74  ean. True if a t
1d950 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 69 73 20 72  able lookup is r
1d960 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
1d970 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 20 20 20   index entry.   
1d980 20 2a 2a 20 20 20 20 76 69 73 69 74 65 64 2e 20   **    visited. 
1d990 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1d9a0 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
1d9b0 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e 67 20   not a covering 
1d9c0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20 20  index..    **   
1d9d0 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
1d9e0 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 72 6f  false for the ro
1d9f0 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
1da00 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65  index of a table
1da10 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f 72 20  ..    **    For 
1da20 6f 74 68 65 72 20 69 6e 64 65 78 65 73 2c 20 69  other indexes, i
1da30 74 20 69 73 20 74 72 75 65 20 75 6e 6c 65 73 73  t is true unless
1da40 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 73   all the columns
1da50 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   of the table.  
1da60 20 20 2a 2a 20 20 20 20 75 73 65 64 20 62 79 20    **    used by 
1da70 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1da80 6d 65 6e 74 20 61 72 65 20 70 72 65 73 65 6e 74  ment are present
1da90 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 28 73   in the index (s
1daa0 75 63 68 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  uch an.    **   
1dab0 20 69 6e 64 65 78 20 69 73 20 73 6f 6d 65 74 69   index is someti
1dac0 6d 65 73 20 64 65 73 63 72 69 62 65 64 20 61 73  mes described as
1dad0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1dae0 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f  x)..    **    Fo
1daf0 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e  r example, given
1db00 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 28 61   the index on (a
1db10 2c 20 62 29 2c 20 74 68 65 20 73 65 63 6f 6e 64  , b), the second
1db20 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1db30 67 20 0a 20 20 20 20 2a 2a 20 20 20 20 74 77 6f  g .    **    two
1db40 20 71 75 65 72 69 65 73 20 72 65 71 75 69 72 65   queries require
1db50 73 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6c  s table b-tree l
1db60 6f 6f 6b 75 70 73 20 69 6e 20 6f 72 64 65 72 20  ookups in order 
1db70 74 6f 20 66 69 6e 64 20 74 68 65 20 76 61 6c 75  to find the valu
1db80 65 0a 20 20 20 20 2a 2a 20 20 20 20 6f 66 20 63  e.    **    of c
1db90 6f 6c 75 6d 6e 20 63 2c 20 62 75 74 20 74 68 65  olumn c, but the
1dba0 20 66 69 72 73 74 20 64 6f 65 73 20 6e 6f 74 20   first does not 
1dbb0 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20  because columns 
1dbc0 61 20 61 6e 64 20 62 20 61 72 65 0a 20 20 20 20  a and b are.    
1dbd0 2a 2a 20 20 20 20 62 6f 74 68 20 61 76 61 69 6c  **    both avail
1dbe0 61 62 6c 65 20 69 6e 20 74 68 65 20 69 6e 64 65  able in the inde
1dbf0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c               SEL
1dc10 45 43 54 20 61 2c 20 62 20 20 20 20 46 52 4f 4d  ECT a, b    FROM
1dc20 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31   tbl WHERE a = 1
1dc30 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ;.    **        
1dc40 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62       SELECT a, b
1dc50 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57 48 45  , c FROM tbl WHE
1dc60 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2f  RE a = 1;.    */
1dc70 0a 20 20 20 20 69 6e 74 20 62 49 6e 45 73 74 20  .    int bInEst 
1dc80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1dc90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 78     /* True if "x
1dca0 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22   IN (SELECT...)"
1dcb0 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   seen */.    int
1dcc0 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b 20 20 20 20   nInMul = 1;    
1dcd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dce0 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74  mber of distinct
1dcf0 20 65 71 75 61 6c 69 74 69 65 73 20 74 6f 20 6c   equalities to l
1dd00 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 64 6f 75  ookup */.    dou
1dd10 62 6c 65 20 72 61 6e 67 65 44 69 76 20 3d 20 28  ble rangeDiv = (
1dd20 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a 20 45 73  double)1;  /* Es
1dd30 74 69 6d 61 74 65 64 20 72 65 64 75 63 74 69 6f  timated reductio
1dd40 6e 20 69 6e 20 73 65 61 72 63 68 20 73 70 61 63  n in search spac
1dd50 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 6f  e */.    int nBo
1dd60 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  und = 0;        
1dd70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1dd80 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
1dd90 61 69 6e 74 73 20 73 65 65 6e 20 2a 2f 0a 20 20  aints seen */.  
1dda0 20 20 63 68 61 72 20 62 53 6f 72 74 20 3d 20 62    char bSort = b
1ddb0 53 6f 72 74 49 6e 69 74 3b 20 20 20 20 20 20 20  SortInit;       
1ddc0 2f 2a 20 54 72 75 65 20 69 66 20 65 78 74 65 72  /* True if exter
1ddd0 6e 61 6c 20 73 6f 72 74 20 72 65 71 75 69 72 65  nal sort require
1dde0 64 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62 44  d */.    char bD
1ddf0 69 73 74 20 3d 20 62 44 69 73 74 49 6e 69 74 3b  ist = bDistInit;
1de00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1de10 66 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68  f index cannot h
1de20 65 6c 70 20 77 69 74 68 20 44 49 53 54 49 4e 43  elp with DISTINC
1de30 54 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62 4c  T */.    char bL
1de40 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20 20 20 20  ookup = 0;      
1de50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1de60 66 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e 67  f not a covering
1de70 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 57 68   index */.    Wh
1de80 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1de90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1dea0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
1deb0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1dec0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1ded0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
1dee0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 46     WhereTerm *pF
1def0 69 72 73 74 54 65 72 6d 20 3d 20 30 3b 20 20 20  irstTerm = 0;   
1df00 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6d   /* First term m
1df10 61 74 63 68 69 6e 67 20 74 68 65 20 69 6e 64 65  atching the inde
1df20 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20  x */.#endif..   
1df30 20 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20   WHERETRACE((.  
1df40 20 20 20 20 22 20 20 20 25 73 28 25 73 29 3a 5c      "   %s(%s):\
1df50 6e 22 2c 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  n",.      pSrc->
1df60 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49  pTab->zName, (pI
1df70 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  dx ? pIdx->zName
1df80 20 3a 20 22 69 70 6b 22 29 0a 20 20 20 20 29 29   : "ipk").    ))
1df90 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 63  ;.    memset(&pc
1dfa0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 63 29 29  , 0, sizeof(pc))
1dfb0 3b 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f  ;.    pc.plan.nO
1dfc0 42 53 61 74 20 3d 20 6e 50 72 69 6f 72 53 61 74  BSat = nPriorSat
1dfd0 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  ;..    /* Determ
1dfe0 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ine the values o
1dff0 66 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 20 61 6e  f pc.plan.nEq an
1e000 64 20 6e 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20  d nInMul */.    
1e010 66 6f 72 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d  for(pc.plan.nEq=
1e020 30 3b 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3c 70  0; pc.plan.nEq<p
1e030 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Probe->nColumn; 
1e040 70 63 2e 70 6c 61 6e 2e 6e 45 71 2b 2b 29 7b 0a  pc.plan.nEq++){.
1e050 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
1e060 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  robe->aiColumn[p
1e070 63 2e 70 6c 61 6e 2e 6e 45 71 5d 3b 0a 20 20 20  c.plan.nEq];.   
1e080 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
1e090 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
1e0a0 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 65  , p->notReady, e
1e0b0 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29  qTermMask, pIdx)
1e0c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1e0d0 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
1e0e0 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
1e0f0 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f  ags |= (WHERE_CO
1e100 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f  LUMN_EQ|WHERE_RO
1e110 57 49 44 5f 45 51 29 3b 0a 20 20 20 20 20 20 74  WID_EQ);.      t
1e120 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1e130 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20 20  pWC!=pWC );.    
1e140 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
1e150 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1e160 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1e170 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
1e180 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 63  Expr;.        pc
1e190 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
1e1a0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
1e1b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
1e1c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e1d0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1e1e0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
1e1f0 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
1e200 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d 65 20   ...)":  Assume 
1e210 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72  the SELECT retur
1e220 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
1e230 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a          nInMul *
1e240 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 20 20  = 25;.          
1e250 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20 20 20  bInEst = 1;.    
1e260 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
1e270 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
1e280 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
1e290 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
1e2a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 78  .          /* "x
1e2b0 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
1e2c0 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20  e, ...)" */.    
1e2d0 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20        nInMul *= 
1e2e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1e2f0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  nExpr;.        }
1e300 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e310 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1e320 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  r & WO_ISNULL ){
1e330 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  .        pc.plan
1e340 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1e350 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
1e360 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
1e370 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1e380 33 0a 20 20 20 20 20 20 69 66 28 20 70 63 2e 70  3.      if( pc.p
1e390 6c 61 6e 2e 6e 45 71 3d 3d 30 20 26 26 20 70 50  lan.nEq==0 && pP
1e3a0 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65 20 29 20  robe->aSample ) 
1e3b0 70 46 69 72 73 74 54 65 72 6d 20 3d 20 70 54 65  pFirstTerm = pTe
1e3c0 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  rm;.#endif.     
1e3d0 20 70 63 2e 75 73 65 64 20 7c 3d 20 70 54 65 72   pc.used |= pTer
1e3e0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1e3f0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 49      }. .    /* I
1e400 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  f the index bein
1e410 67 20 63 6f 6e 73 69 64 65 72 65 64 20 69 73 20  g considered is 
1e420 55 4e 49 51 55 45 2c 20 61 6e 64 20 74 68 65 72  UNIQUE, and ther
1e430 65 20 69 73 20 61 6e 20 65 71 75 61 6c 69 74 79  e is an equality
1e440 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61   .    ** constra
1e450 69 6e 74 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75  int for all colu
1e460 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
1e470 2c 20 74 68 65 6e 20 74 68 69 73 20 73 65 61 72  , then this sear
1e480 63 68 20 77 69 6c 6c 20 66 69 6e 64 0a 20 20 20  ch will find.   
1e490 20 2a 2a 20 61 74 20 6d 6f 73 74 20 61 20 73 69   ** at most a si
1e4a0 6e 67 6c 65 20 72 6f 77 2e 20 49 6e 20 74 68 69  ngle row. In thi
1e4b0 73 20 63 61 73 65 20 73 65 74 20 74 68 65 20 57  s case set the W
1e4c0 48 45 52 45 5f 55 4e 49 51 55 45 20 66 6c 61 67  HERE_UNIQUE flag
1e4d0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   to .    ** indi
1e4e0 63 61 74 65 20 74 68 69 73 20 74 6f 20 74 68 65  cate this to the
1e4f0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a   caller..    **.
1e500 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
1e510 2c 20 69 66 20 74 68 65 20 73 65 61 72 63 68 20  , if the search 
1e520 6d 61 79 20 66 69 6e 64 20 6d 6f 72 65 20 74 68  may find more th
1e530 61 6e 20 6f 6e 65 20 72 6f 77 2c 20 74 65 73 74  an one row, test
1e540 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a   to see if.    *
1e550 2a 20 74 68 65 72 65 20 69 73 20 61 20 72 61 6e  * there is a ran
1e560 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ge constraint on
1e570 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
1e580 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 2b 31 29 20  (pc.plan.nEq+1) 
1e590 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 6e 20  that.    ** can 
1e5a0 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  be optimized usi
1e5b0 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 20 0a 20  ng the index. . 
1e5c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63     */.    if( pc
1e5d0 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 70 50 72 6f 62  .plan.nEq==pProb
1e5e0 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 50  e->nColumn && pP
1e5f0 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  robe->onError!=O
1e600 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  E_None ){.      
1e610 74 65 73 74 63 61 73 65 28 20 70 63 2e 70 6c 61  testcase( pc.pla
1e620 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1e630 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20  E_COLUMN_IN );. 
1e640 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1e650 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  c.plan.wsFlags &
1e660 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
1e670 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LL );.      if( 
1e680 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  (pc.plan.wsFlags
1e690 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
1e6a0 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
1e6b0 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20  _NULL))==0 ){.  
1e6c0 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
1e6d0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55  Flags |= WHERE_U
1e6e0 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 69  NIQUE;.        i
1e6f0 66 28 20 70 2d 3e 69 3d 3d 30 20 7c 7c 20 28 70  f( p->i==0 || (p
1e700 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
1e710 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1e720 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45  WHERE_ALL_UNIQUE
1e730 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1e740 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67    pc.plan.wsFlag
1e750 73 20 7c 3d 20 57 48 45 52 45 5f 41 4c 4c 5f 55  s |= WHERE_ALL_U
1e760 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 7d  NIQUE;.        }
1e770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1e780 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62  se if( pProbe->b
1e790 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20 29 7b 0a  Unordered==0 ){.
1e7a0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1e7b0 20 20 20 6a 20 3d 20 28 70 63 2e 70 6c 61 6e 2e     j = (pc.plan.
1e7c0 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq==pProbe->nCo
1e7d0 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20 70 50 72 6f  lumn ? -1 : pPro
1e7e0 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 63 2e  be->aiColumn[pc.
1e7f0 70 6c 61 6e 2e 6e 45 71 5d 29 3b 0a 20 20 20 20  plan.nEq]);.    
1e800 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
1e810 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e  WC, iCur, j, p->
1e820 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
1e830 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
1e840 45 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20  E, pIdx) ){.    
1e850 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1e860 54 6f 70 2c 20 2a 70 42 74 6d 3b 0a 20 20 20 20  Top, *pBtm;.    
1e870 20 20 20 20 70 54 6f 70 20 3d 20 66 69 6e 64 54      pTop = findT
1e880 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
1e890 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 57  , p->notReady, W
1e8a0 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78  O_LT|WO_LE, pIdx
1e8b0 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 6d 20  );.        pBtm 
1e8c0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1e8d0 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52  iCur, j, p->notR
1e8e0 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
1e8f0 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  E, pIdx);.      
1e900 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e    whereRangeScan
1e910 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
1e920 62 65 2c 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 2c  be, pc.plan.nEq,
1e930 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72 61   pBtm, pTop, &ra
1e940 6e 67 65 44 69 76 29 3b 0a 20 20 20 20 20 20 20  ngeDiv);.       
1e950 20 69 66 28 20 70 54 6f 70 20 29 7b 0a 20 20 20   if( pTop ){.   
1e960 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d 20         nBound = 
1e970 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e  1;.          pc.
1e980 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
1e990 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
1e9a0 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 75 73  .          pc.us
1e9b0 65 64 20 7c 3d 20 70 54 6f 70 2d 3e 70 72 65 72  ed |= pTop->prer
1e9c0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
1e9d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
1e9e0 70 2d 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20  p->pWC!=pWC );. 
1e9f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ea00 20 69 66 28 20 70 42 74 6d 20 29 7b 0a 20 20 20   if( pBtm ){.   
1ea10 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b         nBound++;
1ea20 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c  .          pc.pl
1ea30 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1ea40 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
1ea50 20 20 20 20 20 20 20 20 20 70 63 2e 75 73 65 64           pc.used
1ea60 20 7c 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65 71   |= pBtm->prereq
1ea70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
1ea80 20 74 65 73 74 63 61 73 65 28 20 70 42 74 6d 2d   testcase( pBtm-
1ea90 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20  >pWC!=pWC );.   
1eaa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1eab0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1eac0 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  = (WHERE_COLUMN_
1ead0 52 41 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57 49  RANGE|WHERE_ROWI
1eae0 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 20 20  D_RANGE);.      
1eaf0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1eb00 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1eb10 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1eb20 6e 64 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  nd the index bei
1eb30 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 77 69  ng considered wi
1eb40 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72 61  ll.    ** natura
1eb50 6c 6c 79 20 73 63 61 6e 20 72 6f 77 73 20 69 6e  lly scan rows in
1eb60 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6f 72   the required or
1eb70 64 65 72 2c 20 73 65 74 20 74 68 65 20 61 70 70  der, set the app
1eb80 72 6f 70 72 69 61 74 65 20 66 6c 61 67 73 0a 20  ropriate flags. 
1eb90 20 20 20 2a 2a 20 69 6e 20 70 63 2e 70 6c 61 6e     ** in pc.plan
1eba0 2e 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77  .wsFlags. Otherw
1ebb0 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 69 73  ise, if there is
1ebc0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1ebd0 75 73 65 20 62 75 74 0a 20 20 20 20 2a 2a 20 74  use but.    ** t
1ebe0 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 73 63  he index will sc
1ebf0 61 6e 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66  an rows in a dif
1ec00 66 65 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65  ferent order, se
1ec10 74 20 74 68 65 20 62 53 6f 72 74 0a 20 20 20 20  t the bSort.    
1ec20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
1ec30 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 26  .    if( bSort &
1ec40 26 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  & (pSrc->jointyp
1ec50 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20  e & JT_LEFT)==0 
1ec60 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 52 65  ){.      int bRe
1ec70 76 20 3d 20 32 3b 0a 20 20 20 20 20 20 57 48 45  v = 2;.      WHE
1ec80 52 45 54 52 41 43 45 28 28 22 20 20 20 20 20 20  RETRACE(("      
1ec90 2d 2d 3e 20 62 65 66 6f 72 65 20 69 73 53 6f 72  --> before isSor
1eca0 74 69 6e 67 49 6e 64 65 78 3a 20 6e 50 72 69 6f  tingIndex: nPrio
1ecb0 72 53 61 74 3d 25 64 5c 6e 22 2c 6e 50 72 69 6f  rSat=%d\n",nPrio
1ecc0 72 53 61 74 29 29 3b 0a 20 20 20 20 20 20 70 63  rSat));.      pc
1ecd0 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 69  .plan.nOBSat = i
1ece0 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 2c  sSortingIndex(p,
1ecf0 20 70 50 72 6f 62 65 2c 20 69 43 75 72 2c 20 26   pProbe, iCur, &
1ed00 62 52 65 76 29 3b 0a 20 20 20 20 20 20 57 48 45  bRev);.      WHE
1ed10 52 45 54 52 41 43 45 28 28 22 20 20 20 20 20 20  RETRACE(("      
1ed20 2d 2d 3e 20 61 66 74 65 72 20 20 69 73 53 6f 72  --> after  isSor
1ed30 74 69 6e 67 49 6e 64 65 78 3a 20 62 52 65 76 3d  tingIndex: bRev=
1ed40 25 64 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c  %d nOBSat=%d\n",
1ed50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ed60 20 20 20 62 52 65 76 2c 20 70 63 2e 70 6c 61 6e     bRev, pc.plan
1ed70 2e 6e 4f 42 53 61 74 29 29 3b 0a 20 20 20 20 20  .nOBSat));.     
1ed80 20 69 66 28 20 6e 50 72 69 6f 72 53 61 74 3c 70   if( nPriorSat<p
1ed90 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 7c 7c  c.plan.nOBSat ||
1eda0 20 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67   (pc.plan.wsFlag
1edb0 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e  s & WHERE_ALL_UN
1edc0 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  IQUE)!=0 ){.    
1edd0 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
1ede0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44  ags |= WHERE_ORD
1edf0 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ERED;.      }.  
1ee00 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79      if( nOrderBy
1ee10 3d 3d 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  ==pc.plan.nOBSat
1ee20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72   ){.        bSor
1ee30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
1ee40 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1ee50 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  = WHERE_ROWID_RA
1ee60 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  NGE|WHERE_COLUMN
1ee70 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 7d 0a  _RANGE;.      }.
1ee80 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 26        if( bRev &
1ee90 20 31 20 29 20 70 63 2e 70 6c 61 6e 2e 77 73 46   1 ) pc.plan.wsF
1eea0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
1eeb0 56 45 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  VERSE;.    }..  
1eec0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1eed0 20 61 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c   a DISTINCT qual
1eee0 69 66 69 65 72 20 61 6e 64 20 74 68 69 73 20 69  ifier and this i
1eef0 6e 64 65 78 20 77 69 6c 6c 20 73 63 61 6e 20 72  ndex will scan r
1ef00 6f 77 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 72  ows in.    ** or
1ef10 64 65 72 20 6f 66 20 74 68 65 20 44 49 53 54 49  der of the DISTI
1ef20 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  NCT expressions,
1ef30 20 63 6c 65 61 72 20 62 44 69 73 74 20 61 6e 64   clear bDist and
1ef40 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72   set the appropr
1ef50 69 61 74 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  iate.    ** flag
1ef60 73 20 69 6e 20 70 63 2e 70 6c 61 6e 2e 77 73 46  s in pc.plan.wsF
1ef70 6c 61 67 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  lags. */.    if(
1ef80 20 62 44 69 73 74 0a 20 20 20 20 20 26 26 20 69   bDist.     && i
1ef90 73 44 69 73 74 69 6e 63 74 49 6e 64 65 78 28 70  sDistinctIndex(p
1efa0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 50 72 6f  Parse, pWC, pPro
1efb0 62 65 2c 20 69 43 75 72 2c 20 70 2d 3e 70 44 69  be, iCur, p->pDi
1efc0 73 74 69 6e 63 74 2c 20 70 63 2e 70 6c 61 6e 2e  stinct, pc.plan.
1efd0 6e 45 71 29 0a 20 20 20 20 20 26 26 20 28 70 63  nEq).     && (pc
1efe0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1eff0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
1f000 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
1f010 20 62 44 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   bDist = 0;.    
1f020 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67    pc.plan.wsFlag
1f030 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  s |= WHERE_ROWID
1f040 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c  _RANGE|WHERE_COL
1f050 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
1f060 44 49 53 54 49 4e 43 54 3b 0a 20 20 20 20 7d 0a  DISTINCT;.    }.
1f070 0a 20 20 20 20 2f 2a 20 49 66 20 63 75 72 72 65  .    /* If curre
1f080 6e 74 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e 67  ntly calculating
1f090 20 74 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69   the cost of usi
1f0a0 6e 67 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74  ng an index (not
1f0b0 20 74 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20   the IPK.    ** 
1f0c0 69 6e 64 65 78 29 2c 20 64 65 74 65 72 6d 69 6e  index), determin
1f0d0 65 20 69 66 20 61 6c 6c 20 72 65 71 75 69 72 65  e if all require
1f0e0 64 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61  d column data ma
1f0f0 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 77 69  y be obtained wi
1f100 74 68 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75 73  thout .    ** us
1f110 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 74 61 62  ing the main tab
1f120 6c 65 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  le (i.e. if the 
1f130 69 6e 64 65 78 20 69 73 20 61 20 63 6f 76 65 72  index is a cover
1f140 69 6e 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ing.    ** index
1f150 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 29   for this query)
1f160 2e 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20  . If it is, set 
1f170 74 68 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  the WHERE_IDX_ON
1f180 4c 59 20 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a  LY flag in.    *
1f190 2a 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  * pc.plan.wsFlag
1f1a0 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  s. Otherwise, se
1f1b0 74 20 74 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61  t the bLookup va
1f1c0 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65 2e 20  riable to true. 
1f1d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
1f1e0 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
1f1f0 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  k m = pSrc->colU
1f200 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  sed;.      int j
1f210 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1f220 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
1f230 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1f240 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
1f250 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
1f260 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
1f270 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d  {.          m &=
1f280 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   ~(((Bitmask)1)<
1f290 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <x);.        }. 
1f2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f2b0 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m==0 ){.       
1f2c0 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73   pc.plan.wsFlags
1f2d0 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
1f2e0 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
1f2f0 0a 20 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70  .        bLookup
1f300 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1f310 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1f320 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
1f330 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f  number of rows o
1f340 66 20 6f 75 74 70 75 74 2e 20 20 46 6f 72 20 61  f output.  For a
1f350 6e 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e  n "x IN (SELECT.
1f360 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  ..)".    ** cons
1f370 74 72 61 69 6e 74 2c 20 64 6f 20 6e 6f 74 20 6c  traint, do not l
1f380 65 74 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  et the estimate 
1f390 65 78 63 65 65 64 20 68 61 6c 66 20 74 68 65 20  exceed half the 
1f3a0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1f3b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 63  e..    */.    pc
1f3c0 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 28 64 6f  .plan.nRow = (do
1f3d0 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74 5b 70  uble)(aiRowEst[p
1f3e0 63 2e 70 6c 61 6e 2e 6e 45 71 5d 20 2a 20 6e 49  c.plan.nEq] * nI
1f3f0 6e 4d 75 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  nMul);.    if( b
1f400 49 6e 45 73 74 20 26 26 20 70 63 2e 70 6c 61 6e  InEst && pc.plan
1f410 2e 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74  .nRow*2>aiRowEst
1f420 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 63 2e  [0] ){.      pc.
1f430 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 61 69 52 6f  plan.nRow = aiRo
1f440 77 45 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20 20  wEst[0]/2;.     
1f450 20 6e 49 6e 4d 75 6c 20 3d 20 28 69 6e 74 29 28   nInMul = (int)(
1f460 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f 20 61  pc.plan.nRow / a
1f470 69 52 6f 77 45 73 74 5b 70 63 2e 70 6c 61 6e 2e  iRowEst[pc.plan.
1f480 6e 45 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  nEq]);.    }..#i
1f490 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1f4a0 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 2f 2a 20  LE_STAT3.    /* 
1f4b0 49 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  If the constrain
1f4c0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
1f4d0 20 78 3d 56 41 4c 55 45 20 6f 72 20 78 20 49 4e   x=VALUE or x IN
1f4e0 20 28 45 31 2c 45 32 2c 2e 2e 2e 29 0a 20 20 20   (E1,E2,...).   
1f4f0 20 2a 2a 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f   ** and we do no
1f500 74 20 74 68 69 6e 6b 20 74 68 61 74 20 76 61 6c  t think that val
1f510 75 65 73 20 6f 66 20 78 20 61 72 65 20 75 6e 69  ues of x are uni
1f520 71 75 65 20 61 6e 64 20 69 66 20 68 69 73 74 6f  que and if histo
1f530 67 72 61 6d 0a 20 20 20 20 2a 2a 20 64 61 74 61  gram.    ** data
1f540 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   is available fo
1f550 72 20 63 6f 6c 75 6d 6e 20 78 2c 20 74 68 65 6e  r column x, then
1f560 20 69 74 20 6d 69 67 68 74 20 62 65 20 70 6f 73   it might be pos
1f570 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 6f 20  sible.    ** to 
1f580 67 65 74 20 61 20 62 65 74 74 65 72 20 65 73 74  get a better est
1f590 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 6e 75 6d  imate on the num
1f5a0 62 65 72 20 6f 66 20 72 6f 77 73 20 62 61 73 65  ber of rows base
1f5b0 64 20 6f 6e 0a 20 20 20 20 2a 2a 20 56 41 4c 55  d on.    ** VALU
1f5c0 45 20 61 6e 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e  E and how common
1f5d0 20 74 68 61 74 20 76 61 6c 75 65 20 69 73 20 61   that value is a
1f5e0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
1f5f0 68 69 73 74 6f 67 72 61 6d 2e 0a 20 20 20 20 2a  histogram..    *
1f600 2f 0a 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61  /.    if( pc.pla
1f610 6e 2e 6e 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31  n.nRow>(double)1
1f620 20 26 26 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d   && pc.plan.nEq=
1f630 3d 31 0a 20 20 20 20 20 26 26 20 70 46 69 72 73  =1.     && pFirs
1f640 74 54 65 72 6d 21 3d 30 20 26 26 20 61 69 52 6f  tTerm!=0 && aiRo
1f650 77 45 73 74 5b 31 5d 3e 31 20 29 7b 0a 20 20 20  wEst[1]>1 ){.   
1f660 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72     assert( (pFir
1f670 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1f680 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
1f690 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 21 3d 30 20  NULL|WO_IN))!=0 
1f6a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  );.      if( pFi
1f6b0 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
1f6c0 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
1f6d0 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  SNULL) ){.      
1f6e0 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69 72    testcase( pFir
1f6f0 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1f700 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
1f710 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f720 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72  FirstTerm->eOper
1f730 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20  ator & WO_EQUIV 
1f740 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f750 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d  ase( pFirstTerm-
1f760 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1f770 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1f780 20 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e    whereEqualScan
1f790 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
1f7a0 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  be, pFirstTerm->
1f7b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 0a 20  pExpr->pRight,. 
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 20 20 20 20 20 26 70 63 2e 70 6c 61           &pc.pla
1f7e0 6e 2e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d  n.nRow);.      }
1f7f0 65 6c 73 65 20 69 66 28 20 62 49 6e 45 73 74 3d  else if( bInEst=
1f800 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1f810 73 65 72 74 28 20 70 46 69 72 73 74 54 65 72 6d  sert( pFirstTerm
1f820 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1f830 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 77  _IN );.        w
1f840 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50  hereInScanEst(pP
1f850 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46  arse, pProbe, pF
1f860 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d  irstTerm->pExpr-
1f870 3e 78 2e 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  >x.pList,.      
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 26 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 3b   &pc.plan.nRow);
1f8a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
1f8b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f8c0 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a  ENABLE_STAT3 */.
1f8d0 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 74  .    /* Adjust t
1f8e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
1f8f0 70 75 74 20 72 6f 77 73 20 61 6e 64 20 64 6f 77  put rows and dow
1f900 6e 77 61 72 64 20 74 6f 20 72 65 66 6c 65 63 74  nward to reflect
1f910 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68 61   rows.    ** tha
1f920 74 20 61 72 65 20 65 78 63 6c 75 64 65 64 20 62  t are excluded b
1f930 79 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  y range constrai
1f940 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
1f950 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 70  pc.plan.nRow = p
1f960 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2f 72 61 6e 67  c.plan.nRow/rang
1f970 65 44 69 76 3b 0a 20 20 20 20 69 66 28 20 70 63  eDiv;.    if( pc
1f980 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 31 20 29 20 70  .plan.nRow<1 ) p
1f990 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 31 3b  c.plan.nRow = 1;
1f9a0 0a 0a 20 20 20 20 2f 2a 20 45 78 70 65 72 69 6d  ..    /* Experim
1f9b0 65 6e 74 73 20 72 75 6e 20 6f 6e 20 72 65 61 6c  ents run on real
1f9c0 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
1f9d0 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  s show that the 
1f9e0 74 69 6d 65 20 6e 65 65 64 65 64 0a 20 20 20 20  time needed.    
1f9f0 2a 2a 20 74 6f 20 64 6f 20 61 20 62 69 6e 61 72  ** to do a binar
1fa00 79 20 73 65 61 72 63 68 20 74 6f 20 6c 6f 63 61  y search to loca
1fa10 74 65 20 61 20 72 6f 77 20 69 6e 20 61 20 74 61  te a row in a ta
1fa20 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20  ble or index is 
1fa30 72 6f 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20 6c  roughly.    ** l
1fa40 6f 67 31 30 28 4e 29 20 74 69 6d 65 73 20 74 68  og10(N) times th
1fa50 65 20 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20 66  e time to move f
1fa60 72 6f 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20 74  rom one row to t
1fa70 68 65 20 6e 65 78 74 20 72 6f 77 20 77 69 74 68  he next row with
1fa80 69 6e 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c  in.    ** a tabl
1fa90 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68 65  e or index.  The
1faa0 20 61 63 74 75 61 6c 20 74 69 6d 65 73 20 63 61   actual times ca
1fab0 6e 20 76 61 72 79 2c 20 77 69 74 68 20 74 68 65  n vary, with the
1fac0 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20   size of.    ** 
1fad0 72 65 63 6f 72 64 73 20 62 65 69 6e 67 20 61 6e  records being an
1fae0 20 69 6d 70 6f 72 74 61 6e 74 20 66 61 63 74 6f   important facto
1faf0 72 2e 20 20 42 6f 74 68 20 6d 6f 76 65 73 20 61  r.  Both moves a
1fb00 6e 64 20 73 65 61 72 63 68 65 73 20 61 72 65 0a  nd searches are.
1fb10 20 20 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77 69      ** slower wi
1fb20 74 68 20 6c 61 72 67 65 72 20 72 65 63 6f 72 64  th larger record
1fb30 73 2c 20 70 72 65 73 75 6d 61 62 6c 79 20 62 65  s, presumably be
1fb40 63 61 75 73 65 20 66 65 77 65 72 20 72 65 63 6f  cause fewer reco
1fb50 72 64 73 20 66 69 74 0a 20 20 20 20 2a 2a 20 6f  rds fit.    ** o
1fb60 6e 20 6f 6e 65 20 70 61 67 65 20 61 6e 64 20 68  n one page and h
1fb70 65 6e 63 65 20 6d 6f 72 65 20 70 61 67 65 73 20  ence more pages 
1fb80 68 61 76 65 20 74 6f 20 62 65 20 66 65 74 63 68  have to be fetch
1fb90 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1fba0 2a 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  * The ANALYZE co
1fbb0 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 73 71  mmand and the sq
1fbc0 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73  lite_stat1 and s
1fbd0 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62 6c  qlite_stat3 tabl
1fbe0 65 73 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  es do.    ** not
1fbf0 20 67 69 76 65 20 75 73 20 64 61 74 61 20 6f 6e   give us data on
1fc00 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69   the relative si
1fc10 7a 65 73 20 6f 66 20 74 61 62 6c 65 20 61 6e 64  zes of table and
1fc20 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 0a   index records..
1fc30 20 20 20 20 2a 2a 20 53 6f 20 74 68 69 73 20 63      ** So this c
1fc40 6f 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 75 6d  omputation assum
1fc50 65 73 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73  es table records
1fc60 20 61 72 65 20 61 62 6f 75 74 20 74 77 69 63 65   are about twice
1fc70 20 61 73 20 62 69 67 0a 20 20 20 20 2a 2a 20 61   as big.    ** a
1fc80 73 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  s index records.
1fc90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1fca0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26  pc.plan.wsFlags&
1fcb0 7e 28 57 48 45 52 45 5f 52 45 56 45 52 53 45 7c  ~(WHERE_REVERSE|
1fcc0 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 29 3d  WHERE_ORDERED))=
1fcd0 3d 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 0a  =WHERE_IDX_ONLY.
1fce0 20 20 20 20 20 26 26 20 28 70 57 43 2d 3e 77 63       && (pWC->wc
1fcf0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1fd00 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
1fd10 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c  )==0.     && sql
1fd20 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1fd30 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 26 26  .bUseCis.     &&
1fd40 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
1fd50 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
1fd60 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78   SQLITE_CoverIdx
1fd70 53 63 61 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  Scan).    ){.   
1fd80 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
1fd90 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66   is not useful f
1fda0 6f 72 20 69 6e 64 65 78 69 6e 67 2c 20 62 75 74  or indexing, but
1fdb0 20 69 74 20 69 73 20 61 20 63 6f 76 65 72 69 6e   it is a coverin
1fdc0 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a  g index..      *
1fdd0 2a 20 41 20 66 75 6c 6c 2d 73 63 61 6e 20 6f 66  * A full-scan of
1fde0 20 74 68 65 20 69 6e 64 65 78 20 6d 69 67 68 74   the index might
1fdf0 20 62 65 20 61 20 6c 69 74 74 6c 65 20 66 61 73   be a little fas
1fe00 74 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 2d  ter than a full-
1fe10 73 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 66  scan.      ** of
1fe20 20 74 68 65 20 74 61 62 6c 65 2c 20 73 6f 20 67   the table, so g
1fe30 69 76 65 20 74 68 69 73 20 63 61 73 65 20 61 20  ive this case a 
1fe40 63 6f 73 74 20 73 6c 69 67 68 74 6c 79 20 6c 65  cost slightly le
1fe50 73 73 20 74 68 61 6e 20 61 20 74 61 62 6c 65 0a  ss than a table.
1fe60 20 20 20 20 20 20 2a 2a 20 73 63 61 6e 2e 20 2a        ** scan. *
1fe70 2f 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74  /.      pc.rCost
1fe80 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a 33   = aiRowEst[0]*3
1fe90 20 2b 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   + pProbe->nColu
1fea0 6d 6e 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c 61  mn;.      pc.pla
1feb0 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  n.wsFlags |= WHE
1fec0 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 7c 57 48  RE_COVER_SCAN|WH
1fed0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1fee0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1fef0 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  (pc.plan.wsFlags
1ff00 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
1ff10 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  LSCAN)==0 ){.   
1ff20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
1ff30 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  f a full table s
1ff40 63 61 6e 20 69 73 20 61 20 6e 75 6d 62 65 72 20  can is a number 
1ff50 6f 66 20 6d 6f 76 65 20 6f 70 65 72 61 74 69 6f  of move operatio
1ff60 6e 73 20 65 71 75 61 6c 0a 20 20 20 20 20 20 2a  ns equal.      *
1ff70 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  * to the number 
1ff80 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1ff90 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  able..      **. 
1ffa0 20 20 20 20 20 2a 2a 20 57 65 20 61 64 64 20 61       ** We add a
1ffb0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 34 78 20  n additional 4x 
1ffc0 70 65 6e 61 6c 74 79 20 74 6f 20 66 75 6c 6c 20  penalty to full 
1ffd0 74 61 62 6c 65 20 73 63 61 6e 73 2e 20 20 54 68  table scans.  Th
1ffe0 69 73 20 63 61 75 73 65 73 0a 20 20 20 20 20 20  is causes.      
1fff0 2a 2a 20 74 68 65 20 63 6f 73 74 20 66 75 6e 63  ** the cost func
20000 74 69 6f 6e 20 74 6f 20 65 72 72 20 6f 6e 20 74  tion to err on t
20010 68 65 20 73 69 64 65 20 6f 66 20 63 68 6f 6f 73  he side of choos
20020 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f 76 65  ing an index ove
20030 72 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73  r.      ** choos
20040 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e 2e  ing a full scan.
20050 20 20 54 68 69 73 20 34 78 20 66 75 6c 6c 2d 73    This 4x full-s
20060 63 61 6e 20 70 65 6e 61 6c 74 79 20 69 73 20 61  can penalty is a
20070 6e 20 61 72 67 75 61 62 6c 65 0a 20 20 20 20 20  n arguable.     
20080 20 2a 2a 20 64 65 63 69 73 69 6f 6e 20 61 6e 64   ** decision and
20090 20 6f 6e 65 20 77 68 69 63 68 20 77 65 20 65 78   one which we ex
200a0 70 65 63 74 20 74 6f 20 72 65 76 69 73 69 74 20  pect to revisit 
200b0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 20  in the future.  
200c0 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  But.      ** it 
200d0 73 65 65 6d 73 20 74 6f 20 62 65 20 77 6f 72 6b  seems to be work
200e0 69 6e 67 20 77 65 6c 6c 20 65 6e 6f 75 67 68 20  ing well enough 
200f0 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a 20  at the moment.. 
20100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 63       */.      pc
20110 2e 72 43 6f 73 74 20 3d 20 61 69 52 6f 77 45 73  .rCost = aiRowEs
20120 74 5b 30 5d 2a 34 3b 0a 20 20 20 20 20 20 70 63  t[0]*4;.      pc
20130 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d  .plan.wsFlags &=
20140 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   ~WHERE_IDX_ONLY
20150 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
20160 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63 2e 70   ){.        pc.p
20170 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e  lan.wsFlags &= ~
20180 57 48 45 52 45 5f 4f 52 44 45 52 45 44 3b 0a 20  WHERE_ORDERED;. 
20190 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e         pc.plan.n
201a0 4f 42 53 61 74 20 3d 20 6e 50 72 69 6f 72 53 61  OBSat = nPriorSa
201b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
201c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 31  else{.      log1
201d0 30 4e 20 3d 20 65 73 74 4c 6f 67 28 61 69 52 6f  0N = estLog(aiRo
201e0 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20  wEst[0]);.      
201f0 70 63 2e 72 43 6f 73 74 20 3d 20 70 63 2e 70 6c  pc.rCost = pc.pl
20200 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69  an.nRow;.      i
20210 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
20220 20 20 20 69 66 28 20 62 4c 6f 6f 6b 75 70 20 29     if( bLookup )
20230 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  {.          /* F
20240 6f 72 20 61 6e 20 69 6e 64 65 78 20 6c 6f 6f 6b  or an index look
20250 75 70 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  up followed by a
20260 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a 20   table lookup:. 
20270 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e           **    n
20280 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72  InMul index sear
20290 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65  ches to find the
202a0 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 69   start of each i
202b0 6e 64 65 78 20 72 61 6e 67 65 0a 20 20 20 20 20  ndex range.     
202c0 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20       **  + nRow 
202d0 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68  steps through th
202e0 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  e index.        
202f0 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74 61 62    **  + nRow tab
20300 6c 65 20 73 65 61 72 63 68 65 73 20 74 6f 20 6c  le searches to l
20310 6f 6f 6b 75 70 20 74 68 65 20 74 61 62 6c 65 20  ookup the table 
20320 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
20330 72 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20  rowid.          
20340 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e  */.          pc.
20350 72 43 6f 73 74 20 2b 3d 20 28 6e 49 6e 4d 75 6c  rCost += (nInMul
20360 20 2b 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29   + pc.plan.nRow)
20370 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20  *log10N;.       
20380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20390 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 76 65 72    /* For a cover
203a0 69 6e 67 20 69 6e 64 65 78 3a 0a 20 20 20 20 20  ing index:.     
203b0 20 20 20 20 20 2a 2a 20 20 20 20 20 6e 49 6e 4d       **     nInM
203c0 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68 65  ul index searche
203d0 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e  s to find the in
203e0 69 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  itial entry .   
203f0 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 6e 52         **   + nR
20400 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68  ow steps through
20410 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
20420 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
20430 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 6e 49    pc.rCost += nI
20440 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20  nMul*log10N;.   
20450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
20460 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46  se{.        /* F
20470 6f 72 20 61 20 72 6f 77 69 64 20 70 72 69 6d 61  or a rowid prima
20480 72 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a 20  ry key lookup:. 
20490 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e         **    nIn
204a0 4d 75 6c 74 20 74 61 62 6c 65 20 73 65 61 72 63  Mult table searc
204b0 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  hes to find the 
204c0 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 66 6f  initial entry fo
204d0 72 20 65 61 63 68 20 72 61 6e 67 65 0a 20 20 20  r each range.   
204e0 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20       **  + nRow 
204f0 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68  steps through th
20500 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  e table.        
20510 2a 2f 0a 20 20 20 20 20 20 20 20 70 63 2e 72 43  */.        pc.rC
20520 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f  ost += nInMul*lo
20530 67 31 30 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  g10N;.      }.  
20540 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
20550 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  in the estimated
20560 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
20570 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 41 63   the result.  Ac
20580 74 75 61 6c 20 65 78 70 65 72 69 6d 65 6e 74 61  tual experimenta
20590 6c 0a 20 20 20 20 2a 2a 20 6d 65 61 73 75 72 65  l.    ** measure
205a0 6d 65 6e 74 73 20 6f 66 20 73 6f 72 74 69 6e 67  ments of sorting
205b0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e 20   performance in 
205c0 53 51 4c 69 74 65 20 73 68 6f 77 20 74 68 61 74  SQLite show that
205d0 20 73 6f 72 74 69 6e 67 20 74 69 6d 65 0a 20 20   sorting time.  
205e0 20 20 2a 2a 20 61 64 64 73 20 43 2a 4e 2a 6c 6f    ** adds C*N*lo
205f0 67 31 30 28 4e 29 20 74 6f 20 74 68 65 20 63 6f  g10(N) to the co
20600 73 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74  st, where N is t
20610 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
20620 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
20630 73 6f 72 74 65 64 20 61 6e 64 20 43 20 69 73 20  sorted and C is 
20640 61 20 66 61 63 74 6f 72 20 62 65 74 77 65 65 6e  a factor between
20650 20 31 2e 39 35 20 61 6e 64 20 34 2e 33 2e 20 20   1.95 and 4.3.  
20660 57 65 20 77 69 6c 6c 20 73 70 6c 69 74 20 74 68  We will split th
20670 65 0a 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65  e.    ** differe
20680 6e 63 65 20 61 6e 64 20 73 65 6c 65 63 74 20 43  nce and select C
20690 20 6f 66 20 33 2e 30 2e 0a 20 20 20 20 2a 2f 0a   of 3.0..    */.
206a0 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 29 7b      if( bSort ){
206b0 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6d 20  .      double m 
206c0 3d 20 65 73 74 4c 6f 67 28 70 63 2e 70 6c 61 6e  = estLog(pc.plan
206d0 2e 6e 52 6f 77 2a 28 6e 4f 72 64 65 72 42 79 20  .nRow*(nOrderBy 
206e0 2d 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  - pc.plan.nOBSat
206f0 29 2f 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  )/nOrderBy);.   
20700 20 20 20 6d 20 2a 3d 20 28 64 6f 75 62 6c 65 29     m *= (double)
20710 28 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20  (pc.plan.nOBSat 
20720 3f 20 32 20 3a 20 33 29 3b 0a 20 20 20 20 20 20  ? 2 : 3);.      
20730 70 63 2e 72 43 6f 73 74 20 2b 3d 20 70 63 2e 70  pc.rCost += pc.p
20740 6c 61 6e 2e 6e 52 6f 77 2a 6d 3b 0a 20 20 20 20  lan.nRow*m;.    
20750 7d 0a 20 20 20 20 69 66 28 20 62 44 69 73 74 20  }.    if( bDist 
20760 29 7b 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73  ){.      pc.rCos
20770 74 20 2b 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f  t += pc.plan.nRo
20780 77 2a 65 73 74 4c 6f 67 28 70 63 2e 70 6c 61 6e  w*estLog(pc.plan
20790 2e 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d 0a  .nRow)*3;.    }.
207a0 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20  .    /**** Cost 
207b0 6f 66 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e  of using this in
207c0 64 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65 6e  dex has now been
207d0 20 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a   computed ****/.
207e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
207f0 20 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   are additional 
20800 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74  constraints on t
20810 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 63  his table that c
20820 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20  annot.    ** be 
20830 75 73 65 64 20 77 69 74 68 20 74 68 65 20 63 75  used with the cu
20840 72 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75 74  rrent index, but
20850 20 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f 77   which might low
20860 65 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  er the number.  
20870 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72    ** of output r
20880 6f 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65 20  ows, adjust the 
20890 6e 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f 72  nRow value accor
208a0 64 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e  dingly.  This on
208b0 6c 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65  ly .    ** matte
208c0 72 73 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  rs if the curren
208d0 74 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 6c  t index is the l
208e0 65 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20  east costly, so 
208f0 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20  do not bother.  
20900 20 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20 73    ** with this s
20910 74 65 70 20 69 66 20 77 65 20 61 6c 72 65 61 64  tep if we alread
20920 79 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64 65  y know this inde
20930 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68  x will not be ch
20940 6f 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73  osen..    ** Als
20950 6f 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  o, never reduce 
20960 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63  the output row c
20970 6f 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73 69  ount below 2 usi
20980 6e 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20 20  ng this step..  
20990 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69    **.    ** It i
209a0 73 20 63 72 69 74 69 63 61 6c 20 74 68 61 74 20  s critical that 
209b0 74 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73  the notValid mas
209c0 6b 20 62 65 20 75 73 65 64 20 68 65 72 65 20 69  k be used here i
209d0 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
209e0 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d 61   the notReady ma
209f0 73 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75 74  sk.  When comput
20a00 69 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22  ing an "optimal"
20a10 20 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74 52   index, the notR
20a20 65 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b  eady.    ** mask
20a30 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20   will only have 
20a40 6f 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74 68  one bit set - th
20a50 65 20 62 69 74 20 66 6f 72 20 74 68 65 20 63 75  e bit for the cu
20a60 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20  rrent table..   
20a70 20 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69 64   ** The notValid
20a80 20 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74   mask, on the ot
20a90 68 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79 73  her hand, always
20aa0 20 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73 65   has all bits se
20ab0 74 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  t for.    ** tab
20ac0 6c 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  les that are not
20ad0 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e   in outer loops.
20ae0 20 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69 73    If notReady is
20af0 20 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65   used here inste
20b00 61 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74  ad.    ** of not
20b10 56 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f 70  Valid, then a op
20b20 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74  timal index that
20b30 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65   depends on inne
20b40 72 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20  r joins loops.  
20b50 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 65    ** might be se
20b60 6c 65 63 74 65 64 20 65 76 65 6e 20 77 68 65 6e  lected even when
20b70 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 6e   there exists an
20b80 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74   optimal index t
20b90 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e  hat has.    ** n
20ba0 6f 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e 63  o such dependenc
20bb0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
20bc0 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 32  ( pc.plan.nRow>2
20bd0 20 26 26 20 70 63 2e 72 43 6f 73 74 3c 3d 70 2d   && pc.rCost<=p-
20be0 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a 20  >cost.rCost ){. 
20bf0 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c10 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20c20 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  r */.      int n
20c30 53 6b 69 70 45 71 20 3d 20 70 63 2e 70 6c 61 6e  SkipEq = pc.plan
20c40 2e 6e 45 71 3b 20 20 20 2f 2a 20 4e 75 6d 62 65  .nEq;   /* Numbe
20c50 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69  r of == constrai
20c60 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  nts to skip */. 
20c70 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 52 61       int nSkipRa
20c80 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20 20  nge = nBound;   
20c90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3c    /* Number of <
20ca0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
20cb0 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 42 69  skip */.      Bi
20cc0 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b 20 20  tmask thisTab;  
20cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
20ce0 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20 2a 2f  tmap for pSrc */
20cf0 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61 62 20  ..      thisTab 
20d00 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70  = getMask(pWC->p
20d10 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
20d20 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
20d30 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e  pWC->a, k=pWC->n
20d40 54 65 72 6d 3b 20 70 63 2e 70 6c 61 6e 2e 6e 52  Term; pc.plan.nR
20d50 6f 77 3e 32 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20  ow>2 && k; k--, 
20d60 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
20d70 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
20d80 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
20d90 55 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UAL ) continue;.
20da0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
20db0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
20dc0 70 2d 3e 6e 6f 74 56 61 6c 69 64 29 21 3d 74 68  p->notValid)!=th
20dd0 69 73 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  isTab ) continue
20de0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
20df0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
20e00 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f   (WO_EQ|WO_IN|WO
20e10 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  _ISNULL) ){.    
20e20 20 20 20 20 20 20 69 66 28 20 6e 53 6b 69 70 45        if( nSkipE
20e30 71 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  q ){.           
20e40 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 66   /* Ignore the f
20e50 69 72 73 74 20 70 63 2e 70 6c 61 6e 2e 6e 45 71  irst pc.plan.nEq
20e60 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 65   equality matche
20e70 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65  s since the inde
20e80 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  x.            **
20e90 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63   has already acc
20ea0 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65  ounted for these
20eb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20ec0 6e 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20  nSkipEq--;.     
20ed0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20ee0 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
20ef0 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  e each additiona
20f00 6c 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68  l equality match
20f10 20 72 65 64 75 63 65 73 20 74 68 65 20 72 65 73   reduces the res
20f20 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ult.            
20f30 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20 61  ** set size by a
20f40 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f   factor of 10 */
20f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 63 2e  .            pc.
20f60 70 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 31 30 3b  plan.nRow /= 10;
20f70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20f80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
20f90 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
20fa0 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  & (WO_LT|WO_LE|W
20fb0 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
20fc0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53 6b           if( nSk
20fd0 69 70 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 20  ipRange ){.     
20fe0 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65         /* Ignore
20ff0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
21000 52 61 6e 67 65 20 72 61 6e 67 65 20 63 6f 6e 73  Range range cons
21010 74 72 61 69 6e 74 73 20 73 69 6e 63 65 20 74 68  traints since th
21020 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  e index.        
21030 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
21040 64 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f 72  dy accounted for
21050 20 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20 20   these */.      
21060 20 20 20 20 20 20 6e 53 6b 69 70 52 61 6e 67 65        nSkipRange
21070 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  --;.          }e
21080 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
21090 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63 68 20   /* Assume each 
210a0 61 64 64 69 74 69 6f 6e 61 6c 20 72 61 6e 67 65  additional range
210b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75   constraint redu
210c0 63 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20  ces the result. 
210d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65             ** se
210e0 74 20 73 69 7a 65 20 62 79 20 61 20 66 61 63 74  t size by a fact
210f0 6f 72 20 6f 66 20 33 2e 20 20 49 6e 64 65 78 65  or of 3.  Indexe
21100 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  d range constrai
21110 6e 74 73 20 72 65 64 75 63 65 0a 20 20 20 20 20  nts reduce.     
21120 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65         ** the se
21130 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
21140 6c 61 72 67 65 72 20 66 61 63 74 6f 72 3a 20 34  larger factor: 4
21150 2e 20 20 57 65 20 6d 61 6b 65 20 69 6e 64 65 78  .  We make index
21160 65 64 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20  ed range.       
21170 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 73 65 6c       ** more sel
21180 65 63 74 69 76 65 20 69 6e 74 65 6e 74 69 6f 6e  ective intention
21190 61 6c 6c 79 20 62 65 63 61 75 73 65 20 6f 66 20  ally because of 
211a0 74 68 65 20 73 75 62 6a 65 63 74 69 76 65 20 0a  the subjective .
211b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
211c0 62 73 65 72 76 61 74 69 6f 6e 20 74 68 61 74 20  bservation that 
211d0 69 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63 6f  indexed range co
211e0 6e 73 74 72 61 69 6e 74 73 20 72 65 61 6c 6c 79  nstraints really
211f0 20 61 72 65 20 6d 6f 72 65 0a 20 20 20 20 20 20   are more.      
21200 20 20 20 20 20 20 2a 2a 20 73 65 6c 65 63 74 69        ** selecti
21210 76 65 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20  ve in practice, 
21220 6f 6e 20 61 76 65 72 61 67 65 2e 20 2a 2f 0a 20  on average. */. 
21230 20 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c             pc.pl
21240 61 6e 2e 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20  an.nRow /= 3;.  
21250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21260 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
21270 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
21280 57 4f 5f 4e 4f 4f 50 29 3d 3d 30 20 29 7b 0a 20  WO_NOOP)==0 ){. 
21290 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79 20           /* Any 
212a0 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
212b0 20 6c 6f 77 65 72 73 20 74 68 65 20 6f 75 74 70   lowers the outp
212c0 75 74 20 72 6f 77 20 63 6f 75 6e 74 20 62 79 20  ut row count by 
212d0 68 61 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20  half */.        
212e0 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f    pc.plan.nRow /
212f0 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 2;.        }. 
21300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21310 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 32 20   pc.plan.nRow<2 
21320 29 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d  ) pc.plan.nRow =
21330 20 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20   2;.    }...    
21340 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20 20  WHERETRACE((.   
21350 20 20 20 22 20 20 20 20 20 20 6e 45 71 3d 25 64     "      nEq=%d
21360 20 6e 49 6e 4d 75 6c 3d 25 64 20 72 61 6e 67 65   nInMul=%d range
21370 44 69 76 3d 25 64 20 62 53 6f 72 74 3d 25 64 20  Div=%d bSort=%d 
21380 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73 46 6c 61  bLookup=%d wsFla
21390 67 73 3d 30 78 25 30 38 78 5c 6e 22 0a 20 20 20  gs=0x%08x\n".   
213a0 20 20 20 22 20 20 20 20 20 20 6e 6f 74 52 65 61     "      notRea
213b0 64 79 3d 30 78 25 6c 6c 78 20 6c 6f 67 31 30 4e  dy=0x%llx log10N
213c0 3d 25 2e 31 66 20 6e 52 6f 77 3d 25 2e 31 66 20  =%.1f nRow=%.1f 
213d0 63 6f 73 74 3d 25 2e 31 66 5c 6e 22 0a 20 20 20  cost=%.1f\n".   
213e0 20 20 20 22 20 20 20 20 20 20 75 73 65 64 3d 30     "      used=0
213f0 78 25 6c 6c 78 20 6e 4f 42 53 61 74 3d 25 64 5c  x%llx nOBSat=%d\
21400 6e 22 2c 0a 20 20 20 20 20 20 70 63 2e 70 6c 61  n",.      pc.pla
21410 6e 2e 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20 28  n.nEq, nInMul, (
21420 69 6e 74 29 72 61 6e 67 65 44 69 76 2c 20 62 53  int)rangeDiv, bS
21430 6f 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 70 63  ort, bLookup, pc
21440 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 0a 20  .plan.wsFlags,. 
21450 20 20 20 20 20 70 2d 3e 6e 6f 74 52 65 61 64 79       p->notReady
21460 2c 20 6c 6f 67 31 30 4e 2c 20 70 63 2e 70 6c 61  , log10N, pc.pla
21470 6e 2e 6e 52 6f 77 2c 20 70 63 2e 72 43 6f 73 74  n.nRow, pc.rCost
21480 2c 20 70 63 2e 75 73 65 64 2c 0a 20 20 20 20 20  , pc.used,.     
21490 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 0a   pc.plan.nOBSat.
214a0 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f 2a 20      ));..    /* 
214b0 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  If this index is
214c0 20 74 68 65 20 62 65 73 74 20 77 65 20 68 61 76   the best we hav
214d0 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c 20 74  e seen so far, t
214e0 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69 73 0a  hen record this.
214f0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64      ** index and
21500 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74 68 65   its cost in the
21510 20 70 2d 3e 63 6f 73 74 20 73 74 72 75 63 74 75   p->cost structu
21520 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
21530 66 28 20 28 21 70 49 64 78 20 7c 7c 20 70 63 2e  f( (!pIdx || pc.
21540 70 6c 61 6e 2e 77 73 46 6c 61 67 73 29 20 26 26  plan.wsFlags) &&
21550 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 26 70 63   compareCost(&pc
21560 2c 20 26 70 2d 3e 63 6f 73 74 29 20 29 7b 0a 20  , &p->cost) ){. 
21570 20 20 20 20 20 70 2d 3e 63 6f 73 74 20 3d 20 70       p->cost = p
21580 63 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74  c;.      p->cost
21590 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d  .plan.wsFlags &=
215a0 20 77 73 46 6c 61 67 4d 61 73 6b 3b 0a 20 20 20   wsFlagMask;.   
215b0 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e     p->cost.plan.
215c0 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  u.pIdx = pIdx;. 
215d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
215e0 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
215f0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
21600 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f  then only that o
21610 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ne index is.    
21620 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a  ** considered. *
21630 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
21640 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a  pIndex ) break;.
21650 0a 20 20 20 20 2f 2a 20 52 65 73 65 74 20 6d 61  .    /* Reset ma
21660 73 6b 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  sks for the next
21670 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f   index in the lo
21680 6f 70 20 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67  op */.    wsFlag
21690 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52  Mask = ~(WHERE_R
216a0 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
216b0 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20  WID_RANGE);.    
216c0 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78  eqTermMask = idx
216d0 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a  EqTermMask;.  }.
216e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
216f0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
21700 61 75 73 65 20 61 6e 64 20 74 68 65 20 53 51 4c  ause and the SQL
21710 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
21720 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65   flag.  ** is se
21730 74 2c 20 74 68 65 6e 20 72 65 76 65 72 73 65 20  t, then reverse 
21740 74 68 65 20 6f 72 64 65 72 20 74 68 61 74 20 74  the order that t
21750 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65  he index will be
21760 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e   scanned.  ** in
21770 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66  . This is used f
21780 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74  or application t
21790 65 73 74 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20  esting, to help 
217a0 66 69 6e 64 20 63 61 73 65 73 0a 20 20 2a 2a 20  find cases.  ** 
217b0 77 68 65 72 65 20 61 70 70 6c 69 63 61 74 69 6f  where applicatio
217c0 6e 20 62 65 68 61 76 69 6f 75 72 20 64 65 70 65  n behaviour depe
217d0 6e 64 73 20 6f 6e 20 74 68 65 20 28 75 6e 64 65  nds on the (unde
217e0 66 69 6e 65 64 29 20 6f 72 64 65 72 20 74 68 61  fined) order tha
217f0 74 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 6f 75  t.  ** SQLite ou
21800 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 69 6e  tputs rows in in
21810 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
21820 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
21830 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  se.  */.  if( !p
21840 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 50  ->pOrderBy && pP
21850 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
21860 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  & SQLITE_Reverse
21870 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 70 2d 3e  Order ){.    p->
21880 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
21890 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52  s |= WHERE_REVER
218a0 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  SE;.  }..  asser
218b0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 7c  t( p->pOrderBy |
218c0 7c 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e  | (p->cost.plan.
218d0 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  wsFlags&WHERE_OR
218e0 44 45 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 61  DERED)==0 );.  a
218f0 73 73 65 72 74 28 20 70 2d 3e 63 6f 73 74 2e 70  ssert( p->cost.p
21900 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 7c 7c  lan.u.pIdx==0 ||
21910 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77   (p->cost.plan.w
21920 73 46 6c 61 67 73 26 57 48 45 52 45 5f 52 4f 57  sFlags&WHERE_ROW
21930 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a 20 20 61  ID_EQ)==0 );.  a
21940 73 73 65 72 74 28 20 70 53 72 63 2d 3e 70 49 6e  ssert( pSrc->pIn
21950 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  dex==0 .       |
21960 7c 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75  | p->cost.plan.u
21970 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20 20 20 20  .pIdx==0 .      
21980 20 7c 7c 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e   || p->cost.plan
21990 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d 3e 70  .u.pIdx==pSrc->p
219a0 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20 20 57  Index .  );..  W
219b0 48 45 52 45 54 52 41 43 45 28 28 22 20 20 20 62  HERETRACE(("   b
219c0 65 73 74 20 69 6e 64 65 78 20 69 73 20 25 73 20  est index is %s 
219d0 63 6f 73 74 3d 25 2e 31 66 5c 6e 22 2c 0a 20 20  cost=%.1f\n",.  
219e0 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70         p->cost.p
219f0 6c 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70 2d 3e  lan.u.pIdx ? p->
21a00 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
21a10 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 2c  ->zName : "ipk",
21a20 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73  .         p->cos
21a30 74 2e 72 43 6f 73 74 29 29 3b 0a 20 20 0a 20 20  t.rCost));.  .  
21a40 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
21a50 78 28 70 29 3b 0a 20 20 62 65 73 74 41 75 74 6f  x(p);.  bestAuto
21a60 6d 61 74 69 63 49 6e 64 65 78 28 70 29 3b 0a 20  maticIndex(p);. 
21a70 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73   p->cost.plan.ws
21a80 46 6c 61 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d  Flags |= eqTermM
21a90 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  ask;.}../*.** Fi
21aa0 6e 64 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  nd the query pla
21ab0 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  n for accessing 
21ac0 74 61 62 6c 65 20 70 53 72 63 2d 3e 70 54 61 62  table pSrc->pTab
21ad0 2e 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62  . Write the.** b
21ae0 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61  est query plan a
21af0 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f  nd its cost into
21b00 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f   the WhereCost o
21b10 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20 0a  bject supplied .
21b20 2a 2a 20 61 73 20 74 68 65 20 6c 61 73 74 20 70  ** as the last p
21b30 61 72 61 6d 65 74 65 72 2e 20 54 68 69 73 20 66  arameter. This f
21b40 75 6e 63 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63  unction may calc
21b50 75 6c 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f  ulate the cost o
21b60 66 0a 2a 2a 20 62 6f 74 68 20 72 65 61 6c 20 61  f.** both real a
21b70 6e 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  nd virtual table
21b80 20 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   scans..**.** Th
21b90 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
21ba0 20 6e 6f 74 20 74 61 6b 65 20 4f 52 44 45 52 20   not take ORDER 
21bb0 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 69  BY or DISTINCT i
21bc0 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 20 20 4e 6f  nto account.  No
21bd0 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 72 65 6d  r.** does it rem
21be0 65 6d 62 65 72 20 74 68 65 20 76 69 72 74 75 61  ember the virtua
21bf0 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20 70 6c  l table query pl
21c00 61 6e 2e 20 20 41 6c 6c 20 69 74 20 64 6f 65 73  an.  All it does
21c10 20 69 73 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   is compute.** t
21c20 68 65 20 63 6f 73 74 20 77 68 69 6c 65 20 64 65  he cost while de
21c30 74 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 6e 20  termining if an 
21c40 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR optimization 
21c50 69 73 20 61 70 70 6c 69 63 61 62 6c 65 2e 20 20  is applicable.  
21c60 54 68 65 0a 2a 2a 20 64 65 74 61 69 6c 73 20 77  The.** details w
21c70 69 6c 6c 20 62 65 20 72 65 63 6f 6e 73 69 64 65  ill be reconside
21c80 72 65 64 20 6c 61 74 65 72 20 69 66 20 74 68 65  red later if the
21c90 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
21ca0 20 66 6f 75 6e 64 20 74 6f 20 62 65 0a 2a 2a 20   found to be.** 
21cb0 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2f 0a 73  applicable..*/.s
21cc0 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49  tatic void bestI
21cd0 6e 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64  ndex(WhereBestId
21ce0 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  x *p){.#ifndef S
21cf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
21d00 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
21d10 56 69 72 74 75 61 6c 28 70 2d 3e 70 53 72 63 2d  Virtual(p->pSrc-
21d20 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  >pTab) ){.    sq
21d30 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
21d40 20 2a 70 49 64 78 49 6e 66 6f 20 3d 20 30 3b 0a   *pIdxInfo = 0;.
21d50 20 20 20 20 70 2d 3e 70 70 49 64 78 49 6e 66 6f      p->ppIdxInfo
21d60 20 3d 20 26 70 49 64 78 49 6e 66 6f 3b 0a 20 20   = &pIdxInfo;.  
21d70 20 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64    bestVirtualInd
21d80 65 78 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  ex(p);.    asser
21d90 74 28 20 70 49 64 78 49 6e 66 6f 21 3d 30 20 7c  t( pIdxInfo!=0 |
21da0 7c 20 70 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  | p->pParse->db-
21db0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
21dc0 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
21dd0 6f 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  o && pIdxInfo->n
21de0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
21df0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21e00 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
21e10 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20  idxStr);.    }. 
21e20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
21e30 28 70 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  (p->pParse->db, 
21e40 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  pIdxInfo);.  }el
21e50 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
21e60 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78    bestBtreeIndex
21e70 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
21e80 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d  * Disable a term
21e90 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
21ea0 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64  ause.  Except, d
21eb0 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68  o not disable th
21ec0 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20  e term.** if it 
21ed0 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20  controls a LEFT 
21ee0 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69  OUTER JOIN and i
21ef0 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
21f00 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a  ate in the ON.**
21f10 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
21f20 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a   of that join..*
21f30 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68  *.** Consider th
21f40 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27  e term t2.z='ok'
21f50 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
21f60 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a  g queries:.**.**
21f70 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a     (1)  SELECT *
21f80 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
21f90 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
21fa0 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f  .x WHERE t2.z='o
21fb0 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c  k'.**   (2)  SEL
21fc0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
21fd0 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
21fe0 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
21ff0 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20  ='ok'.**   (3)  
22000 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
22010 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d  , t2 WHERE t1.a=
22020 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
22030 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e  k'.**.** The t2.
22040 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c  z='ok' is disabl
22050 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29  ed in the in (2)
22060 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67   because it orig
22070 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65  inates.** in the
22080 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65   ON clause.  The
22090 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65   term is disable
220a0 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65  d in (3) because
220b0 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a   it is not part.
220c0 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  ** of a LEFT OUT
220d0 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29  ER JOIN.  In (1)
220e0 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f  , the term is no
220f0 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a  t disabled..**.*
22100 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
22110 2d 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35 38 36  -OF: R-24597-586
22120 35 35 20 4e 6f 20 74 65 73 74 73 20 61 72 65 20  55 No tests are 
22130 64 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73 20 74  done for terms t
22140 68 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c  hat are.** compl
22150 65 74 65 6c 79 20 73 61 74 69 73 66 69 65 64 20  etely satisfied 
22160 62 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a  by indices..**.*
22170 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65  * Disabling a te
22180 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74  rm causes that t
22190 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65  erm to not be te
221a0 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65  sted in the inne
221b0 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65  r loop.** of the
221c0 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e   join.  Disablin
221d0 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  g is an optimiza
221e0 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d  tion.  When term
221f0 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  s are satisfied.
22200 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77  ** by indices, w
22210 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74  e disable them t
22220 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64  o prevent redund
22230 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65  ant tests in the
22240 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20   inner.** loop. 
22250 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68   We would get th
22260 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74  e correct result
22270 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72  s if nothing wer
22280 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c  e ever disabled,
22290 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69  .** but joins mi
222a0 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
222b0 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72   slower.  The tr
222c0 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c  ick is to disabl
222d0 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20  e as much.** as 
222e0 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64  we can without d
222f0 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63  isabling too muc
22300 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c  h.  If we disabl
22310 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20  ed in (1), we'd 
22320 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67  get.** the wrong
22330 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69   answer.  See ti
22340 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74  cket #813..*/.st
22350 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c  atic void disabl
22360 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c  eTerm(WhereLevel
22370 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54   *pLevel, WhereT
22380 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69  erm *pTerm){.  i
22390 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26  f( pTerm.      &
223a0 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  & (pTerm->wtFlag
223b0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
223c0 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65  =0.      && (pLe
223d0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d  vel->iLeftJoin==
223e0 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  0 || ExprHasProp
223f0 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
22400 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
22410 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  .  ){.    pTerm-
22420 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
22430 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20  _CODED;.    if( 
22440 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d  pTerm->iParent>=
22450 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
22460 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26  Term *pOther = &
22470 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54  pTerm->pWC->a[pT
22480 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20  erm->iParent];. 
22490 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68       if( (--pOth
224a0 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29  er->nChild)==0 )
224b0 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  {.        disabl
224c0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f  eTerm(pLevel, pO
224d0 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ther);.      }. 
224e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
224f0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66  * Code an OP_Aff
22500 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20  inity opcode to 
22510 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e  apply the column
22520 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
22530 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20   zAff.** to the 
22540 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  n registers star
22550 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a  ting at base. .*
22560 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d  *.** As an optim
22570 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f  ization, SQLITE_
22580 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73  AFF_NONE entries
22590 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f   (which are no-o
225a0 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65  ps) at the.** be
225b0 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20  ginning and end 
225c0 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f  of zAff are igno
225d0 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74  red.  If all ent
225e0 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65  ries in zAff are
225f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
22600 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64  ONE, then no cod
22610 65 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64  e gets generated
22620 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22630 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f  tine makes its o
22640 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20  wn copy of zAff 
22650 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  so that the call
22660 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f  er is free.** to
22670 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74   modify zAff aft
22680 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
22690 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74  returns..*/.stat
226a0 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c  ic void codeAppl
226b0 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20  yAffinity(Parse 
226c0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73  *pParse, int bas
226d0 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a  e, int n, char *
226e0 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76  zAff){.  Vdbe *v
226f0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
22700 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20  ;.  if( zAff==0 
22710 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22720 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
22730 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
22740 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
22750 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20  ert( v!=0 );..  
22760 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61  /* Adjust base a
22770 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65  nd n to skip ove
22780 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  r SQLITE_AFF_NON
22790 45 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65  E entries at the
227a0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20   beginning.  ** 
227b0 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61  and end of the a
227c0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
227d0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e    */.  while( n>
227e0 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51  0 && zAff[0]==SQ
227f0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
22800 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61  .    n--;.    ba
22810 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b  se++;.    zAff++
22820 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e  ;.  }.  while( n
22830 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d  >1 && zAff[n-1]=
22840 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
22850 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d   ){.    n--;.  }
22860 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
22870 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
22880 64 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  de if there is a
22890 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20  nything left to 
228a0 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30  do. */.  if( n>0
228b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
228c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
228d0 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20  Affinity, base, 
228e0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n);.    sqlite3V
228f0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
22900 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20  1, zAff, n);.   
22910 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
22920 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
22930 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29  pParse, base, n)
22940 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
22950 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
22960 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c  r a single equal
22970 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ity term of the 
22980 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41  WHERE clause.  A
22990 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65  n equality.** te
229a0 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72  rm can be either
229b0 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20   X=expr or X IN 
229c0 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69  (...).   pTerm i
229d0 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  s the term to be
229e0 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a   .** coded..**.*
229f0 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61  * The current va
22a00 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73  lue for the cons
22a10 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69  traint is left i
22a20 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  n register iReg.
22a30 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e  .**.** For a con
22a40 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66  straint of the f
22a50 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20  orm X=expr, the 
22a60 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76  expression is ev
22a70 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a  aluated and its.
22a80 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66  ** result is lef
22a90 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  t on the stack. 
22aa0 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   For constraints
22ab0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49   of the form X I
22ac0 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20  N (...).** this 
22ad0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
22ae0 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
22af0 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c   iterate over al
22b00 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a  l values of X..*
22b10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
22b20 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20  eEqualityTerm(. 
22b30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
22b40 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
22b50 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22b60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
22b70 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  m,   /* The term
22b80 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
22b90 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64  ause to be coded
22ba0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
22bb0 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65   *pLevel, /* The
22bc0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52   level of the FR
22bd0 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65  OM clause we are
22be0 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
22bf0 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20   int iEq,       
22c00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
22c10 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
22c20 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  rm within this l
22c30 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 54  evel */.  int iT
22c40 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a  arget         /*
22c50 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76   Attempt to leav
22c60 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69  e results in thi
22c70 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
22c80 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54  .  Expr *pX = pT
22c90 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64  erm->pExpr;.  Vd
22ca0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
22cb0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65  pVdbe;.  int iRe
22cc0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
22cd0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
22ce0 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20  holding results 
22cf0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54  */..  assert( iT
22d00 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28  arget>0 );.  if(
22d10 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
22d20 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  {.    iReg = sql
22d30 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
22d40 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  et(pParse, pX->p
22d50 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
22d60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d  .  }else if( pX-
22d70 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29  >op==TK_ISNULL )
22d80 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  {.    iReg = iTa
22d90 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rget;.    sqlite
22da0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22db0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29  P_Null, 0, iReg)
22dc0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
22dd0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
22de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
22df0 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69  eType;.    int i
22e00 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Tab;.    struct 
22e10 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
22e20 20 75 38 20 62 52 65 76 20 3d 20 28 70 4c 65 76   u8 bRev = (pLev
22e30 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
22e40 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   & WHERE_REVERSE
22e50 29 21 3d 30 3b 0a 0a 20 20 20 20 69 66 28 20 28  )!=0;..    if( (
22e60 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
22e70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
22e80 45 58 45 44 29 21 3d 30 20 0a 20 20 20 20 20 20  EXED)!=0 .      
22e90 26 26 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  && pLevel->plan.
22ea0 75 2e 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  u.pIdx->aSortOrd
22eb0 65 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20  er[iEq].    ){. 
22ec0 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65       bRev = !bRe
22ed0 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  v;.    }.    ass
22ee0 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
22ef0 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  IN );.    iReg =
22f00 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54   iTarget;.    eT
22f10 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
22f20 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
22f30 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28   pX, 0);.    if(
22f40 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
22f50 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 20 62 52  _INDEX_DESC ) bR
22f60 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20  ev = !bRev;.    
22f70 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c  iTab = pX->iTabl
22f80 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
22f90 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
22fa0 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
22fb0 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
22fc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
22fd0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
22fe0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
22ff0 4c 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  LE );.    if( pL
23000 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d  evel->u.in.nIn==
23010 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
23020 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c  l->addrNxt = sql
23030 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
23040 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  l(v);.    }.    
23050 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
23060 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ++;.    pLevel->
23070 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20  u.in.aInLoop =. 
23080 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
23090 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61  eallocOrFree(pPa
230a0 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d  rse->db, pLevel-
230b0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20  >u.in.aInLoop,. 
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
230e0 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  eof(pLevel->u.in
230f0 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65  .aInLoop[0])*pLe
23100 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a  vel->u.in.nIn);.
23110 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c      pIn = pLevel
23120 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a  ->u.in.aInLoop;.
23130 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20      if( pIn ){. 
23140 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76       pIn += pLev
23150 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31  el->u.in.nIn - 1
23160 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75  ;.      pIn->iCu
23170 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  r = iTab;.      
23180 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
23190 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
231a0 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
231b0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
231c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
231d0 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29  wid, iTab, iReg)
231e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
231f0 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72         pIn->addr
23200 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  InTop = sqlite3V
23210 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
23220 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c  Column, iTab, 0,
23230 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a   iReg);.      }.
23240 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c        pIn->eEndL
23250 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  oopOp = bRev ? O
23260 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
23270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
23280 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
23290 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20  IsNull, iReg);. 
232a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
232b0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
232c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 0;.    }.#end
232d0 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65  if.  }.  disable
232e0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
232f0 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52  rm);.  return iR
23300 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
23310 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
23320 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c  will evaluate al
23330 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  l == and IN cons
23340 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a  traints for an.*
23350 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46  * index..**.** F
23360 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73  or example, cons
23370 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c  ider table t1(a,
23380 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20  b,c,d,e,f) with 
23390 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e  index i1(a,b,c).
233a0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20  .** Suppose the 
233b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
233c0 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20  this:  a==5 AND 
233d0 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44  b IN (1,2,3) AND
233e0 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a   c>5 AND c<10.**
233f0 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61   The index has a
23400 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20  s many as three 
23410 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
23420 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69  ints, but in thi
23430 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68  s.** example, th
23440 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75  e third "c" valu
23450 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69  e is an inequali
23460 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f  ty.  So only two
23470 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73   .** constraints
23480 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69   are coded.  Thi
23490 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67  s routine will g
234a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
234b0 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35  evaluate.** a==5
234c0 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33   and b IN (1,2,3
234d0 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  ).  The current 
234e0 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64  values for a and
234f0 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65   b will be store
23500 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74  d.** in consecut
23510 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e  ive registers an
23520 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  d the index of t
23530 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
23540 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
23550 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
23560 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32  ple above nEq==2
23570 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72  .  But this subr
23580 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72  outine works for
23590 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   any value.** of
235a0 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30   nEq including 0
235b0 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68  .  If nEq==0, th
235c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
235d0 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  arly a no-op..**
235e0 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
235f0 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63  it does is alloc
23600 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e  ate the pLevel->
23610 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iMem memory cell
23620 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20   and.** compute 
23630 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
23640 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
23650 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61  routine always a
23660 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73  llocates at leas
23670 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t one memory cel
23680 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  l and returns.**
23690 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
236a0 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20  at memory cell. 
236b0 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  The code that.**
236c0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
236d0 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61  ine will use tha
236e0 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  t memory cell to
236f0 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69   store the termi
23700 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61  nation.** key va
23710 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
23720 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
23730 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
23740 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
23750 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
23760 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
23770 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
23780 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
23790 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42  .** use..**.** B
237a0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
237b0 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74   *pzAff is set t
237c0 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
237d0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
237e0 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20  .** copy of the 
237f0 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
23800 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  string of the in
23810 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  dex allocated us
23820 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62  ing.** sqlite3Db
23830 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74  Malloc(). Except
23840 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  , entries in the
23850 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72   copy of the str
23860 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ing associated.*
23870 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20  * with equality 
23880 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
23890 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69   use NONE affini
238a0 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a  ty are set to.**
238b0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
238c0 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61  . This is to dea
238d0 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20  l with SQL such 
238e0 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
238f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
23900 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54   TABLE t1(a TEXT
23910 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
23920 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e  ;.**   SELECT ..
23930 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c  . FROM t1 AS t2,
23940 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d   t1 WHERE t1.a =
23950 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20   t2.b;.**.** In 
23960 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
23970 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  e, the index on 
23980 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61  t1(a) has TEXT a
23990 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e  ffinity. But sin
239a0 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20  ce.** the right 
239b0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
239c0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
239d0 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20  aint (t2.b) has 
239e0 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a  NONE affinity,.*
239f0 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20  * no conversion 
23a00 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70  should be attemp
23a10 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67  ted before using
23a20 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73   a t2.b value as
23a30 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65   part of.** a ke
23a40 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20  y to search the 
23a50 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65  index. Hence the
23a60 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74   first byte in t
23a70 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69  he returned affi
23a80 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69  nity.** string i
23a90 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77  n this example w
23aa0 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53  ould be set to S
23ab0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a  QLITE_AFF_NONE..
23ac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
23ad0 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
23ae0 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ms(.  Parse *pPa
23af0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
23b00 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
23b10 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
23b20 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69  pLevel,   /* Whi
23b30 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  ch nested loop o
23b40 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72  f the FROM we ar
23b50 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68  e coding */.  Wh
23b60 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
23b70 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
23b80 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74   clause */.  Bit
23b90 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
23ba0 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74     /* Which part
23bb0 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e  s of FROM have n
23bc0 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65  ot yet been code
23bd0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
23be0 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  aReg,        /* 
23bf0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
23c00 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
23c10 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
23c20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20  **pzAff         
23c30 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
23c40 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74  point to affinit
23c50 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
23c60 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
23c70 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f  l->plan.nEq;   /
23c80 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
23c90 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
23ca0 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
23cb0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
23cc0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
23cd0 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20  /* The vm under 
23ce0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
23cf0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
23d20 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
23d30 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69   loop */.  int i
23d40 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54  Cur = pLevel->iT
23d50 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20  abCur;   /* The 
23d60 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
23d70 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ble */.  WhereTe
23d80 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
23d90 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
23da0 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
23db0 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  rm */.  int j;  
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dd0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
23de0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
23df0 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
23e00 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
23e10 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
23e20 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
23e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e40 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74  Number of regist
23e50 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ers to allocate 
23e60 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b  */.  char *zAff;
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e80 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73     /* Affinity s
23e90 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20  tring to return 
23ea0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f  */..  /* This mo
23eb0 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  dule is only cal
23ec0 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61  led on query pla
23ed0 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69  ns that use an i
23ee0 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ndex. */.  asser
23ef0 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  t( pLevel->plan.
23f00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
23f10 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 70 49 64  INDEXED );.  pId
23f20 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
23f30 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20 46  .u.pIdx;..  /* F
23f40 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
23f50 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ny memory cells 
23f60 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65  we will need the
23f70 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e  n allocate them.
23f80 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20  .  */.  regBase 
23f90 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
23fa0 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 65   1;.  nReg = pLe
23fb0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20  vel->plan.nEq + 
23fc0 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61  nExtraReg;.  pPa
23fd0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
23fe0 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c  g;..  zAff = sql
23ff0 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
24000 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33  rse->db, sqlite3
24010 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
24020 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66  (v, pIdx));.  if
24030 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70  ( !zAff ){.    p
24040 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
24050 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
24060 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
24070 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
24080 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
24090 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
240a0 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20  olumn>=nEq );.  
240b0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
240c0 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
240d0 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49  ;.    int k = pI
240e0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
240f0 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
24100 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
24110 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c   k, notReady, pL
24120 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
24130 67 73 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69  gs, pIdx);.    i
24140 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
24150 65 61 6b 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  eak;.    /* The 
24160 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20 66  following true f
24170 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68 20  or indices with 
24180 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e  redundant column
24190 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43  s. .    ** Ex: C
241a0 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
241b0 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c  N t1(a,b,a); SEL
241c0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
241d0 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b  ERE a=0 AND b=0;
241e0 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
241f0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
24200 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21  s & TERM_CODED)!
24210 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
24220 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
24230 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
24240 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
24250 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
24260 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69   r1 = codeEquali
24270 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
24280 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c  Term, pLevel, j,
24290 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
242a0 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65   if( r1!=regBase
242b0 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  +j ){.      if( 
242c0 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nReg==1 ){.     
242d0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
242e0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
242f0 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20   regBase);.     
24300 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b     regBase = r1;
24310 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24330 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
24340 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65  opy, r1, regBase
24350 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
24360 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
24370 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
24380 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
24390 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
243a0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
243b0 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69  & WO_IN );.    i
243c0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
243d0 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
243e0 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a  L|WO_IN))==0 ){.
243f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
24400 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  ht = pTerm->pExp
24410 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
24420 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24430 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
24440 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c  ight, regBase+j,
24450 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
24460 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66  );.      if( zAf
24470 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
24480 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
24490 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
244a0 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45  zAff[j])==SQLITE
244b0 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
244c0 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
244d0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
244e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
244f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
24500 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
24510 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
24520 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20   zAff[j]) ){.   
24530 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
24540 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
24550 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24560 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
24570 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20  *pzAff = zAff;. 
24580 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b   return regBase;
24590 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
245a0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
245b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
245c0 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66  ne is a helper f
245d0 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  or explainIndexR
245e0 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a  ange() below.**.
245f0 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68  ** pStr holds th
24600 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70  e text of an exp
24610 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20  ression that we 
24620 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20  are building up 
24630 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61  one term.** at a
24640 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75   time.  This rou
24650 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20  tine adds a new 
24660 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20  term to the end 
24670 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
24680 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20  n..** Terms are 
24690 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44  separated by AND
246a0 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44   so add the "AND
246b0 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e  " text for secon
246c0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
246d0 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a  .** terms only..
246e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
246f0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
24700 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53  (.  StrAccum *pS
24710 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
24720 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72  /* The text expr
24730 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69  ession being bui
24740 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72  lt */.  int iTer
24750 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
24760 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
24770 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73  this term.  Firs
24780 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63  t is zero */.  c
24790 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
247a0 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  mn,        /* Na
247b0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
247c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
247d0 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20   *zOp           
247e0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
247f0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a   operator */.){.
24800 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71    if( iTerm ) sq
24810 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
24820 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20  end(pStr, " AND 
24830 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 5);.  sqlite3
24840 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
24850 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31  Str, zColumn, -1
24860 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
24870 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
24880 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69   zOp, 1);.  sqli
24890 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
248a0 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b  d(pStr, "?", 1);
248b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
248c0 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69  nt pLevel descri
248d0 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66  bes a strategy f
248e0 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c  or scanning tabl
248f0 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a  e pTab. This .**
24900 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
24910 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
24920 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63   string buffer c
24930 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63  ontaining a desc
24940 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ription.** of th
24950 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c  e subset of tabl
24960 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62  e rows scanned b
24970 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69  y the strategy i
24980 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e  n the form of an
24990 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69  .** SQL expressi
249a0 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72  on. Or, if all r
249b0 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c  ows are scanned,
249c0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
249d0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
249e0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
249f0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ry:.**.**   SELE
24a00 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
24a10 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a  RE a=1 AND b>2;.
24a20 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64  **.** is run and
24a30 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
24a40 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68  ex on (a, b), th
24a50 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24a60 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74   returns a.** st
24a70 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ring similar to:
24a80 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e  .**.**   "a=? AN
24a90 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65  D b>?".**.** The
24aa0 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
24ab0 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f  r points to memo
24ac0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
24ad0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
24ae0 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
24af0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
24b00 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
24b10 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72   free the buffer
24b20 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e   when it is.** n
24b30 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
24b40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
24b50 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  r *explainIndexR
24b60 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62  ange(sqlite3 *db
24b70 2c 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  , WhereLevel *pL
24b80 65 76 65 6c 2c 20 54 61 62 6c 65 20 2a 70 54 61  evel, Table *pTa
24b90 62 29 7b 0a 20 20 57 68 65 72 65 50 6c 61 6e 20  b){.  WherePlan 
24ba0 2a 70 50 6c 61 6e 20 3d 20 26 70 4c 65 76 65 6c  *pPlan = &pLevel
24bb0 2d 3e 70 6c 61 6e 3b 0a 20 20 49 6e 64 65 78 20  ->plan;.  Index 
24bc0 2a 70 49 6e 64 65 78 20 3d 20 70 50 6c 61 6e 2d  *pIndex = pPlan-
24bd0 3e 75 2e 70 49 64 78 3b 0a 20 20 69 6e 74 20 6e  >u.pIdx;.  int n
24be0 45 71 20 3d 20 70 50 6c 61 6e 2d 3e 6e 45 71 3b  Eq = pPlan->nEq;
24bf0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43  .  int i, j;.  C
24c00 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54  olumn *aCol = pT
24c10 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20  ab->aCol;.  int 
24c20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64  *aiColumn = pInd
24c30 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ex->aiColumn;.  
24c40 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20  StrAccum txt;.. 
24c50 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28   if( nEq==0 && (
24c60 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 20 26  pPlan->wsFlags &
24c70 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
24c80 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
24c90 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  T))==0 ){.    re
24ca0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
24cb0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
24cc0 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51  t(&txt, 0, 0, SQ
24cd0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29  LITE_MAX_LENGTH)
24ce0 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b  ;.  txt.db = db;
24cf0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
24d00 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
24d10 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69   (", 2);.  for(i
24d20 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b  =0; i<nEq; i++){
24d30 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
24d40 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20  ndTerm(&txt, i, 
24d50 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d  aCol[aiColumn[i]
24d60 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a 20  ].zName, "=");. 
24d70 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69   }..  j = i;.  i
24d80 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67  f( pPlan->wsFlag
24d90 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  s&WHERE_BTM_LIMI
24da0 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  T ){.    char *z
24db0 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e   = (j==pIndex->n
24dc0 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69  Column ) ? "rowi
24dd0 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  d" : aCol[aiColu
24de0 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[j]].zName;.  
24df0 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
24e00 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a  erm(&txt, i++, z
24e10 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  , ">");.  }.  if
24e20 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73  ( pPlan->wsFlags
24e30 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
24e40 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
24e50 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43  = (j==pIndex->nC
24e60 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64  olumn ) ? "rowid
24e70 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
24e80 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
24e90 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
24ea0 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22  rm(&txt, i, z, "
24eb0 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  <");.  }.  sqlit
24ec0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
24ed0 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a  (&txt, ")", 1);.
24ee0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
24ef0 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
24f00 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  txt);.}../*.** T
24f10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24f20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63  a no-op unless c
24f30 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
24f40 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51  ing an EXPLAIN Q
24f50 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d  UERY PLAN.** com
24f60 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65  mand. If the que
24f70 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65  ry being compile
24f80 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20  d is an EXPLAIN 
24f90 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69  QUERY PLAN, a si
24fa0 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69  ngle.** record i
24fb0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f  s added to the o
24fc0 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69 62  utput to describ
24fd0 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e  e the table scan
24fe0 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a   strategy in .**
24ff0 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74   pLevel..*/.stat
25000 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f  ic void explainO
25010 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20  neScan(.  Parse 
25020 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
25030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
25040 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
25050 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
25060 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
25070 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68  /* Table list th
25080 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74  is loop refers t
25090 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  o */.  WhereLeve
250a0 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20  l *pLevel,      
250b0 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74         /* Scan t
250c0 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61  o write OP_Expla
250d0 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f  in opcode for */
250e0 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
25110 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f  "level" column o
25120 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  f output */.  in
25130 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25150 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d   Value for "from
25160 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70  " column of outp
25170 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ut */.  u16 wctr
25180 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  lFlags          
25190 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
251a0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
251b0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
251c0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  /.){.  if( pPars
251d0 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
251e0 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73 20 3d  .    u32 flags =
251f0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
25200 46 6c 61 67 73 3b 0a 20 20 20 20 73 74 72 75 63  Flags;.    struc
25210 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
25220 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
25230 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
25240 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  om];.    Vdbe *v
25250 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
25260 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69  ;      /* VM bei
25270 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a  ng constructed *
25280 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  /.    sqlite3 *d
25290 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
252a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
252b0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68  handle */.    ch
252c0 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20  ar *zMsg;       
252d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
252e0 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51  ext to add to EQ
252f0 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  P output */.    
25300 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 52  sqlite3_int64 nR
25310 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ow;           /*
25320 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72   Expected number
25330 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
25340 20 62 79 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20   by scan */.    
25350 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73 65  int iId = pParse
25360 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a  ->iSelectId;  /*
25370 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74   Select id (left
25380 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c  -most output col
25390 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  umn) */.    int 
253a0 69 73 53 65 61 72 63 68 3b 20 20 20 20 20 20 20  isSearch;       
253b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
253c0 65 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20  e for a SEARCH. 
253d0 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20  False for SCAN. 
253e0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 28 66 6c 61  */..    if( (fla
253f0 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  gs&WHERE_MULTI_O
25400 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67  R) || (wctrlFlag
25410 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  s&WHERE_ONETABLE
25420 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b  _ONLY) ) return;
25430 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d  ..    isSearch =
25440 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e   (pLevel->plan.n
25450 45 71 3e 30 29 0a 20 20 20 20 20 20 20 20 20 20  Eq>0).          
25460 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 28 57 48     || (flags&(WH
25470 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
25480 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21  ERE_TOP_LIMIT))!
25490 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
254a0 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28  || (wctrlFlags&(
254b0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
254c0 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
254d0 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67  MAX));..    zMsg
254e0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
254f0 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65  f(db, "%s", isSe
25500 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53  arch?"SEARCH":"S
25510 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  CAN");.    if( p
25520 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
25530 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
25540 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
25550 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51  , zMsg, "%s SUBQ
25560 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70  UERY %d", zMsg,p
25570 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29  Item->iSelectId)
25580 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25590 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
255a0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
255b0 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73  sg, "%s TABLE %s
255c0 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
255d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  zName);.    }.. 
255e0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
255f0 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d  lias ){.      zM
25600 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
25610 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
25620 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c  %s AS %s", zMsg,
25630 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
25640 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
25650 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  flags & WHERE_IN
25660 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  DEXED)!=0 ){.   
25670 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20     char *zWhere 
25680 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  = explainIndexRa
25690 6e 67 65 28 64 62 2c 20 70 4c 65 76 65 6c 2c 20  nge(db, pLevel, 
256a0 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
256b0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
256c0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
256d0 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 25  Msg, "%s USING %
256e0 73 25 73 49 4e 44 45 58 25 73 25 73 25 73 22 2c  s%sINDEX%s%s%s",
256f0 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20   zMsg, .        
25700 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
25710 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 41  E_TEMP_INDEX)?"A
25720 55 54 4f 4d 41 54 49 43 20 22 3a 22 22 29 2c 0a  UTOMATIC ":""),.
25730 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
25740 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
25750 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47 20 22 3a  LY)?"COVERING ":
25760 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28  ""),.          (
25770 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  (flags & WHERE_T
25780 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 22 20  EMP_INDEX)?"":" 
25790 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28  "),.          ((
257a0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  flags & WHERE_TE
257b0 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 20 70 4c  MP_INDEX)?"": pL
257c0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
257d0 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  x->zName),.     
257e0 20 20 20 20 20 7a 57 68 65 72 65 0a 20 20 20 20       zWhere.    
257f0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
25800 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68  e3DbFree(db, zWh
25810 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ere);.    }else 
25820 69 66 28 20 66 6c 61 67 73 20 26 20 28 57 48 45  if( flags & (WHE
25830 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
25840 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29  E_ROWID_RANGE) )
25850 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
25860 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
25870 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49  b, zMsg, "%s USI
25880 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
25890 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a  RY KEY", zMsg);.
258a0 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73  .      if( flags
258b0 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20  &WHERE_ROWID_EQ 
258c0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
258d0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
258e0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
258f0 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67  (rowid=?)", zMsg
25900 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
25910 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f  f( (flags&WHERE_
25920 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45  BOTH_LIMIT)==WHE
25930 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b  RE_BOTH_LIMIT ){
25940 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
25950 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
25960 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
25970 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64  owid>? AND rowid
25980 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
25990 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
259a0 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
259b0 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
259c0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
259d0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
259e0 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a  %s (rowid>?)", z
259f0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
25a00 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52  e if( flags&WHER
25a10 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_TOP_LIMIT ){. 
25a20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
25a30 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
25a40 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
25a50 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
25a60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
25a70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25a80 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
25a90 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
25aa0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
25ab0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
25ac0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
25ad0 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78  x_info *pVtabIdx
25ae0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
25af0 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20  u.pVtabIdx;.    
25b00 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
25b10 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
25b20 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54  g, "%s VIRTUAL T
25b30 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73  ABLE INDEX %d:%s
25b40 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  ", zMsg,.       
25b50 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
25b60 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74  Idx->idxNum, pVt
25b70 61 62 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a  abIdx->idxStr);.
25b80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
25b90 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 26   if( wctrlFlags&
25ba0 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  (WHERE_ORDERBY_M
25bb0 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  IN|WHERE_ORDERBY
25bc0 5f 4d 41 58 29 20 29 7b 0a 20 20 20 20 20 20 74  _MAX) ){.      t
25bd0 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
25be0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
25bf0 52 42 59 5f 4d 49 4e 20 29 3b 0a 20 20 20 20 20  RBY_MIN );.     
25c00 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d   nRow = 1;.    }
25c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 6f 77  else{.      nRow
25c20 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   = (sqlite3_int6
25c30 34 29 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  4)pLevel->plan.n
25c40 52 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  Row;.    }.    z
25c50 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
25c60 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
25c70 22 25 73 20 28 7e 25 6c 6c 64 20 72 6f 77 73 29  "%s (~%lld rows)
25c80 22 2c 20 7a 4d 73 67 2c 20 6e 52 6f 77 29 3b 0a  ", zMsg, nRow);.
25c90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25ca0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
25cb0 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c  ain, iId, iLevel
25cc0 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50  , iFrom, zMsg, P
25cd0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
25ce0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
25cf0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
25d00 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  u,v,w,x,y,z).#en
25d10 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
25d20 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a  IT_EXPLAIN */...
25d30 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
25d40 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61 72  ode for the star
25d50 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d  t of the iLevel-
25d60 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57  th loop in the W
25d70 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69  HERE clause.** i
25d80 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65  mplementation de
25d90 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e 66  scribed by pWInf
25da0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  o..*/.static Bit
25db0 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70  mask codeOneLoop
25dc0 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e  Start(.  WhereIn
25dd0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a  fo *pWInfo,   /*
25de0 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d   Complete inform
25df0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
25e00 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
25e10 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
25e20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
25e30 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d  level of pWInfo-
25e40 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63  >a[] should be c
25e50 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36 20 77 63  oded */.  u16 wc
25e60 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 2f  trlFlags,      /
25e70 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
25e80 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
25e90 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
25ea0 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
25eb0 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57  otReady     /* W
25ec0 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
25ed0 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
25ee0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
25ef0 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
25f00 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
25f10 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
25f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25f30 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
25f40 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
25f50 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20    int addrNxt;  
25f60 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
25f70 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69  to jump to conti
25f80 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
25f90 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69  t IN case */.  i
25fa0 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20  nt omitTable;   
25fb0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
25fc0 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
25fd0 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  only */.  int bR
25fe0 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
25ff0 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65  * True if we nee
26000 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  d to scan in rev
26010 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
26020 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
26030 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72  el;  /* The wher
26040 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f  e level to be co
26050 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ded */.  WhereCl
26060 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a  ause *pWC;    /*
26070 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f   Decomposition o
26080 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45  f the entire WHE
26090 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
260a0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
260b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
260c0 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65  * A WHERE clause
260d0 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65   term */.  Parse
260e0 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
260f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
26100 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
26110 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
26140 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f  ed stmt under co
26150 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
26160 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
26170 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
26180 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
26190 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64  term being coded
261a0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
261b0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
261c0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
261d0 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
261e0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
261f0 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20   int addrCont;  
26200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26210 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
26220 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
26230 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
26240 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30  nt iRowidReg = 0
26250 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
26260 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  d is stored in t
26270 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66  his register, if
26280 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69   not zero */.  i
26290 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d  nt iReleaseReg =
262a0 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70   0;      /* Temp
262b0 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
262c0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
262d0 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ng */..  pParse 
262e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
262f0 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
26300 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 70  pVdbe;.  pWC = p
26310 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c  WInfo->pWC;.  pL
26320 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
26330 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61  a[iLevel];.  pTa
26340 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
26350 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
26360 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
26370 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
26380 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20  iCursor;.  bRev 
26390 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  = (pLevel->plan.
263a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
263b0 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f  REVERSE)!=0;.  o
263c0 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76  mitTable = (pLev
263d0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
263e0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
263f0 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  Y)!=0 .         
26400 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
26410 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54   & WHERE_FORCE_T
26420 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20 2f 2a 20  ABLE)==0;..  /* 
26430 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
26440 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
26450 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
26460 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66  tructions.  ** f
26470 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
26480 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64  oop.  Jump to ad
26490 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f  drBrk to break o
264a0 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20  ut of a loop..  
264b0 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20  ** Jump to cont 
264c0 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c  to go immediatel
264d0 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  y to the next it
264e0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  eration of the. 
264f0 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20   ** loop..  **. 
26500 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
26510 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
26520 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
26530 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
26540 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73   that.  ** means
26550 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
26560 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61  h the next IN va
26570 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  lue combination.
26580 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72    When.  ** ther
26590 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
265a0 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
265b0 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61  straints, the "a
265c0 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20  ddrNxt" label.  
265d0 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
265e0 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a  s "addrBrk"..  *
265f0 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c  /.  addrBrk = pL
26600 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20  evel->addrBrk = 
26610 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
26620 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
26630 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64  eLabel(v);.  add
26640 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  rCont = pLevel->
26650 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
26660 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
26670 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  v);..  /* If thi
26680 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  s is the right t
26690 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f  able of a LEFT O
266a0 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63  UTER JOIN, alloc
266b0 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69  ate and.  ** ini
266c0 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
266d0 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
266e0 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
266f0 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a   matches any.  *
26700 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
26710 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
26720 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oin..  */.  if( 
26730 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
26740 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
26750 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
26760 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  FT)!=0 ){.    pL
26770 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
26780 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
26790 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
267a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
267b0 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
267c0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
267d0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
267e0 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
267f0 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
26800 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  ));.  }..  /* Sp
26810 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
26820 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71  FROM clause subq
26830 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64  uery implemented
26840 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
26850 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74   */.  if( pTabIt
26860 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
26870 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
26880 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
26890 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
268a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
268b0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
268c0 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46   pTabItem->addrF
268d0 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59 69 65  illSub-1, regYie
268e0 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ld);.    pLevel-
268f0 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64  >p2 =  sqlite3Vd
26900 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
26910 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b  ield, regYield);
26920 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
26930 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f  ((v, "next row o
26940 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22  f co-routine %s"
26950 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
26960 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73  ->zName));.    s
26970 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26980 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59 69  (v, OP_If, regYi
26990 65 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b  eld+1, addrBrk);
269a0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
269b0 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c  = OP_Goto;.  }el
269c0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
269d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
269e0 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 65  ABLE.  if(  (pLe
269f0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
26a00 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
26a10 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
26a20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68    /* Case 0:  Th
26a30 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72  e table is a vir
26a40 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65  tual-table.  Use
26a50 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64   the VFilter and
26a60 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20   VNext.    **   
26a70 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
26a80 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a   the data..    *
26a90 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20  /.    int iReg; 
26aa0 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
26ab0 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
26ac0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46      int addrNotF
26ad0 6f 75 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  ound;.    sqlite
26ae0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56  3_index_info *pV
26af0 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d  tabIdx = pLevel-
26b00 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78  >plan.u.pVtabIdx
26b10 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
26b20 72 61 69 6e 74 20 3d 20 70 56 74 61 62 49 64 78  raint = pVtabIdx
26b30 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
26b40 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65     struct sqlite
26b50 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
26b60 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65  nt_usage *aUsage
26b70 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f     pVtabIdx->aCo
26bb0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
26bc0 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20     const struct 
26bd0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
26be0 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74  nstraint *aConst
26bf0 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20  raint =.        
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
26c30 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a  ->aConstraint;..
26c40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26c50 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
26c60 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  ;.    iReg = sql
26c70 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
26c80 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72  (pParse, nConstr
26c90 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64  aint+2);.    add
26ca0 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76  rNotFound = pLev
26cb0 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20  el->addrBrk;.   
26cc0 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f   for(j=1; j<=nCo
26cd0 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
26ce0 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
26cf0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b  <nConstraint; k+
26d00 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
26d10 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e  aUsage[k].argvIn
26d20 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20  dex==j ){.      
26d30 20 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20      int iTarget 
26d40 3d 20 69 52 65 67 2b 6a 2b 31 3b 0a 20 20 20 20  = iReg+j+1;.    
26d50 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
26d60 57 43 2d 3e 61 5b 61 43 6f 6e 73 74 72 61 69 6e  WC->a[aConstrain
26d70 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[k].iTermOffset
26d80 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
26d90 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
26da0 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  r & WO_IN ){.   
26db0 20 20 20 20 20 20 20 20 20 63 6f 64 65 45 71 75           codeEqu
26dc0 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
26dd0 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
26de0 20 6b 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20   k, iTarget);.  
26df0 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f            addrNo
26e00 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d  tFound = pLevel-
26e10 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20  >addrNxt;.      
26e20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26e30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
26e40 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
26e50 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
26e60 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
26e70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26e80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26e90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
26ea0 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73      if( k==nCons
26eb0 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a  traint ) break;.
26ec0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
26ed0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
26ee0 50 5f 49 6e 74 65 67 65 72 2c 20 70 56 74 61 62  P_Integer, pVtab
26ef0 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65  Idx->idxNum, iRe
26f00 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
26f10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
26f20 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52  Integer, j-1, iR
26f30 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
26f40 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
26f50 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
26f60 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20  , addrNotFound, 
26f70 69 52 65 67 2c 20 70 56 74 61 62 49 64 78 2d 3e  iReg, pVtabIdx->
26f80 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20  idxStr,.        
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
26fa0 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  tabIdx->needToFr
26fb0 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50  eeIdxStr ? P4_MP
26fc0 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49  RINTF : P4_STATI
26fd0 43 29 3b 0a 20 20 20 20 70 56 74 61 62 49 64 78  C);.    pVtabIdx
26fe0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
26ff0 74 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  tr = 0;.    for(
27000 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69  j=0; j<nConstrai
27010 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
27020 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d  if( aUsage[j].om
27030 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  it ){.        in
27040 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74  t iTerm = aConst
27050 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66  raint[j].iTermOf
27060 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 64 69  fset;.        di
27070 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
27080 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  , &pWC->a[iTerm]
27090 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
270a0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
270b0 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  = OP_VNext;.    
270c0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
270d0 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
270e0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
270f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
27100 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
27110 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
27120 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72  e, iReg, nConstr
27130 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c  aint+2);.    sql
27140 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
27150 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d  (pParse, 1);.  }
27160 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
27170 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
27180 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66  ALTABLE */..  if
27190 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
271a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
271b0 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f  OWID_EQ ){.    /
271c0 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61  * Case 1:  We ca
271d0 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72  n directly refer
271e0 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  ence a single ro
271f0 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  w using an.    *
27200 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c  *          equal
27210 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
27220 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
27230 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20   field.  Or.    
27240 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72  **          we r
27250 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c  eference multipl
27260 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22  e rows using a "
27270 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a  rowid IN (...)".
27280 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
27290 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a  construct..    *
272a0 2f 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65  /.    iReleaseRe
272b0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
272c0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
272d0 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
272e0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
272f0 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
27300 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
27310 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
27320 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
27330 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d  ( pTerm->pExpr!=
27340 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
27350 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
27360 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
27370 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
27380 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
27390 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
273a0 31 36 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77  1662 */.    iRow
273b0 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61  idReg = codeEqua
273c0 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
273d0 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
273e0 30 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  0, iReleaseReg);
273f0 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
27400 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
27410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27420 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
27430 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67  BeInt, iRowidReg
27440 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
27450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27460 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
27470 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74  s, iCur, addrNxt
27480 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
27490 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
274a0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
274b0 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64 52  (pParse, iRowidR
274c0 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  eg, 1);.    sqli
274d0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
274e0 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
274f0 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
27500 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
27510 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
27520 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
27530 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Noop;.  }else if
27540 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
27550 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
27560 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20  OWID_RANGE ){.  
27570 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
27580 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
27590 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
275a0 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
275b0 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20   field..    */. 
275c0 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20     int testOp = 
275d0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  OP_Noop;.    int
275e0 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20   start;.    int 
275f0 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b  memEndValue = 0;
27600 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
27610 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
27620 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
27630 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
27640 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72  pStart = findTer
27650 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
27660 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
27670 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_GE, 0);.    
27680 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  pEnd = findTerm(
27690 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
276a0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
276b0 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_LE, 0);.    if
276c0 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
276d0 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
276e0 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
276f0 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  End;.      pEnd 
27700 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  = pTerm;.    }. 
27710 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
27720 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27740 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
27750 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
27760 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20  start bound */. 
27770 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65       int r1, rTe
27780 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  mp;        /* Re
27790 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64  gisters for hold
277a0 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f  ing the start bo
277b0 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20  undary */..     
277c0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
277d0 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20  g constant maps 
277e0 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f  TK_xx codes into
277f0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a   corresponding .
27800 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70        ** seek op
27810 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e  codes.  It depen
27820 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ds on a particul
27830 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54  ar ordering of T
27840 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  K_xx.      */.  
27850 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f      const u8 aMo
27860 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  veOp[] = {.     
27870 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a        /* TK_GT *
27880 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20  /  OP_SeekGt,.  
27890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
278a0 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c  E */  OP_SeekLe,
278b0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
278c0 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LT */  OP_Seek
278d0 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Lt,.           /
278e0 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53  * TK_GE */  OP_S
278f0 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20  eekGe.      };. 
27900 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
27910 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20  LE==TK_GT+1 );  
27920 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
27930 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20   the ordering.. 
27940 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
27950 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
27960 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
27970 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c  of the TK_xx val
27980 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ues... */.      
27990 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
279a0 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f  K_GT+3 );      /
279b0 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63  *  ... is correc
279c0 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65  ct. */..      te
279d0 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
279e0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
279f0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
27a00 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
27a10 2f 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  /.      pX = pSt
27a20 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
27a30 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
27a40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27a50 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72   pStart->leftCur
27a60 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
27a70 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
27a80 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
27a90 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
27aa0 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  &rTemp);.      s
27ab0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
27ac0 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e  (v, aMoveOp[pX->
27ad0 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c  op-TK_GT], iCur,
27ae0 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20   addrBrk, r1);. 
27af0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
27b00 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
27b10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
27b20 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
27b30 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29  e(pParse, r1, 1)
27b40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
27b50 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
27b60 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20  arse, rTemp);.  
27b70 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
27b80 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
27b90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27bb0 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
27bc0 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
27bd0 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  d, iCur, addrBrk
27be0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
27bf0 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45   pEnd ){.      E
27c00 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70  xpr *pX;.      p
27c10 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b  X = pEnd->pExpr;
27c20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27c30 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  X!=0 );.      as
27c40 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74  sert( pEnd->left
27c50 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
27c60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27c70 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
27c80 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
27c90 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
27ca0 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65  1662 */.      me
27cb0 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50  mEndValue = ++pP
27cc0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
27cd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
27ce0 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
27cf0 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
27d00 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  e);.      if( pX
27d10 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
27d20 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
27d30 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
27d40 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
27d50 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c  OP_Ge;.      }el
27d60 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
27d70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
27d80 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
27d90 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65   }.      disable
27da0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
27db0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  d);.    }.    st
27dc0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
27dd0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
27de0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
27df0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
27e00 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
27e10 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
27e20 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
27e30 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69  2 = start;.    i
27e40 66 28 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20  f( pStart==0 && 
27e50 70 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pEnd==0 ){.     
27e60 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
27e70 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
27e80 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
27e90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27ea0 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
27eb0 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  p5==0 );.    }. 
27ec0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
27ed0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
27ee0 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
27ef0 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
27f00 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
27f10 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
27f20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27f30 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
27f40 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
27f50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
27f60 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
27f70 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
27f80 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
27f90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
27fa0 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
27fb0 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
27fc0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
27fd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
27fe0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
27ff0 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
28000 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
28010 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
28020 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
28030 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
28040 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
28050 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29  ERE_COLUMN_EQ) )
28060 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a  {.    /* Case 3:
28070 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e   A scan using an
28080 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   index..    **. 
28090 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
280a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d  e WHERE clause m
280b0 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20  ay contain zero 
280c0 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79  or more equality
280d0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
280e0 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20   terms ("==" or 
280f0 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20  "IN" operators) 
28100 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
28110 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  e N.    **      
28120 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c     left-most col
28130 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
28140 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63  x. It may also c
28150 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20  ontain.    **   
28160 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79        inequality
28170 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c   constraints (>,
28180 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e   <, >= or <=) on
28190 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20   the indexed.   
281a0 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75   **         colu
281b0 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74  mn that immediat
281c0 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  ely follows the 
281d0 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e  N equalities. On
281e0 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ly .    **      
281f0 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73     the right-mos
28200 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  t column can be 
28210 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20  an inequality - 
28220 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20  the rest must.  
28230 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65    **         use
28240 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49   the "==" and "I
28250 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f  N" operators. Fo
28260 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
28270 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  e .    **       
28280 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78    index is on (x
28290 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20  ,y,z), then the 
282a0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65  following clause
282b0 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a  s are all .    *
282c0 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69  *         optimi
282d0 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  zed:.    **.    
282e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
282f0 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  5.    **        
28300 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30      x=5 AND y=10
28310 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
28320 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a     x=5 AND y<10.
28330 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
28340 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e    x=5 AND y>5 AN
28350 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
28360 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
28370 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20   y=5 AND z<=10. 
28380 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
28390 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65       The z<10 te
283a0 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  rm of the follow
283b0 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ing cannot be us
283c0 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20  ed, only.    ** 
283d0 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35 20          the x=5 
283e0 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  term:.    **.   
283f0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
28400 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20  =5 AND z<10.    
28410 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
28420 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20    N may be zero 
28430 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65  if there are ine
28440 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
28450 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20  nts..    **     
28460 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65      If there are
28470 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63   no inequality c
28480 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e  onstraints, then
28490 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20   N is at.    ** 
284a0 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e          least on
284b0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
284c0 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61           This ca
284d0 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  se is also used 
284e0 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  when there are n
284f0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20  o WHERE clause. 
28500 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
28510 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e  nstraints but an
28520 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74   index is select
28530 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72  ed anyway, in or
28540 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  der.    **      
28550 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20     to force the 
28560 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20  output order to 
28570 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52  conform to an OR
28580 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20  DER BY..    */  
28590 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
285a0 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20  t u8 aStartOp[] 
285b0 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20  = {.      0,.   
285c0 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52     0,.      OP_R
285d0 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20  ewind,          
285e0 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63   /* 2: (!start_c
285f0 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
28600 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29  artEq &&  !bRev)
28610 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73   */.      OP_Las
28620 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
28630 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 3: (!start_con
28640 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
28650 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a  tEq &&   bRev) *
28660 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
28670 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
28680 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  4: (start_constr
28690 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
286a0 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
286b0 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c        OP_SeekLt,
286c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a             /* 5:
286d0 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
286e0 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
286f0 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
28700 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20      OP_SeekGe,  
28710 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28           /* 6: (
28720 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
28730 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
28740 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
28750 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20    OP_SeekLe     
28760 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74         /* 7: (st
28770 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
28780 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
28790 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b   bRev) */.    };
287a0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
287b0 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20  t u8 aEndOp[] = 
287c0 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c  {.      OP_Noop,
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
287e0 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61  0: (!end_constra
287f0 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f  ints) */.      O
28800 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20  P_IdxGE,        
28810 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63      /* 1: (end_c
28820 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62  onstraints && !b
28830 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
28840 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20  _IdxLT          
28850 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f     /* 2: (end_co
28860 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65  nstraints && bRe
28870 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
28880 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
28890 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 2f 2a  l->plan.nEq;  /*
288a0 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
288b0 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20   IN terms */.   
288c0 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20   int isMinQuery 
288d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
288e0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f   If this is an o
288f0 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20  ptimized SELECT 
28900 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20  min(x).. */.    
28910 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28930 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
28940 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
28950 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69   values */.    i
28960 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20  nt r1;          
28970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28980 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  emp register */.
28990 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
289a0 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20  RangeStart = 0; 
289b0 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
289c0 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
289d0 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20  ge start */.    
289e0 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
289f0 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  eEnd = 0;    /* 
28a00 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
28a10 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65  raint at range e
28a20 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  nd */.    int st
28a30 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20  artEq;          
28a40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28a50 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73  f range start us
28a60 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
28a70 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71  */.    int endEq
28a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28a90 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
28aa0 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d  ange end uses ==
28ab0 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
28ac0 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73    int start_cons
28ad0 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f  traints;       /
28ae0 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65  * Start of range
28af0 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
28b00 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  */.    int nCons
28b10 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20  traint;         
28b20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28b30 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
28b40 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
28b50 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
28b60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
28b70 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  ex we will be us
28b80 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
28b90 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20  IdxCur;         
28ba0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
28bb0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
28bc0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
28bd0 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20  int nExtraReg = 
28be0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
28bf0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
28c00 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64  registers needed
28c10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20   */.    int op; 
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
28c40 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
28c50 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66    char *zStartAf
28c60 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
28c70 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73  * Affinity for s
28c80 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f  tart of range co
28c90 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
28ca0 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20  char *zEndAff;  
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28cc0 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64  Affinity for end
28cd0 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
28ce0 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64  aint */..    pId
28cf0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
28d00 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64  .u.pIdx;.    iId
28d10 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
28d20 49 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20  IdxCur;.    k = 
28d30 28 6e 45 71 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  (nEq==pIdx->nCol
28d40 75 6d 6e 20 3f 20 2d 31 20 3a 20 70 49 64 78 2d  umn ? -1 : pIdx-
28d50 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3b  >aiColumn[nEq]);
28d60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
28d70 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
28d80 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
28d90 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
28da0 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
28db0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
28dc0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
28dd0 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
28de0 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
28df0 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
28e00 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
28e10 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
28e20 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
28e30 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
28e40 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
28e50 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
28e60 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
28e70 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
28e80 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
28e90 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
28ea0 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
28eb0 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
28ec0 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
28ed0 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
28ee0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
28ef0 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
28f00 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
28f10 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
28f20 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
28f30 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
28f40 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  s&WHERE_ORDERBY_
28f50 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20  MIN)!=0.     && 
28f60 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
28f70 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
28f80 52 45 44 29 0a 20 20 20 20 20 26 26 20 28 70 49  RED).     && (pI
28f90 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29  dx->nColumn>nEq)
28fa0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
28fb0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
28fc0 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a  y->nExpr==1 ); *
28fd0 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  /.      /* asser
28fe0 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30  t( pOrderBy->a[0
28ff0 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
29000 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
29010 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20  [nEq] ); */.    
29020 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31    isMinQuery = 1
29030 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
29040 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
29050 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e    /* Find any in
29060 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
29070 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68  int terms for th
29080 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
29090 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72  .    ** of the r
290a0 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ange. .    */.  
290b0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
290c0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
290d0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
290e0 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20        pRangeEnd 
290f0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
29100 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
29110 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  y, (WO_LT|WO_LE)
29120 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
29130 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
29140 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
29150 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
29160 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
29170 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
29180 67 65 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65  geStart = findTe
29190 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
291a0 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47   notReady, (WO_G
291b0 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b  T|WO_GE), pIdx);
291c0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
291d0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
291e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
291f0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
29200 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
29210 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
29220 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f  N.    ** and sto
29230 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  re the values of
29240 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20   those terms in 
29250 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
29260 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
29270 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65  rting at regBase
29280 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
29290 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71  Base = codeAllEq
292a0 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20  ualityTerms(.   
292b0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65       pParse, pLe
292c0 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61  vel, pWC, notRea
292d0 64 79 2c 20 6e 45 78 74 72 61 52 65 67 2c 20 26  dy, nExtraReg, &
292e0 7a 53 74 61 72 74 41 66 66 0a 20 20 20 20 29 3b  zStartAff.    );
292f0 0a 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73  .    zEndAff = s
29300 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
29310 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72  Parse->db, zStar
29320 74 41 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e  tAff);.    addrN
29330 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  xt = pLevel->add
29340 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  rNxt;..    /* If
29350 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
29360 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73 63  reverse order sc
29370 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  an on an ascendi
29380 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20  ng index, or.   
29390 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72   ** a forward or
293a0 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65  der scan on a de
293b0 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
293c0 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65 20  interchange the 
293d0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e  .    ** start an
293e0 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61  d end terms (pRa
293f0 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70 52 61  ngeStart and pRa
29400 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a  ngeEnd)..    */.
29410 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64      if( (nEq<pId
29420 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52  x->nColumn && bR
29430 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74  ev==(pIdx->aSort
29440 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49  Order[nEq]==SQLI
29450 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20  TE_SO_ASC)).    
29460 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70 49 64   || (bRev && pId
29470 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45 71 29  x->nColumn==nEq)
29480 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57  .    ){.      SW
29490 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20  AP(WhereTerm *, 
294a0 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67  pRangeEnd, pRang
294b0 65 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a  eStart);.    }..
294c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
294d0 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61  angeStart && pRa
294e0 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
294f0 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
29500 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
29510 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e  ngeStart && pRan
29520 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
29530 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
29540 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
29550 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45  geEnd && pRangeE
29560 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
29570 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_LE );.    tes
29580 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
29590 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   && pRangeEnd->e
295a0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45  Operator & WO_GE
295b0 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20   );.    startEq 
295c0 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c  = !pRangeStart |
295d0 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  | pRangeStart->e
295e0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
295f0 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e  E|WO_GE);.    en
29600 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45  dEq =   !pRangeE
29610 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d  nd || pRangeEnd-
29620 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
29630 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20  _LE|WO_GE);.    
29640 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
29650 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20  s = pRangeStart 
29660 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f  || nEq>0;..    /
29670 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78  * Seek the index
29680 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73   cursor to the s
29690 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67  tart of the rang
296a0 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74  e. */.    nConst
296b0 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
296c0 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74   if( pRangeStart
296d0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
296e0 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53  pRight = pRangeS
296f0 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69  tart->pExpr->pRi
29700 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
29710 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
29720 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  e, pRight, regBa
29730 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69  se+nEq);.      i
29740 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  f( (pRangeStart-
29750 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
29760 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
29770 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29780 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
29790 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
297a0 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
297b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
297c0 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a  f( zStartAff ){.
297d0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
297e0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
297f0 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ty(pRight, zStar
29800 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  tAff[nEq])==SQLI
29810 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
29820 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
29830 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
29840 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
29850 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
29860 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
29870 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
29880 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
29890 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
298a0 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
298b0 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
298c0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
298d0 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
298e0 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20   zStartAff[nEq] 
298f0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
29900 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
29910 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29920 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
29930 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
29940 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
29950 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
29960 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
29970 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
29980 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29990 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73   }  .      nCons
299a0 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
299b0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
299c0 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
299d0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
299e0 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
299f0 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c  11662 */.    }el
29a00 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72  se if( isMinQuer
29a10 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
29a20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29a30 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42  OP_Null, 0, regB
29a40 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
29a50 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
29a60 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30       startEq = 0
29a70 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f  ;.      start_co
29a80 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20  nstraints = 1;. 
29a90 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70     }.    codeApp
29aa0 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  lyAffinity(pPars
29ab0 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  e, regBase, nCon
29ac0 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41  straint, zStartA
29ad0 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53  ff);.    op = aS
29ae0 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f  tartOp[(start_co
29af0 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20  nstraints<<2) + 
29b00 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62  (startEq<<1) + b
29b10 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  Rev];.    assert
29b20 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74  ( op!=0 );.    t
29b30 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
29b40 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65  Rewind );.    te
29b50 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c  stcase( op==OP_L
29b60 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ast );.    testc
29b70 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
29b80 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Gt );.    testca
29b90 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
29ba0 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
29bb0 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65  e( op==OP_SeekLe
29bc0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
29bd0 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20  ( op==OP_SeekLt 
29be0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
29bf0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
29c00 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
29c10 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
29c20 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20  onstraint);..   
29c30 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c   /* Load the val
29c40 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75  ue for the inequ
29c50 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
29c60 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
29c70 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
29c80 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
29c90 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
29ca0 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
29cb0 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20  pRangeEnd ){.   
29cc0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
29cd0 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78  = pRangeEnd->pEx
29ce0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
29cf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
29d00 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
29d10 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29   regBase+nEq, 1)
29d20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
29d30 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
29d40 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
29d50 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
29d60 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c  (pRangeEnd->wtFl
29d70 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
29d80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
29d90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
29da0 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
29db0 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
29dc0 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
29dd0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45    }.      if( zE
29de0 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  ndAff ){.       
29df0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
29e00 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
29e10 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d  ht, zEndAff[nEq]
29e20 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
29e30 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
29e40 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
29e50 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
29e60 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
29e70 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
29e80 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
29e90 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
29ea0 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
29eb0 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
29ec0 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
29ed0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
29ee0 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
29ef0 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b          zEndAff[
29f00 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
29f10 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
29f20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
29f30 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
29f40 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
29f50 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e  Right, zEndAff[n
29f60 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Eq]) ){.        
29f70 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d    zEndAff[nEq] =
29f80 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
29f90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29fa0 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65    }  .      code
29fb0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
29fc0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
29fd0 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a  Eq+1, zEndAff);.
29fe0 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
29ff0 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
2a000 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e  ase( pRangeEnd->
2a010 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
2a020 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
2a030 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
2a040 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
2a050 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
2a060 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29  ->db, zStartAff)
2a070 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
2a080 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
2a090 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f  zEndAff);..    /
2a0a0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
2a0b0 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c  p body */.    pL
2a0c0 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74  evel->p2 = sqlit
2a0d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2a0e0 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(v);..    /* Ch
2a0f0 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78  eck if the index
2a100 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20   cursor is past 
2a110 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
2a120 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20  ange. */.    op 
2a130 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65  = aEndOp[(pRange
2a140 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31  End || nEq) * (1
2a150 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74   + bRev)];.    t
2a160 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
2a170 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74  Noop );.    test
2a180 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
2a190 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  GE );.    testca
2a1a0 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54  se( op==OP_IdxLT
2a1b0 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   );.    if( op!=
2a1c0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
2a1d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a1e0 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
2a1f0 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
2a200 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
2a210 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
2a220 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2a230 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f  v, endEq!=bRev ?
2a240 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  1:0);.    }..   
2a250 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
2a260 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
2a270 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74  traints, check t
2a280 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20  hat the value.  
2a290 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
2a2a0 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  e column that th
2a2b0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
2a2c0 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55  trains is not NU
2a2d0 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74  LL..    ** If it
2a2e0 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65   is, jump to the
2a2f0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
2a300 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20  of the loop..   
2a310 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c   */.    r1 = sql
2a320 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2a330 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74  Parse);.    test
2a340 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
2a350 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2a360 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a  RE_BTM_LIMIT );.
2a370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
2a380 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2a390 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
2a3a0 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20  IMIT );.    if( 
2a3b0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
2a3c0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42  Flags & (WHERE_B
2a3d0 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
2a3e0 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b  OP_LIMIT))!=0 ){
2a3f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2a400 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
2a410 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
2a420 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  nEq, r1);.      
2a430 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a440 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
2a450 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  r1, addrCont);. 
2a460 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2a470 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
2a480 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20  Parse, r1);..   
2a490 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
2a4a0 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
2a4b0 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
2a4c0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
2a4d0 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
2a4e0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
2a4f0 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
2a500 64 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69  d);.    if( !omi
2a510 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
2a520 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
2a530 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
2a540 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2a550 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
2a560 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2a570 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
2a580 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  xCur, iRowidReg)
2a590 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2a5a0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
2a5b0 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
2a5c0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
2a5d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a5e0 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20  Op2(v, OP_Seek, 
2a5f0 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
2a600 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73  ;  /* Deferred s
2a610 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  eek */.    }..  
2a620 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
2a630 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64  instruction used
2a640 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
2a650 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20  e loop. Disable 
2a660 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c  .    ** WHERE cl
2a670 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20  ause terms made 
2a680 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65  redundant by the
2a690 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61   index range sca
2a6a0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
2a6b0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
2a6c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  sFlags & WHERE_U
2a6d0 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 20 20 70  NIQUE ){.      p
2a6e0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
2a6f0 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
2a700 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
2a710 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
2a720 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  _Prev;.    }else
2a730 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
2a740 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
2a750 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
2a760 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
2a770 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
2a780 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2a790 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 20 29 7b  RE_COVER_SCAN ){
2a7a0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
2a7b0 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
2a7c0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
2a7d0 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
2a7e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
2a7f0 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
2a800 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
2a810 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a820 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
2a830 4e 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  N.  if( pLevel->
2a840 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2a850 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
2a860 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20  .    /* Case 4: 
2a870 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   Two or more sep
2a880 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20  arately indexed 
2a890 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
2a8a0 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20  by OR.    **.   
2a8b0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
2a8c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45   **.    **   CRE
2a8d0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62  ATE TABLE t1(a,b
2a8e0 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20  ,c,d);.    **   
2a8f0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
2a900 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a  ON t1(a);.    **
2a910 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
2a920 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20  i2 ON t1(b);.   
2a930 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
2a940 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a  EX i3 ON t1(c);.
2a950 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2a960 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2a970 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d   WHERE a=5 OR b=
2a980 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64  7 OR (c=11 AND d
2a990 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  =13).    **.    
2a9a0 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
2a9b0 65 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72  e, there are thr
2a9c0 65 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ee indexed terms
2a9d0 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
2a9e0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70  ..    ** The top
2a9f0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f   of the loop loo
2aa00 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ks like this:.  
2aa10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
2aa20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20       Null       
2aa30 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
2aa40 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73   # Zero the rows
2aa50 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20  et in reg 1.    
2aa60 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20  **.    ** Then, 
2aa70 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65 64  for each indexed
2aa80 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f   term, the follo
2aa90 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65  wing. The argume
2aaa0 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f  nts to.    ** Ro
2aab0 77 53 65 74 54 65 73 74 20 61 72 65 20 73 75 63  wSetTest are suc
2aac0 68 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  h that the rowid
2aad0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2aae0 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a  row is inserted.
2aaf0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
2ab00 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69 73  RowSet. If it is
2ab10 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
2ab20 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20  , control skips 
2ab30 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62  the.    ** Gosub
2ab40 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70   opcode and jump
2ab50 73 20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68  s straight to th
2ab60 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
2ab70 20 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a   by WhereEnd()..
2ab80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2ab90 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2aba0 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20  eBegin(<term>). 
2abb0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
2abc0 6f 77 53 65 74 54 65 73 74 20 20 20 20 20 20 20  owSetTest       
2abd0 20 20 20 20 20 20 20 20 20 20 20 23 20 49 6e 73             # Ins
2abe0 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72  ert rowid into r
2abf0 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20  owset.    **    
2ac00 20 20 20 20 20 20 47 6f 73 75 62 20 20 20 20 20        Gosub     
2ac10 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20   2 A.    **     
2ac20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2ac30 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nd().    **.    
2ac40 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** Following the
2ac50 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20   above, code to 
2ac60 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
2ac70 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65  op. Label A, the
2ac80 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f   target.    ** o
2ac90 66 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76  f the Gosub abov
2aca0 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20  e, jumps to the 
2acb0 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68  instruction righ
2acc0 74 20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f  t after the Goto
2acd0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2ace0 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20           Null   
2acf0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
2ad00 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20       # Zero the 
2ad10 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a  rowset in reg 1.
2ad20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
2ad30 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20 20  Goto       B    
2ad40 20 20 20 20 20 20 20 20 20 20 20 20 23 20 54 68              # Th
2ad50 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68  e loop is finish
2ad60 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
2ad70 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70  *       A: <loop
2ad80 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20   body>          
2ad90 20 20 20 20 20 20 20 23 20 52 65 74 75 72 6e 20         # Return 
2ada0 64 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a  data, whatever..
2adb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2adc0 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20         Return   
2add0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
2ade0 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74     # Jump back t
2adf0 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20  o the Gosub.    
2ae00 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
2ae10 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f  B: <after the lo
2ae20 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  op>.    **.    *
2ae30 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
2ae40 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
2ae50 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
2ae60 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
2ae70 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72  bterms */.    Sr
2ae80 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20  cList *pOrTab;  
2ae90 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65       /* Shortene
2aea0 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20  d table list or 
2aeb0 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61  OR-clause genera
2aec0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65  tion */.    Inde
2aed0 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20  x *pCov = 0;    
2aee0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65           /* Pote
2aef0 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69  ntial covering i
2af00 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  ndex (or NULL) *
2af10 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75  /.    int iCovCu
2af20 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2af30 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75  ++;  /* Cursor u
2af40 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63  sed for index sc
2af50 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ans (if any) */.
2af60 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
2af70 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
2af80 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
2af90 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
2afa0 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
2afb0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
2afc0 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2afe0 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
2aff0 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
2b000 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
2b010 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b030 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
2b040 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
2b050 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
2b060 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2b070 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
2b080 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
2b090 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
2b0a0 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
2b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0c0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
2b0d0 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
2b0e0 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
2b0f0 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
2b100 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
2b110 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
2b120 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
2b130 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
2b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b150 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2b160 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  nter */.    Expr
2b170 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20   *pAndExpr = 0; 
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b190 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e  * An ".. AND (..
2b1a0 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  .)" expression *
2b1b0 2f 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20  /.   .    pTerm 
2b1c0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
2b1d0 2e 70 54 65 72 6d 3b 0a 20 20 20 20 61 73 73 65  .pTerm;.    asse
2b1e0 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
2b1f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
2b200 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2b210 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65  O_OR );.    asse
2b220 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
2b230 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
2b240 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72  O)!=0 );.    pOr
2b250 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  Wc = &pTerm->u.p
2b260 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
2b270 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
2b280 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76  Return;.    pLev
2b290 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75  el->p1 = regRetu
2b2a0 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  rn;..    /* Set 
2b2b0 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  up a new SrcList
2b2c0 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61   in pOrTab conta
2b2d0 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
2b2e0 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20  being scanned.  
2b2f0 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f    ** by this loo
2b300 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c  p in the a[0] sl
2b310 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65  ot and all notRe
2b320 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b  ady tables in a[
2b330 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20  1..] slots..    
2b340 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20  ** This becomes 
2b350 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74  the SrcList in t
2b360 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
2b370 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
2b380 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  eBegin()..    */
2b390 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
2b3a0 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20  >nLevel>1 ){.   
2b3b0 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79     int nNotReady
2b3c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b3d0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
2b3e0 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  of notReady tabl
2b3f0 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  es */.      stru
2b400 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2b410 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a  *origSrc;     /*
2b420 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f   Original list o
2b430 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  f tables */.    
2b440 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57    nNotReady = pW
2b450 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69  Info->nLevel - i
2b460 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20  Level - 1;.     
2b470 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65   pOrTab = sqlite
2b480 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 70  3StackAllocRaw(p
2b490 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4b0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
2b4c0 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64  OrTab)+ nNotRead
2b4d0 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d  y*sizeof(pOrTab-
2b4e0 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69  >a[0]));.      i
2b4f0 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72  f( pOrTab==0 ) r
2b500 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a  eturn notReady;.
2b510 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41        pOrTab->nA
2b520 6c 6c 6f 63 20 3d 20 28 69 31 36 29 28 6e 4e 6f  lloc = (i16)(nNo
2b530 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20  tReady + 1);.   
2b540 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20     pOrTab->nSrc 
2b550 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63  = pOrTab->nAlloc
2b560 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
2b570 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74  OrTab->a, pTabIt
2b580 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62  em, sizeof(*pTab
2b590 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72  Item));.      or
2b5a0 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e  igSrc = pWInfo->
2b5b0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pTabList->a;.   
2b5c0 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e     for(k=1; k<=n
2b5d0 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a  NotReady; k++){.
2b5e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2b5f0 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f  pOrTab->a[k], &o
2b600 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d  rigSrc[pLevel[k]
2b610 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28  .iFrom], sizeof(
2b620 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a  pOrTab->a[k]));.
2b630 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2b640 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  e{.      pOrTab 
2b650 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2b660 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  st;.    }..    /
2b670 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2b680 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72   rowset register
2b690 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c   to contain NULL
2b6a0 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73  . An SQL NULL is
2b6b0 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c   .    ** equival
2b6c0 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ent to an empty 
2b6d0 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20  rowset..    **. 
2b6e0 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69     ** Also initi
2b6f0 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20  alize regReturn 
2b700 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61  to contain the a
2b710 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
2b720 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a  struction .    *
2b730 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
2b740 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52  llowing the OP_R
2b750 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74  eturn at the bot
2b760 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  tom of the loop.
2b770 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
2b780 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65  required in a fe
2b790 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a  w obscure LEFT J
2b7a0 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20  OIN cases where 
2b7b0 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20  control jumps.  
2b7c0 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f    ** over the to
2b7d0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e  p of the loop in
2b7e0 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69  to the body of i
2b7f0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
2b800 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72  the .    ** corr
2b810 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72  ect response for
2b820 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70   the end-of-loop
2b830 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65   code (the OP_Re
2b840 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20  turn) is to .   
2b850 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   ** fall through
2b860 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
2b870 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61  truction, just a
2b880 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65  s an OP_Next doe
2b890 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s if.    ** call
2b8a0 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69  ed on an uniniti
2b8b0 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20  alized cursor.. 
2b8c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
2b8d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2b8e0 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
2b8f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67  ==0 ){.      reg
2b900 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Rowset = ++pPars
2b910 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
2b920 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
2b930 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2b940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b950 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
2b960 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20   regRowset);.   
2b970 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20   }.    iRetInit 
2b980 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2b990 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2b9a0 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29  r, 0, regReturn)
2b9b0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2b9c0 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
2b9d0 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74  clause is z of t
2b9e0 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52  he form:  (x1 OR
2b9f0 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20   x2 OR ...) AND 
2ba00 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f  y.    ** Then fo
2ba10 72 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c  r every term xN,
2ba20 20 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65   evaluate as the
2ba30 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20   subexpression: 
2ba40 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20  xN AND z.    ** 
2ba50 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20  That way, terms 
2ba60 69 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61  in y that are fa
2ba70 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20  ctored into the 
2ba80 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  disjunction will
2ba90 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65  .    ** be picke
2baa0 64 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75  d up by the recu
2bab0 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73  rsive calls to s
2bac0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2bad0 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  () below..    **
2bae0 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  .    ** Actually
2baf0 2c 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73  , each subexpres
2bb00 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65  sion is converte
2bb10 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20  d to "xN AND w" 
2bb20 77 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a  where w is.    *
2bb30 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69  * the "interesti
2bb40 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d  ng" terms of z -
2bb50 20 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20   terms that did 
2bb60 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
2bb70 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f   the.    ** ON o
2bb80 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
2bb90 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
2bba0 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  nd terms that ar
2bbb0 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20  e usable as .   
2bbc0 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20   ** indices..   
2bbd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d   */.    if( pWC-
2bbe0 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20  >nTerm>1 ){.    
2bbf0 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20    int iTerm;.   
2bc00 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20     for(iTerm=0; 
2bc10 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d  iTerm<pWC->nTerm
2bc20 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; iTerm++){.    
2bc30 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
2bc40 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  = pWC->a[iTerm].
2bc50 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
2bc60 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
2bc70 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
2bc80 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75  mJoin) ) continu
2bc90 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
2bca0 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46  WC->a[iTerm].wtF
2bcb0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
2bcc0 54 55 41 4c 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  TUAL|TERM_ORINFO
2bcd0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2bce0 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e        if( (pWC->
2bcf0 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74  a[iTerm].eOperat
2bd00 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20  or & WO_ALL)==0 
2bd10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2bd20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2bd30 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
2bd40 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29  e->db, pExpr, 0)
2bd50 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  ;.        pAndEx
2bd60 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2bd70 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
2bd80 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29  pAndExpr, pExpr)
2bd90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bda0 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a  if( pAndExpr ){.
2bdb0 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
2bdc0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2bdd0 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20  pParse, TK_AND, 
2bde0 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b  0, pAndExpr, 0);
2bdf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2be00 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2be10 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69  <pOrWc->nTerm; i
2be20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72  i++){.      Wher
2be30 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d  eTerm *pOrTerm =
2be40 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a   &pOrWc->a[ii];.
2be50 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
2be60 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
2be70 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d  Cur || (pOrTerm-
2be80 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2be90 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
2bea0 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53     WhereInfo *pS
2beb0 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  ubWInfo;        
2bec0 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69    /* Info for si
2bed0 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61  ngle OR-term sca
2bee0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  n */.        Exp
2bef0 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72  r *pOrExpr = pOr
2bf00 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
2bf10 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70       if( pAndExp
2bf20 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
2bf30 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  AndExpr->pLeft =
2bf40 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20   pOrExpr;.      
2bf50 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41      pOrExpr = pA
2bf60 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  ndExpr;.        
2bf70 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  }.        /* Loo
2bf80 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
2bf90 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
2bfa0 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
2bfb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62   */.        pSub
2bfc0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
2bfd0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
2bfe0 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78 70  , pOrTab, pOrExp
2bff0 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
2c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c010 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
2c020 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41  _CLOSE | WHERE_A
2c030 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20  ND_ONLY |.      
2c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c050 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41    WHERE_FORCE_TA
2c060 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54  BLE | WHERE_ONET
2c070 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43  ABLE_ONLY, iCovC
2c080 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ur);.        ass
2c090 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20 7c  ert( pSubWInfo |
2c0a0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
2c0b0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
2c0c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
2c0d0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
2c0e0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
2c0f0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 76   WhereLevel *pLv
2c100 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  l;.          exp
2c110 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
2c120 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
2c130 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  e, pOrTab, &pSub
2c140 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65  WInfo->a[0], iLe
2c150 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72  vel, pLevel->iFr
2c160 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20  om, 0.          
2c170 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c180 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2c190 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
2c1a0 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
2c1b0 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d        int iSet =
2c1c0 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54   ((ii==pOrWc->nT
2c1d0 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20  erm-1)?-1:ii);. 
2c1e0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
2c1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 20  ;.            r 
2c200 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
2c210 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
2c220 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  e, pTabItem->pTa
2c230 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20  b, -1, iCur, .  
2c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c260 20 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c         regRowid,
2c270 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2c280 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c290 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53  p4Int(v, OP_RowS
2c2a0 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65  etTest, regRowse
2c2b0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2c2e0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c  urrentAddr(v)+2,
2c2f0 20 72 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20   r, iSet);.     
2c300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c320 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2c330 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70  regReturn, iLoop
2c340 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20  Body);..        
2c350 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e    /* The pSubWIn
2c360 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
2c370 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  s flag means tha
2c380 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20  t this OR term. 
2c390 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
2c3a0 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  ained one or mor
2c3b0 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20  e AND term from 
2c3c0 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  a notReady table
2c3d0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20  .  The.         
2c3e0 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74   ** terms from t
2c3f0 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  he notReady tabl
2c400 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74  e could not be t
2c410 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20  ested and will. 
2c420 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
2c430 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61   to be tested la
2c440 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ter..          *
2c450 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2c460 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
2c470 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73  tedTerms ) untes
2c480 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20  tedTerms = 1;.. 
2c490 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
2c4a0 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e  ll of the OR-con
2c4b0 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61 72 65  nected terms are
2c4c0 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
2c4d0 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
2c4e0 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e      ** index, an
2c4f0 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f  d the index is o
2c500 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
2c510 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  same cursor numb
2c520 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
2c530 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  by each call to 
2c540 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2c550 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68 69 73  n() made by this
2c560 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20   loop, it may.  
2c570 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f          ** be po
2c580 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68  ssible to use th
2c590 61 74 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f  at index as a co
2c5a0 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  vering index..  
2c5b0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2c5c0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63       ** If the c
2c5d0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
2c5e0 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65  ereBegin() above
2c5f0 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73   resulted in a s
2c600 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20  can that.       
2c610 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e     ** uses an in
2c620 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73  dex, and this is
2c630 20 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73   either the firs
2c640 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  t OR-connected t
2c650 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  erm.          **
2c660 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68   processed or th
2c670 65 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 73  e index is the s
2c680 61 6d 65 20 61 73 20 74 68 61 74 20 75 73 65 64  ame as that used
2c690 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73   by all previous
2c6a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
2c6b0 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f  rms, set pCov to
2c6c0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 63   the candidate c
2c6d0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f  overing index. O
2c6e0 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20  therwise, set . 
2c6f0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76           ** pCov
2c700 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69   to NULL to indi
2c710 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e  cate that no can
2c720 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20  didate covering 
2c730 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20  index will .    
2c740 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69        ** be avai
2c750 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20  lable..         
2c760 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4c   */.          pL
2c770 76 6c 20 3d 20 26 70 53 75 62 57 49 6e 66 6f 2d  vl = &pSubWInfo-
2c780 3e 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20  >a[0];.         
2c790 20 69 66 28 20 28 70 4c 76 6c 2d 3e 70 6c 61 6e   if( (pLvl->plan
2c7a0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2c7b0 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
2c7c0 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 76 6c          && (pLvl
2c7d0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2c7e0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
2c7f0 58 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  X)==0.          
2c800 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 4c   && (ii==0 || pL
2c810 76 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d  vl->plan.u.pIdx=
2c820 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20  =pCov).         
2c830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c840 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 69 49  assert( pLvl->iI
2c850 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29  dxCur==iCovCur )
2c860 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2c870 6f 76 20 3d 20 70 4c 76 6c 2d 3e 70 6c 61 6e 2e  ov = pLvl->plan.
2c880 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  u.pIdx;.        
2c890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c8a0 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20       pCov = 0;. 
2c8b0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
2c8c0 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20        /* Finish 
2c8d0 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68  the loop through
2c8e0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
2c8f0 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
2c900 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
2c910 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2c920 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b  eEnd(pSubWInfo);
2c930 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c940 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65   }.    }.    pLe
2c950 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d  vel->u.pCovidx =
2c960 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70   pCov;.    if( p
2c970 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49  Cov ) pLevel->iI
2c980 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b  dxCur = iCovCur;
2c990 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70  .    if( pAndExp
2c9a0 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45  r ){.      pAndE
2c9b0 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  xpr->pLeft = 0;.
2c9c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2c9d0 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
2c9e0 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20  db, pAndExpr);. 
2c9f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ca00 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
2ca10 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65  iRetInit, sqlite
2ca20 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2ca30 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (v));.    sqlite
2ca40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2ca50 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65  P_Goto, 0, pLeve
2ca60 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
2ca70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2ca80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f  lveLabel(v, iLoo
2ca90 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28  pBody);..    if(
2caa0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
2cab0 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b  1 ) sqlite3Stack
2cac0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
2cad0 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66   pOrTab);.    if
2cae0 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73  ( !untestedTerms
2caf0 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70   ) disableTerm(p
2cb00 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
2cb10 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
2cb20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
2cb30 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
2cb40 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  .  {.    /* Case
2cb50 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f   5:  There is no
2cb60 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20   usable index.  
2cb70 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d  We must do a com
2cb80 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  plete.    **    
2cb90 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68        scan of th
2cba0 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a  e entire table..
2cbb0 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
2cbc0 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70  c const u8 aStep
2cbd0 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20  [] = { OP_Next, 
2cbe0 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73  OP_Prev };.    s
2cbf0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
2cc00 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52  Start[] = { OP_R
2cc10 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d  ewind, OP_Last }
2cc20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 52  ;.    assert( bR
2cc30 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31  ev==0 || bRev==1
2cc40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2cc50 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
2cc60 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
2cc70 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20   aStep[bRev];.  
2cc80 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
2cc90 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
2cca0 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  >p2 = 1 + sqlite
2ccb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61  3VdbeAddOp2(v, a
2ccc0 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75  Start[bRev], iCu
2ccd0 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  r, addrBrk);.   
2cce0 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
2ccf0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
2cd00 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
2cd10 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20 26 3d   }.  notReady &=
2cd20 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70   ~getMask(pWC->p
2cd30 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
2cd40 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64  .  /* Insert cod
2cd50 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
2cd60 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
2cd70 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
2cd80 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74  tely.  ** comput
2cd90 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72  ed using the cur
2cda0 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c  rent set of tabl
2cdb0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d  es..  **.  ** IM
2cdc0 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
2cdd0 20 52 2d 34 39 35 32 35 2d 35 30 39 33 35 20 54   R-49525-50935 T
2cde0 65 72 6d 73 20 74 68 61 74 20 63 61 6e 6e 6f 74  erms that cannot
2cdf0 20 62 65 20 73 61 74 69 73 66 69 65 64 20 74 68   be satisfied th
2ce00 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 75  rough.  ** the u
2ce10 73 65 20 6f 66 20 69 6e 64 69 63 65 73 20 62 65  se of indices be
2ce20 63 6f 6d 65 20 74 65 73 74 73 20 74 68 61 74 20  come tests that 
2ce30 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 67  are evaluated ag
2ce40 61 69 6e 73 74 20 65 61 63 68 20 72 6f 77 20 6f  ainst each row o
2ce50 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 6c 65 76  f.  ** the relev
2ce60 61 6e 74 20 69 6e 70 75 74 20 74 61 62 6c 65 73  ant input tables
2ce70 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  ..  */.  for(pTe
2ce80 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
2ce90 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
2cea0 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
2ceb0 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74   Expr *pE;.    t
2cec0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
2ced0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
2cee0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d 50  IRTUAL ); /* IMP
2cef0 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
2cf00 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  */.    testcase(
2cf10 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
2cf20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
2cf30 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
2cf40 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
2cf50 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
2cf60 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
2cf70 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
2cf80 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65  rereqAll & notRe
2cf90 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ady)!=0 ){.     
2cfa0 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
2cfb0 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
2cfc0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
2cfd0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
2cfe0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2cff0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
2d000 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49  !=0 );.      pWI
2d010 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
2d020 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f  ms = 1;.      co
2d030 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
2d040 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
2d050 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
2d060 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   pE!=0 );.    if
2d070 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
2d080 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50  oin && !ExprHasP
2d090 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
2d0a0 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
2d0b0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2d0c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
2d0d0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
2d0e0 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53   pE, addrCont, S
2d0f0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
2d100 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  );.    pTerm->wt
2d110 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
2d120 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  DED;.  }..  /* F
2d130 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  or a LEFT OUTER 
2d140 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63  JOIN, generate c
2d150 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ode that will re
2d160 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
2d170 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74  at.  ** at least
2d180 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
2d190 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20  right table has 
2d1a0 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74  matched the left
2d1b0 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20   table.  .  */. 
2d1c0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
2d1d0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c  ftJoin ){.    pL
2d1e0 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20  evel->addrFirst 
2d1f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2d200 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2d210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d220 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2d230 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 1, pLevel->iLe
2d240 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62  ftJoin);.    Vdb
2d250 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
2d260 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68  cord LEFT JOIN h
2d270 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  it"));.    sqlit
2d280 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2d290 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f  (pParse);.    fo
2d2a0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
2d2b0 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72  j=0; j<pWC->nTer
2d2c0 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; j++, pTerm++)
2d2d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2d2e0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
2d2f0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
2d300 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30  );  /* IMP: R-30
2d310 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
2d320 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
2d330 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
2d340 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
2d350 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
2d360 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
2d370 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
2d380 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d390 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
2d3a0 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65  rereqAll & notRe
2d3b0 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ady)!=0 ){.     
2d3c0 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66     assert( pWInf
2d3d0 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
2d3e0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
2d3f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
2d400 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
2d410 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
2d420 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
2d430 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
2d440 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43  rm->pExpr, addrC
2d450 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
2d460 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70  IFNULL);.      p
2d470 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
2d480 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
2d490 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2d4a0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
2d4b0 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52  Parse, iReleaseR
2d4c0 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e  eg);..  return n
2d4d0 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20  otReady;.}..#if 
2d4e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2d4f0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  EST)./*.** The f
2d500 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
2d510 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20 64  e holds a text d
2d520 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71 75  escription of qu
2d530 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61 74  ery plan generat
2d540 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73  ed.** by the mos
2d550 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f  t recent call to
2d560 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2d570 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c 6c  in().  Each call
2d580 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a 2a   to WhereBegin.*
2d590 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  * overwrites the
2d5a0 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69 73   previous.  This
2d5b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2d5c0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
2d5d0 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73   and.** analysis
2d5e0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73   only..*/.char s
2d5f0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2d600 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a  n[BMS*2*40];  /*
2d610 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f 69   Text of the joi
2d620 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
2d630 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20  nQPlan = 0;     
2d640 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
2d650 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71   free slow in _q
2d660 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a  uery_plan[] */..
2d670 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2d680 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  _TEST */.../*.**
2d690 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
2d6a0 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
2d6b0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2d6c0 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
2d6d0 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
2d6e0 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
2d6f0 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
2d700 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2d710 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e   for(i=0; i<pWIn
2d720 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  fo->nLevel; i++)
2d730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2d740 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66  index_info *pInf
2d750 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d  o = pWInfo->a[i]
2d760 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
2d770 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
2d780 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
2d790 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72   pInfo->needToFr
2d7a0 65 65 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64  eeIdxStr==0 || d
2d7b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2d7c0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ); */.        if
2d7d0 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  ( pInfo->needToF
2d7e0 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20  reeIdxStr ){.   
2d7f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2d800 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74  ree(pInfo->idxSt
2d810 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
2d820 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2d830 72 65 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a  ree(db, pInfo);.
2d840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2d850 28 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  ( pWInfo->a[i].p
2d860 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2d870 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29  ERE_TEMP_INDEX )
2d880 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  {.        Index 
2d890 2a 70 49 64 78 20 3d 20 70 57 49 6e 66 6f 2d 3e  *pIdx = pWInfo->
2d8a0 61 5b 69 5d 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  a[i].plan.u.pIdx
2d8b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
2d8c0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dx ){.          
2d8d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2d8e0 2c 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 29  , pIdx->zColAff)
2d8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2d900 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2d910 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dx);.        }. 
2d920 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2d930 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
2d940 72 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a  r(pWInfo->pWC);.
2d950 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d960 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
2d970 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
2d980 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
2d990 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
2d9a0 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
2d9b0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2d9c0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
2d9d0 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
2d9e0 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
2d9f0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
2da00 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
2da10 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
2da20 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
2da30 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
2da40 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
2da50 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
2da60 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
2da70 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
2da80 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
2da90 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
2daa0 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
2dab0 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
2dac0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
2dad0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2dae0 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
2daf0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
2db00 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
2db10 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
2db20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
2db30 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
2db40 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
2db50 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2db60 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
2db70 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
2db80 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
2db90 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
2dba0 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
2dbb0 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
2dbc0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2dbd0 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
2dbe0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
2dbf0 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
2dc00 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
2dc10 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
2dc20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
2dc30 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
2dc40 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
2dc50 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
2dc60 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2dc70 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
2dc80 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
2dc90 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
2dca0 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
2dcb0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
2dcc0 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
2dcd0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
2dce0 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
2dcf0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
2dd00 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
2dd10 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
2dd20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd40 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
2dd50 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
2dd60 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
2dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
2dd80 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
2dd90 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
2dda0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
2ddb0 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
2ddc0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2ddd0 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
2dde0 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
2ddf0 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
2de00 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
2de10 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2de20 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
2de30 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
2de40 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
2de50 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
2de60 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
2de70 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
2de80 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
2de90 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
2dea0 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
2deb0 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
2dec0 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
2ded0 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
2dee0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
2def0 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
2df00 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
2df10 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
2df20 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
2df30 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
2df40 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
2df50 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
2df60 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
2df70 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
2df80 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
2df90 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
2dfa0 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
2dfb0 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
2dfc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
2dfd0 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
2dfe0 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
2dff0 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
2e000 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
2e010 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
2e020 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
2e030 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
2e040 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
2e050 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
2e060 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
2e070 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
2e080 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
2e090 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
2e0a0 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
2e0b0 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
2e0c0 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
2e0d0 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
2e0e0 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
2e0f0 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
2e100 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
2e110 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
2e120 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
2e130 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
2e140 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2e150 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
2e160 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
2e170 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
2e180 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
2e190 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
2e1a0 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
2e1b0 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
2e1c0 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
2e1d0 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
2e1e0 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
2e1f0 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
2e200 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2e210 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
2e220 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
2e230 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
2e240 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
2e250 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
2e260 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
2e270 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
2e280 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
2e290 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
2e2a0 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
2e2b0 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
2e2c0 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
2e2d0 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
2e2e0 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
2e2f0 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
2e300 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
2e310 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
2e320 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
2e330 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
2e340 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
2e350 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
2e360 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
2e370 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
2e380 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
2e390 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
2e3a0 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
2e3b0 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
2e3c0 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
2e3d0 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
2e3e0 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
2e3f0 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
2e400 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
2e410 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
2e420 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
2e430 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
2e440 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
2e450 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
2e460 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
2e470 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
2e480 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
2e490 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
2e4a0 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
2e4b0 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
2e4c0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
2e4d0 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
2e4e0 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
2e4f0 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
2e500 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
2e510 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
2e520 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
2e530 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
2e540 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
2e550 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
2e560 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
2e570 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
2e580 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
2e590 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
2e5a0 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
2e5b0 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
2e5c0 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
2e5d0 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
2e5e0 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72  ING.**.** pOrder
2e5f0 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
2e600 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
2e610 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
2e620 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
2e630 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
2e640 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
2e650 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
2e660 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
2e670 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
2e680 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
2e690 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
2e6a0 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65  ment, then pOrde
2e6b0 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
2e6c0 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  ** If an index c
2e6d0 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68  an be used so th
2e6e0 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f  at the natural o
2e6f0 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74  utput order of t
2e700 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e  he table.** scan
2e710 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20   is correct for 
2e720 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2e730 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69  use, then that i
2e740 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64  ndex is used and
2e750 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64  .** the returned
2e760 20 57 68 65 72 65 49 6e 66 6f 2e 6e 4f 42 53 61   WhereInfo.nOBSa
2e770 74 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74  t field is set t
2e780 6f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  o pOrderBy->nExp
2e790 72 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 61  r.  This.** is a
2e7a0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74  n optimization t
2e7b0 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e 20  hat prevents an 
2e7c0 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74  unnecessary sort
2e7d0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
2e7e0 65 74 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 64 65  et.** if an inde
2e7f0 78 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  x appropriate fo
2e800 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
2e810 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78  lause already ex
2e820 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ists..**.** If t
2e830 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
2e840 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20  loops cannot be 
2e850 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76  arranged to prov
2e860 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  ide the correct.
2e870 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c  ** output order,
2e880 20 74 68 65 6e 20 57 68 65 72 65 49 6e 66 6f 2e   then WhereInfo.
2e890 6e 4f 42 53 61 74 20 69 73 20 30 2e 0a 2a 2f 0a  nOBSat is 0..*/.
2e8a0 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74  WhereInfo *sqlit
2e8b0 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20  e3WhereBegin(.  
2e8c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2e8d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
2e8e0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
2e8f0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2e900 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74  st,    /* A list
2e910 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
2e920 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
2e930 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
2e940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2e950 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2e960 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2e970 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44  rBy,   /* An ORD
2e980 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72  ER BY clause, or
2e990 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
2e9a0 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c 20  ist *pDistinct, 
2e9b0 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 2d 6c   /* The select-l
2e9c0 69 73 74 20 66 6f 72 20 44 49 53 54 49 4e 43 54  ist for DISTINCT
2e9d0 20 71 75 65 72 69 65 73 20 2d 20 6f 72 20 4e 55   queries - or NU
2e9e0 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  LL */.  u16 wctr
2e9f0 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
2ea00 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   One of the WHER
2ea10 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
2ea20 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
2ea30 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
2ea40 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r           /* I
2ea50 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  f WHERE_ONETABLE
2ea60 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e  _ONLY is set, in
2ea70 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  dex cursor numbe
2ea80 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  r */.){.  int nB
2ea90 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
2eaa0 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
2eab0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
2eac0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
2ead0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
2eae0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
2eaf0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2eb00 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
2eb10 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
2eb20 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
2eb30 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
2eb40 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
2eb50 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
2eb60 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
2eb70 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2eb80 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
2eb90 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
2eba0 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
2ebb0 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
2ebc0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
2ebd0 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
2ebe0 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
2ebf0 57 68 65 72 65 42 65 73 74 49 64 78 20 73 57 42  WhereBestIdx sWB
2ec00 49 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  I;         /* Be
2ec10 73 74 20 69 6e 64 65 78 20 73 65 61 72 63 68 20  st index search 
2ec20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
2ec30 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
2ec40 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65  Set;    /* The e
2ec50 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
2ec60 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  et */.  WhereLev
2ec70 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20  el *pLevel;     
2ec80 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
2ec90 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e  evel in pWInfo->
2eca0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  a[] */.  int iFr
2ecb0 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  om;             
2ecc0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
2ecd0 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  sed FROM clause 
2ece0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
2ecf0 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20   andFlags;      
2ed00 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65          /* AND-e
2ed10 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
2ed20 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e 77 74   all pWC->a[].wt
2ed30 46 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69  Flags */.  int i
2ed40 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2ed50 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2ed60 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  unter */.  sqlit
2ed70 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
2ed80 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
2ed90 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
2eda0 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20  ..  /* Variable 
2edb0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
2edc0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 42 49  /.  memset(&sWBI
2edd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 42 49  , 0, sizeof(sWBI
2ede0 29 29 3b 0a 20 20 73 57 42 49 2e 70 50 61 72 73  ));.  sWBI.pPars
2edf0 65 20 3d 20 70 50 61 72 73 65 3b 0a 0a 20 20 2f  e = pParse;..  /
2ee00 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2ee10 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2ee20 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
2ee30 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
2ee40 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
2ee50 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
2ee60 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
2ee70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42  TabList->nSrc==B
2ee80 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  MS );.  if( pTab
2ee90 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
2eea0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
2eeb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
2eec0 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
2eed0 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
2eee0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
2eef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
2ef00 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c  function normall
2ef10 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65  y generates a ne
2ef20 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c  sted loop for al
2ef30 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a  l tables in .  *
2ef40 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74  * pTabList.  But
2ef50 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e   if the WHERE_ON
2ef60 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
2ef70 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65   is set, then we
2ef80 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c   should.  ** onl
2ef90 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  y generate code 
2efa0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61  for the first ta
2efb0 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20  ble in pTabList 
2efc0 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a  and assume that.
2efd0 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73    ** any cursors
2efe0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2eff0 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c   subsequent tabl
2f000 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c  es are uninitial
2f010 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61  ized..  */.  nTa
2f020 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c  bList = (wctrlFl
2f030 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
2f040 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a  ABLE_ONLY) ? 1 :
2f050 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
2f060 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2f070 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
2f080 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
2f090 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
2f0a0 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
2f0b0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41   return value. A
2f0c0 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
2f0d0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  on is used to st
2f0e0 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ore the WhereInf
2f0f0 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74  o.  ** struct, t
2f100 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57  he contents of W
2f110 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68  hereInfo.a[], th
2f120 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
2f130 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64  ructure.  ** and
2f140 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   the WhereMaskSe
2f150 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e  t structure. Sin
2f160 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  ce WhereClause c
2f170 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74  ontains an 8-byt
2f180 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79  e.  ** field (ty
2f190 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d  pe Bitmask) it m
2f1a0 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f  ust be aligned o
2f1b0 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  n an 8-byte boun
2f1c0 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d  dary on.  ** som
2f1d0 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  e architectures.
2f1e0 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44   Hence the ROUND
2f1f0 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  8() below..  */.
2f200 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2f210 62 3b 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20  b;.  nByteWInfo 
2f220 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2f230 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62  WhereInfo)+(nTab
2f240 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57  List-1)*sizeof(W
2f250 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70  hereLevel));.  p
2f260 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
2f270 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
2f280 0a 20 20 20 20 20 20 6e 42 79 74 65 57 49 6e 66  .      nByteWInf
2f290 6f 20 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f  o + .      sizeo
2f2a0 66 28 57 68 65 72 65 43 6c 61 75 73 65 29 20 2b  f(WhereClause) +
2f2b0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68  .      sizeof(Wh
2f2c0 65 72 65 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b  ereMaskSet).  );
2f2d0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2f2e0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
2f2f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2f300 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
2f310 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
2f320 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2f330 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
2f340 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c  ->nLevel = nTabL
2f350 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
2f360 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2f370 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
2f380 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
2f390 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
2f3a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2f3b0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49  eLabel(v);.  pWI
2f3c0 6e 66 6f 2d 3e 70 57 43 20 3d 20 73 57 42 49 2e  nfo->pWC = sWBI.
2f3d0 70 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75  pWC = (WhereClau
2f3e0 73 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49  se *)&((u8 *)pWI
2f3f0 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d  nfo)[nByteWInfo]
2f400 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  ;.  pWInfo->wctr
2f410 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
2f420 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  ags;.  pWInfo->s
2f430 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
2f440 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
2f450 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  oop;.  pMaskSet 
2f460 3d 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  = (WhereMaskSet*
2f470 29 26 73 57 42 49 2e 70 57 43 5b 31 5d 3b 0a 20  )&sWBI.pWC[1];. 
2f480 20 73 57 42 49 2e 61 4c 65 76 65 6c 20 3d 20 70   sWBI.aLevel = p
2f490 57 49 6e 66 6f 2d 3e 61 3b 0a 0a 20 20 2f 2a 20  WInfo->a;..  /* 
2f4a0 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54  Disable the DIST
2f4b0 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f  INCT optimizatio
2f4c0 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74  n if SQLITE_Dist
2f4d0 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76  inctOpt is set v
2f4e0 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ia.  ** sqlite3_
2f4f0 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45  test_ctrl(SQLITE
2f500 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
2f510 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a  ZATIONS,...) */.
2f520 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
2f530 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
2f540 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
2f550 74 29 20 29 20 70 44 69 73 74 69 6e 63 74 20 3d  t) ) pDistinct =
2f560 20 30 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20   0;..  /* Split 
2f570 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2f580 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
2f590 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
2f5a0 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
2f5b0 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
2f5c0 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
2f5d0 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
2f5e0 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
2f5f0 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65  pMaskSet);.  whe
2f600 72 65 43 6c 61 75 73 65 49 6e 69 74 28 73 57 42  reClauseInit(sWB
2f610 49 2e 70 57 43 2c 20 70 50 61 72 73 65 2c 20 70  I.pWC, pParse, p
2f620 4d 61 73 6b 53 65 74 2c 20 77 63 74 72 6c 46 6c  MaskSet, wctrlFl
2f630 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ags);.  sqlite3E
2f640 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73  xprCodeConstants
2f650 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29  (pParse, pWhere)
2f660 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 73  ;.  whereSplit(s
2f670 57 42 49 2e 70 57 43 2c 20 70 57 68 65 72 65 2c  WBI.pWC, pWhere,
2f680 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20 49   TK_AND);   /* I
2f690 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32 39  MP: R-15842-5329
2f6a0 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53  6 */.    .  /* S
2f6b0 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57  pecial case: a W
2f6c0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
2f6d0 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45   is constant.  E
2f6e0 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a  valuate the.  **
2f6f0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
2f700 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72  either jump over
2f710 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
2f720 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20   or fall thru.. 
2f730 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
2f740 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30   && (nTabList==0
2f750 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
2f760 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
2f770 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20  (pWhere)) ){.   
2f780 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
2f790 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65  lse(pParse, pWhe
2f7a0 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  re, pWInfo->iBre
2f7b0 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ak, SQLITE_JUMPI
2f7c0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65  FNULL);.    pWhe
2f7d0 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  re = 0;.  }..  /
2f7e0 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
2f7f0 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
2f800 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
2f810 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2f820 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
2f830 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61   assigning bitma
2f840 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f  sk values to FRO
2f850 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73  M clause cursors
2f860 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a  , it must be.  *
2f870 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  * the case that 
2f880 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
2f890 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  ask for the N-th
2f8a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2f8b0 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  m then.  ** the 
2f8c0 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
2f8d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
2f8e0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
2f8f0 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20   the N-th term. 
2f900 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20   ** is (X-1).   
2f910 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
2f920 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
2f930 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
2f940 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73  can use.  ** its
2f950 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
2f960 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66  Table value to f
2f970 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ind the bitmask 
2f980 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
2f990 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a  le.  ** of the j
2f9a0 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e  oin.  Subtractin
2f9b0 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72  g one from the r
2f9c0 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61  ight table bitma
2f9d0 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20  sk gives a.  ** 
2f9e0 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
2f9f0 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
2fa00 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ft of the join. 
2fa10 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
2fa20 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c  mask.  ** for al
2fa30 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
2fa40 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a  left of a left j
2fa50 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  oin is important
2fa60 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
2fa70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
2fa80 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72  that bitmasks ar
2fa90 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
2faa0 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  l pTabList->nSrc
2fab0 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20   tables in.  ** 
2fac0 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
2fad0 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
2fae0 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
2faf0 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
2fb00 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74  lly.  ** equal t
2fb10 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  o pTabList->nSrc
2fb20 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68   but might be sh
2fb30 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20  ortened to 1 if 
2fb40 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f  the.  ** WHERE_O
2fb50 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
2fb60 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  g is set..  */. 
2fb70 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
2fb80 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
2fb90 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
2fba0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
2fbb0 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
2fbc0 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e  ursor);.  }.#ifn
2fbd0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20  def NDEBUG.  {. 
2fbe0 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65     Bitmask toThe
2fbf0 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Left = 0;.    fo
2fc00 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c  r(ii=0; ii<pTabL
2fc10 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29  ist->nSrc; ii++)
2fc20 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
2fc30 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  m = getMask(pMas
2fc40 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2fc50 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
2fc60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d        assert( (m
2fc70 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29  -1)==toTheLeft )
2fc80 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66  ;.      toTheLef
2fc90 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20  t |= m;.    }.  
2fca0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
2fcb0 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68  nalyze all of th
2fcc0 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
2fcd0 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70  .  Note that exp
2fce0 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74  rAnalyze() might
2fcf0 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69  .  ** add new vi
2fd00 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f  rtual terms onto
2fd10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2fd20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57  WHERE clause.  W
2fd30 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61  e do not.  ** wa
2fd40 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  nt to analyze th
2fd50 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ese virtual term
2fd60 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c  s, so start anal
2fd70 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  yzing at the end
2fd80 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66  .  ** and work f
2fd90 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74  orward so that t
2fda0 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c  he added virtual
2fdb0 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72   terms are never
2fdc0 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f   processed..  */
2fdd0 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  .  exprAnalyzeAl
2fde0 6c 28 70 54 61 62 4c 69 73 74 2c 20 73 57 42 49  l(pTabList, sWBI
2fdf0 2e 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d  .pWC);.  if( db-
2fe00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
2fe10 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
2fe20 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a  eginError;.  }..
2fe30 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
2fe40 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
2fe50 66 69 65 72 2c 20 69 66 20 74 68 65 72 65 20 69  fier, if there i
2fe60 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e 64  s one, is redund
2fe70 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69 74  ant. .  ** If it
2fe80 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20 70 44   is, then set pD
2fe90 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c 20  istinct to NULL 
2fea0 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e 65 44  and WhereInfo.eD
2feb0 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a 20  istinct to.  ** 
2fec0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2fed0 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20 74 68  NIQUE to tell th
2fee0 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e 6f  e caller to igno
2fef0 72 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 2e  re the DISTINCT.
2ff00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 69 73  .  */.  if( pDis
2ff10 74 69 6e 63 74 20 26 26 20 69 73 44 69 73 74 69  tinct && isDisti
2ff20 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61  nctRedundant(pPa
2ff30 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 73  rse, pTabList, s
2ff40 57 42 49 2e 70 57 43 2c 20 70 44 69 73 74 69 6e  WBI.pWC, pDistin
2ff50 63 74 29 20 29 7b 0a 20 20 20 20 70 44 69 73 74  ct) ){.    pDist
2ff60 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 70 57  inct = 0;.    pW
2ff70 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
2ff80 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
2ff90 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a 20 20  _UNIQUE;.  }..  
2ffa0 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65 73  /* Chose the bes
2ffb0 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  t index to use f
2ffc0 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
2ffd0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2ffe0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
2fff0 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74   loop fills in t
30000 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
30010 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  lds:.  **.  **  
30020 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64   pWInfo->a[].pId
30030 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65 78  x      The index
30040 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
30050 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f   level of the lo
30060 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  op..  **   pWInf
30070 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20 20  o->a[].wsFlags  
30080 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73   WHERE_xxx flags
30090 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
300a0 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49   pIdx.  **   pWI
300b0 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20  nfo->a[].nEq    
300c0 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66     The number of
300d0 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
300e0 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57  raints.  **   pW
300f0 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20  Info->a[].iFrom 
30100 20 20 20 20 57 68 69 63 68 20 74 65 72 6d 20 6f      Which term o
30110 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
30120 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  e is being coded
30130 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
30140 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68  a[].iTabCur   Th
30150 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
30160 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  r the database t
30170 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e  able.  **   pWIn
30180 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20  fo->a[].iIdxCur 
30190 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f    The VDBE curso
301a0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  r for the index.
301b0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
301c0 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57 68 65  [].pTerm     Whe
301d0 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52  n wsFlags==WO_OR
301e0 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 20  , the OR-clause 
301f0 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  term.  **.  ** T
30200 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69  his loop also fi
30210 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e 65  gures out the ne
30220 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 74  sting order of t
30230 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
30240 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20  M.  ** clause.. 
30250 20 2a 2f 0a 20 20 73 57 42 49 2e 6e 6f 74 56 61   */.  sWBI.notVa
30260 6c 69 64 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  lid = ~(Bitmask)
30270 30 3b 0a 20 20 73 57 42 49 2e 70 4f 72 64 65 72  0;.  sWBI.pOrder
30280 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
30290 20 73 57 42 49 2e 6e 20 3d 20 6e 54 61 62 4c 69   sWBI.n = nTabLi
302a0 73 74 3b 0a 20 20 73 57 42 49 2e 70 44 69 73 74  st;.  sWBI.pDist
302b0 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74  inct = pDistinct
302c0 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e  ;.  andFlags = ~
302d0 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  0;.  WHERETRACE(
302e0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
302f0 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  Start ***\n"));.
30300 20 20 66 6f 72 28 73 57 42 49 2e 69 3d 69 46 72    for(sWBI.i=iFr
30310 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  om=0, pLevel=pWI
30320 6e 66 6f 2d 3e 61 3b 20 73 57 42 49 2e 69 3c 6e  nfo->a; sWBI.i<n
30330 54 61 62 4c 69 73 74 3b 20 73 57 42 49 2e 69 2b  TabList; sWBI.i+
30340 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
30350 20 20 57 68 65 72 65 43 6f 73 74 20 62 65 73 74    WhereCost best
30360 50 6c 61 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  Plan;         /*
30370 20 4d 6f 73 74 20 65 66 66 69 63 69 65 6e 74 20   Most efficient 
30380 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66 61 72  plan seen so far
30390 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
303a0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
303b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72      /* Index for
303c0 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70   FROM table at p
303d0 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69  TabItem */.    i
303e0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
303f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
30400 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46  r looping over F
30410 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ROM tables */.  
30420 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d 31    int bestJ = -1
30430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
30440 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20   The value of j 
30450 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  */.    Bitmask m
30460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30470 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61     /* Bitmask va
30480 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73  lue for j or bes
30490 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  tJ */.    int is
304a0 4f 70 74 69 6d 61 6c 3b 20 20 20 20 20 20 20 20  Optimal;        
304b0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
304c0 72 20 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f  r for optimal/no
304d0 6e 2d 6f 70 74 69 6d 61 6c 20 73 65 61 72 63 68  n-optimal search
304e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 6b 4f 70   */.    int ckOp
304f0 74 69 6d 61 6c 3b 20 20 20 20 20 20 20 20 20 20  timal;          
30500 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 6f 70      /* Do the op
30510 74 69 6d 61 6c 20 73 63 61 6e 20 63 68 65 63 6b  timal scan check
30520 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e 63   */.    int nUnc
30530 6f 6e 73 74 72 61 69 6e 65 64 3b 20 20 20 20 20  onstrained;     
30540 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 61      /* Number ta
30550 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 44  bles without IND
30560 45 58 45 44 20 42 59 20 2a 2f 0a 20 20 20 20 42  EXED BY */.    B
30570 69 74 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78 65  itmask notIndexe
30580 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  d;         /* Ma
30590 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  sk of tables tha
305a0 74 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20  t cannot use an 
305b0 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d 65  index */..    me
305c0 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20  mset(&bestPlan, 
305d0 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c  0, sizeof(bestPl
305e0 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c  an));.    bestPl
305f0 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54  an.rCost = SQLIT
30600 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 57  E_BIG_DBL;.    W
30610 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
30620 42 65 67 69 6e 20 73 65 61 72 63 68 20 66 6f 72  Begin search for
30630 20 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22 2c   loop %d ***\n",
30640 20 73 57 42 49 2e 69 29 29 3b 0a 0a 20 20 20 20   sWBI.i));..    
30650 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
30660 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 65 6e  the remaining en
30670 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  tries in the FRO
30680 4d 20 63 6c 61 75 73 65 20 74 6f 20 66 69 6e 64  M clause to find
30690 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74   the.    ** next
306a0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54 68   nested loop. Th
306b0 65 20 6c 6f 6f 70 20 74 65 73 74 73 20 61 6c 6c  e loop tests all
306c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74   FROM clause ent
306d0 72 69 65 73 0a 20 20 20 20 2a 2a 20 65 69 74 68  ries.    ** eith
306e0 65 72 20 6f 6e 63 65 20 6f 72 20 74 77 69 63 65  er once or twice
306f0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
30700 20 54 68 65 20 66 69 72 73 74 20 74 65 73 74 20   The first test 
30710 69 73 20 61 6c 77 61 79 73 20 70 65 72 66 6f 72  is always perfor
30720 6d 65 64 20 69 66 20 74 68 65 72 65 20 61 72 65  med if there are
30730 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74   two or more ent
30740 72 69 65 73 0a 20 20 20 20 2a 2a 20 72 65 6d 61  ries.    ** rema
30750 69 6e 69 6e 67 20 61 6e 64 20 6e 65 76 65 72 20  ining and never 
30760 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65  performed if the
30770 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 46  re is only one F
30780 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ROM clause entry
30790 0a 20 20 20 20 2a 2a 20 74 6f 20 63 68 6f 6f 73  .    ** to choos
307a0 65 20 66 72 6f 6d 2e 20 20 54 68 65 20 66 69 72  e from.  The fir
307b0 73 74 20 74 65 73 74 20 6c 6f 6f 6b 73 20 66 6f  st test looks fo
307c0 72 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 73  r an "optimal" s
307d0 63 61 6e 2e 20 20 49 6e 0a 20 20 20 20 2a 2a 20  can.  In.    ** 
307e0 74 68 69 73 20 63 6f 6e 74 65 78 74 20 61 6e 20  this context an 
307f0 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 69 73 20  optimal scan is 
30800 6f 6e 65 20 74 68 61 74 20 75 73 65 73 20 74 68  one that uses th
30810 65 20 73 61 6d 65 20 73 74 72 61 74 65 67 79 0a  e same strategy.
30820 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 67      ** for the g
30830 69 76 65 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  iven FROM clause
30840 20 65 6e 74 72 79 20 61 73 20 77 6f 75 6c 64 20   entry as would 
30850 62 65 20 73 65 6c 65 63 74 65 64 20 69 66 20 74  be selected if t
30860 68 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20  he entry.    ** 
30870 77 65 72 65 20 75 73 65 64 20 61 73 20 74 68 65  were used as the
30880 20 69 6e 6e 65 72 6d 6f 73 74 20 6e 65 73 74 65   innermost neste
30890 64 20 6c 6f 6f 70 2e 20 20 49 6e 20 6f 74 68 65  d loop.  In othe
308a0 72 20 77 6f 72 64 73 2c 20 61 20 74 61 62 6c 65  r words, a table
308b0 0a 20 20 20 20 2a 2a 20 69 73 20 63 68 6f 73 65  .    ** is chose
308c0 6e 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  n such that the 
308d0 63 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20  cost of running 
308e0 74 68 61 74 20 74 61 62 6c 65 20 63 61 6e 6e 6f  that table canno
308f0 74 20 62 65 20 72 65 64 75 63 65 64 0a 20 20 20  t be reduced.   
30900 20 2a 2a 20 62 79 20 77 61 69 74 69 6e 67 20 66   ** by waiting f
30910 6f 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  or other tables 
30920 74 6f 20 72 75 6e 20 66 69 72 73 74 2e 20 20 54  to run first.  T
30930 68 69 73 20 22 6f 70 74 69 6d 61 6c 22 20 74 65  his "optimal" te
30940 73 74 20 77 6f 72 6b 73 0a 20 20 20 20 2a 2a 20  st works.    ** 
30950 62 79 20 66 69 72 73 74 20 61 73 73 75 6d 69 6e  by first assumin
30960 67 20 74 68 61 74 20 74 68 65 20 46 52 4f 4d 20  g that the FROM 
30970 63 6c 61 75 73 65 20 69 73 20 6f 6e 20 74 68 65  clause is on the
30980 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 6e 64 20   inner loop and 
30990 66 69 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 69  finding.    ** i
309a0 74 73 20 71 75 65 72 79 20 70 6c 61 6e 2c 20 74  ts query plan, t
309b0 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  hen checking to 
309c0 73 65 65 20 69 66 20 74 68 61 74 20 71 75 65 72  see if that quer
309d0 79 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 79 0a  y plan uses any.
309e0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 46 52 4f      ** other FRO
309f0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  M clause terms t
30a00 68 61 74 20 61 72 65 20 73 57 42 49 2e 6e 6f 74  hat are sWBI.not
30a10 56 61 6c 69 64 2e 20 20 49 66 20 6e 6f 20 6e 6f  Valid.  If no no
30a20 74 56 61 6c 69 64 20 74 65 72 6d 73 0a 20 20 20  tValid terms.   
30a30 20 2a 2a 20 61 72 65 20 75 73 65 64 20 74 68 65   ** are used the
30a40 6e 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20  n the "optimal" 
30a50 71 75 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b 73  query plan works
30a60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
30a70 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 57 68  Note that the Wh
30a80 65 72 65 43 6f 73 74 2e 6e 52 6f 77 20 70 61 72  ereCost.nRow par
30a90 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
30aa0 74 69 6d 61 6c 20 73 63 61 6e 20 6d 69 67 68 74  timal scan might
30ab0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  .    ** not be a
30ac0 73 20 73 6d 61 6c 6c 20 61 73 20 69 74 20 77 6f  s small as it wo
30ad0 75 6c 64 20 62 65 20 69 66 20 74 68 65 20 74 61  uld be if the ta
30ae0 62 6c 65 20 72 65 61 6c 6c 79 20 77 65 72 65 20  ble really were 
30af0 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 0a 20 20  the innermost.  
30b00 20 20 2a 2a 20 6a 6f 69 6e 2e 20 20 54 68 65 20    ** join.  The 
30b10 6e 52 6f 77 20 76 61 6c 75 65 20 63 61 6e 20 62  nRow value can b
30b20 65 20 72 65 64 75 63 65 64 20 62 79 20 57 48 45  e reduced by WHE
30b30 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
30b40 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74 68 61  aints.    ** tha
30b50 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 69 6e 64  t do not use ind
30b60 69 63 65 73 2e 20 20 42 75 74 20 74 68 69 73 20  ices.  But this 
30b70 6e 52 6f 77 20 72 65 64 75 63 74 69 6f 6e 20 6f  nRow reduction o
30b80 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
30b90 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  he.    ** table 
30ba0 72 65 61 6c 6c 79 20 69 73 20 74 68 65 20 69 6e  really is the in
30bb0 6e 65 72 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20 0a  nermost join.  .
30bc0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
30bd0 65 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69 74  e second loop it
30be0 65 72 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  eration is only 
30bf0 70 65 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f 20  performed if no 
30c00 6f 70 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20 20  optimal scan.   
30c10 20 2a 2a 20 73 74 72 61 74 65 67 69 65 73 20 77   ** strategies w
30c20 65 72 65 20 66 6f 75 6e 64 20 62 79 20 74 68 65  ere found by the
30c30 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
30c40 2e 20 54 68 69 73 20 73 65 63 6f 6e 64 20 69 74  . This second it
30c50 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  eration.    ** i
30c60 73 20 75 73 65 64 20 74 6f 20 73 65 61 72 63 68  s used to search
30c70 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 73 74 20   for the lowest 
30c80 63 6f 73 74 20 73 63 61 6e 20 6f 76 65 72 61 6c  cost scan overal
30c90 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
30ca0 20 57 69 74 68 6f 75 74 20 74 68 65 20 6f 70 74   Without the opt
30cb0 69 6d 61 6c 20 73 63 61 6e 20 73 74 65 70 20 28  imal scan step (
30cc0 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
30cd0 69 6f 6e 29 20 61 20 73 75 62 6f 70 74 69 6d 61  ion) a suboptima
30ce0 6c 0a 20 20 20 20 2a 2a 20 70 6c 61 6e 20 6d 69  l.    ** plan mi
30cf0 67 68 74 20 62 65 20 63 68 6f 73 65 6e 20 66 6f  ght be chosen fo
30d00 72 20 71 75 65 72 69 65 73 20 6c 69 6b 65 20 74  r queries like t
30d10 68 69 73 3a 0a 20 20 20 20 2a 2a 20 20 20 0a 20  his:.    **   . 
30d20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
30d30 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 20 0a  ABLE t1(a, b); .
30d40 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
30d50 54 41 42 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a  TABLE t2(c, d);.
30d60 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
30d70 2a 20 46 52 4f 4d 20 74 32 2c 20 74 31 20 57 48  * FROM t2, t1 WH
30d80 45 52 45 20 74 32 2e 72 6f 77 69 64 20 3d 20 74  ERE t2.rowid = t
30d90 31 2e 61 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  1.a;.    **.    
30da0 2a 2a 20 54 68 65 20 62 65 73 74 20 73 74 72 61  ** The best stra
30db0 74 65 67 79 20 69 73 20 74 6f 20 69 74 65 72 61  tegy is to itera
30dc0 74 65 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  te through table
30dd0 20 74 31 20 66 69 72 73 74 2e 20 48 6f 77 65 76   t1 first. Howev
30de0 65 72 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  er it.    ** is 
30df0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
30e00 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73 20 77  determine this w
30e10 69 74 68 20 61 20 73 69 6d 70 6c 65 20 67 72 65  ith a simple gre
30e20 65 64 79 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20  edy algorithm.. 
30e30 20 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20     ** Since the 
30e40 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72  cost of a linear
30e50 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61   scan through ta
30e60 62 6c 65 20 74 32 20 69 73 20 74 68 65 20 73 61  ble t2 is the sa
30e70 6d 65 20 0a 20 20 20 20 2a 2a 20 61 73 20 74 68  me .    ** as th
30e80 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65  e cost of a line
30e90 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
30ea0 74 61 62 6c 65 20 74 31 2c 20 61 20 73 69 6d 70  table t1, a simp
30eb0 6c 65 20 67 72 65 65 64 79 20 0a 20 20 20 20 2a  le greedy .    *
30ec0 2a 20 61 6c 67 6f 72 69 74 68 6d 20 6d 61 79 20  * algorithm may 
30ed0 63 68 6f 6f 73 65 20 74 6f 20 75 73 65 20 74 32  choose to use t2
30ee0 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c   for the outer l
30ef0 6f 6f 70 2c 20 77 68 69 63 68 20 69 73 20 61 20  oop, which is a 
30f00 6d 75 63 68 0a 20 20 20 20 2a 2a 20 63 6f 73 74  much.    ** cost
30f10 6c 69 65 72 20 61 70 70 72 6f 61 63 68 2e 0a 20  lier approach.. 
30f20 20 20 20 2a 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e     */.    nUncon
30f30 73 74 72 61 69 6e 65 64 20 3d 20 30 3b 0a 20 20  strained = 0;.  
30f40 20 20 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 30    notIndexed = 0
30f50 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  ;..    /* The op
30f60 74 69 6d 61 6c 20 73 63 61 6e 20 63 68 65 63 6b  timal scan check
30f70 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 20   only occurs if 
30f80 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
30f90 20 6d 6f 72 65 20 74 61 62 6c 65 73 0a 20 20 20   more tables.   
30fa0 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   ** available to
30fb0 20 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f   be reordered */
30fc0 0a 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d  .    if( iFrom==
30fd0 6e 54 61 62 4c 69 73 74 2d 31 20 29 7b 0a 20 20  nTabList-1 ){.  
30fe0 20 20 20 20 63 6b 4f 70 74 69 6d 61 6c 20 3d 20      ckOptimal = 
30ff0 30 3b 20 20 2f 2a 20 43 6f 6d 6d 6f 6e 20 63 61  0;  /* Common ca
31000 73 65 20 6f 66 20 6a 75 73 74 20 6f 6e 65 20 74  se of just one t
31010 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
31020 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 7d   clause */.    }
31030 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6b 4f 70  else{.      ckOp
31040 74 69 6d 61 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  timal = -1;.    
31050 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 73    for(j=iFrom, s
31060 57 42 49 2e 70 53 72 63 3d 26 70 54 61 62 4c 69  WBI.pSrc=&pTabLi
31070 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62  st->a[j]; j<nTab
31080 4c 69 73 74 3b 20 6a 2b 2b 2c 20 73 57 42 49 2e  List; j++, sWBI.
31090 70 53 72 63 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pSrc++){.       
310a0 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   m = getMask(pMa
310b0 73 6b 53 65 74 2c 20 73 57 42 49 2e 70 53 72 63  skSet, sWBI.pSrc
310c0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
310d0 20 20 20 20 69 66 28 20 28 6d 20 26 20 73 57 42      if( (m & sWB
310e0 49 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d 30 20 29  I.notValid)==0 )
310f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
31100 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d  j==iFrom ) iFrom
31110 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
31120 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
31130 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
31140 69 46 72 6f 6d 20 26 26 20 28 73 57 42 49 2e 70  iFrom && (sWBI.p
31150 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
31160 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
31170 53 29 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  S))!=0 ) break;.
31180 20 20 20 20 20 20 20 20 69 66 28 20 2b 2b 63 6b          if( ++ck
31190 4f 70 74 69 6d 61 6c 20 29 20 62 72 65 61 6b 3b  Optimal ) break;
311a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 73 57  .        if( (sW
311b0 42 49 2e 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  BI.pSrc->jointyp
311c0 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
311d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
311e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
311f0 74 28 20 63 6b 4f 70 74 69 6d 61 6c 3d 3d 30 20  t( ckOptimal==0 
31200 7c 7c 20 63 6b 4f 70 74 69 6d 61 6c 3d 3d 31 20  || ckOptimal==1 
31210 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 73 4f 70  );..    for(isOp
31220 74 69 6d 61 6c 3d 63 6b 4f 70 74 69 6d 61 6c 3b  timal=ckOptimal;
31230 20 69 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26   isOptimal>=0 &&
31240 20 62 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69   bestJ<0; isOpti
31250 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 66 6f  mal--){.      fo
31260 72 28 6a 3d 69 46 72 6f 6d 2c 20 73 57 42 49 2e  r(j=iFrom, sWBI.
31270 70 53 72 63 3d 26 70 54 61 62 4c 69 73 74 2d 3e  pSrc=&pTabList->
31280 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74  a[j]; j<nTabList
31290 3b 20 6a 2b 2b 2c 20 73 57 42 49 2e 70 53 72 63  ; j++, sWBI.pSrc
312a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
312b0 20 6a 3e 69 46 72 6f 6d 20 26 26 20 28 73 57 42   j>iFrom && (sWB
312c0 49 2e 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65  I.pSrc->jointype
312d0 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
312e0 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20  ROSS))!=0 ){.   
312f0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
31300 72 65 61 6b 20 61 6e 64 20 6f 6e 65 20 6c 69 6b  reak and one lik
31310 65 20 69 74 20 69 6e 20 74 68 65 20 63 6b 4f 70  e it in the ckOp
31320 74 69 6d 61 6c 20 63 6f 6d 70 75 74 61 74 69 6f  timal computatio
31330 6e 20 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20  n loop.         
31340 20 2a 2a 20 61 62 6f 76 65 20 70 72 65 76 65 6e   ** above preven
31350 74 20 74 61 62 6c 65 20 72 65 6f 72 64 65 72 69  t table reorderi
31360 6e 67 20 61 63 72 6f 73 73 20 4c 45 46 54 20 61  ng across LEFT a
31370 6e 64 20 43 52 4f 53 53 20 4a 4f 49 4e 73 2e 0a  nd CROSS JOINs..
31380 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65            ** The
31390 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 20   LEFT JOIN case 
313a0 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
313b0 20 63 6f 72 72 65 63 74 6e 65 73 73 2e 20 20 54   correctness.  T
313c0 68 65 20 70 72 6f 68 69 62 69 74 69 6f 6e 0a 20  he prohibition. 
313d0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 67 61 69           ** agai
313e0 6e 73 74 20 72 65 6f 72 64 65 72 69 6e 67 20 61  nst reordering a
313f0 63 72 6f 73 73 20 61 20 43 52 4f 53 53 20 4a 4f  cross a CROSS JO
31400 49 4e 20 69 73 20 61 6e 20 53 51 4c 69 74 65 20  IN is an SQLite 
31410 66 65 61 74 75 72 65 20 74 68 61 74 0a 20 20 20  feature that.   
31420 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 77 73         ** allows
31430 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 20 74   the developer t
31440 6f 20 63 6f 6e 74 72 6f 6c 20 74 61 62 6c 65 20  o control table 
31450 72 65 6f 72 64 65 72 69 6e 67 20 2a 2f 0a 20 20  reordering */.  
31460 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
31470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31480 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   m = getMask(pMa
31490 73 6b 53 65 74 2c 20 73 57 42 49 2e 70 53 72 63  skSet, sWBI.pSrc
314a0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
314b0 20 20 20 20 69 66 28 20 28 6d 20 26 20 73 57 42      if( (m & sWB
314c0 49 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d 30 20 29  I.notValid)==0 )
314d0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
314e0 72 74 28 20 6a 3e 69 46 72 6f 6d 20 29 3b 0a 20  rt( j>iFrom );. 
314f0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
31500 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
31510 20 20 20 20 20 73 57 42 49 2e 6e 6f 74 52 65 61       sWBI.notRea
31520 64 79 20 3d 20 28 69 73 4f 70 74 69 6d 61 6c 20  dy = (isOptimal 
31530 3f 20 6d 20 3a 20 73 57 42 49 2e 6e 6f 74 56 61  ? m : sWBI.notVa
31540 6c 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  lid);.        if
31550 28 20 73 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e  ( sWBI.pSrc->pIn
31560 64 65 78 3d 3d 30 20 29 20 6e 55 6e 63 6f 6e 73  dex==0 ) nUncons
31570 74 72 61 69 6e 65 64 2b 2b 3b 0a 20 20 0a 20 20  trained++;.  .  
31580 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
31590 28 28 22 20 20 20 3d 3d 3d 20 74 72 79 69 6e 67  (("   === trying
315a0 20 74 61 62 6c 65 20 25 64 20 28 25 73 29 20 77   table %d (%s) w
315b0 69 74 68 20 69 73 4f 70 74 69 6d 61 6c 3d 25 64  ith isOptimal=%d
315c0 20 3d 3d 3d 5c 6e 22 2c 0a 20 20 20 20 20 20 20   ===\n",.       
315d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20               j, 
315e0 73 57 42 49 2e 70 53 72 63 2d 3e 70 54 61 62 2d  sWBI.pSrc->pTab-
315f0 3e 7a 4e 61 6d 65 2c 20 69 73 4f 70 74 69 6d 61  >zName, isOptima
31600 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l));.        ass
31610 65 72 74 28 20 73 57 42 49 2e 70 53 72 63 2d 3e  ert( sWBI.pSrc->
31620 70 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  pTab );.#ifndef 
31630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
31640 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
31650 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 73   if( IsVirtual(s
31660 57 42 49 2e 70 53 72 63 2d 3e 70 54 61 62 29 20  WBI.pSrc->pTab) 
31670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 57 42  ){.          sWB
31680 49 2e 70 70 49 64 78 49 6e 66 6f 20 3d 20 26 70  I.ppIdxInfo = &p
31690 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78  WInfo->a[j].pIdx
316a0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
316b0 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78  bestVirtualIndex
316c0 28 26 73 57 42 49 29 3b 0a 20 20 20 20 20 20 20  (&sWBI);.       
316d0 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20   }else .#endif. 
316e0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
316f0 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65     bestBtreeInde
31700 78 28 26 73 57 42 49 29 3b 0a 20 20 20 20 20 20  x(&sWBI);.      
31710 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
31720 72 74 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c 7c  rt( isOptimal ||
31730 20 28 73 57 42 49 2e 63 6f 73 74 2e 75 73 65 64   (sWBI.cost.used
31740 26 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3d  &sWBI.notValid)=
31750 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  =0 );..        /
31760 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20  * If an INDEXED 
31770 42 59 20 63 6c 61 75 73 65 20 69 73 20 70 72 65  BY clause is pre
31780 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 70  sent, then the p
31790 6c 61 6e 20 6d 75 73 74 20 75 73 65 20 74 68 61  lan must use tha
317a0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  t.        ** ind
317b0 65 78 20 69 66 20 69 74 20 75 73 65 73 20 61 6e  ex if it uses an
317c0 79 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 20 2a  y index at all *
317d0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
317e0 28 20 73 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e  ( sWBI.pSrc->pIn
317f0 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  dex==0 .        
31800 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 57            || (sW
31810 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46  BI.cost.plan.wsF
31820 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
31830 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20  _FULLSCAN)==0.  
31840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31850 7c 7c 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61  || sWBI.cost.pla
31860 6e 2e 75 2e 70 49 64 78 3d 3d 73 57 42 49 2e 70  n.u.pIdx==sWBI.p
31870 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 3b 0a 0a  Src->pIndex );..
31880 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70          if( isOp
31890 74 69 6d 61 6c 20 26 26 20 28 73 57 42 49 2e 63  timal && (sWBI.c
318a0 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
318b0 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
318c0 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  LSCAN)==0 ){.   
318d0 20 20 20 20 20 20 20 6e 6f 74 49 6e 64 65 78 65         notIndexe
318e0 64 20 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20  d |= m;.        
318f0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
31900 4f 70 74 69 6d 61 6c 20 29 7b 0a 20 20 20 20 20  Optimal ){.     
31910 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 6a       pWInfo->a[j
31920 5d 2e 72 4f 70 74 43 6f 73 74 20 3d 20 73 57 42  ].rOptCost = sWB
31930 49 2e 63 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20  I.cost.rCost;.  
31940 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
31950 63 6b 4f 70 74 69 6d 61 6c 20 29 7b 0a 20 20 20  ckOptimal ){.   
31960 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 77 6f         /* If two
31970 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 20   or more tables 
31980 68 61 76 65 20 6e 65 61 72 6c 79 20 74 68 65 20  have nearly the 
31990 73 61 6d 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20  same outer loop 
319a0 63 6f 73 74 2c 20 62 75 74 0a 20 20 20 20 20 20  cost, but.      
319b0 20 20 20 20 2a 2a 20 76 65 72 79 20 64 69 66 66      ** very diff
319c0 65 72 65 6e 74 20 69 6e 6e 65 72 20 6c 6f 6f 70  erent inner loop
319d0 20 28 6f 70 74 69 6d 61 6c 29 20 63 6f 73 74 2c   (optimal) cost,
319e0 20 77 65 20 77 61 6e 74 20 74 6f 20 63 68 6f 6f   we want to choo
319f0 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  se.          ** 
31a00 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c 6f  for the outer lo
31a10 6f 70 20 74 68 61 74 20 74 61 62 6c 65 20 77 68  op that table wh
31a20 69 63 68 20 62 65 6e 65 66 69 74 73 20 74 68 65  ich benefits the
31a30 20 6c 65 61 73 74 20 66 72 6f 6d 0a 20 20 20 20   least from.    
31a40 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 69        ** being i
31a50 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
31a60 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
31a70 20 63 6f 64 65 20 73 63 61 6c 65 73 20 74 68 65   code scales the
31a80 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
31a90 75 74 65 72 20 6c 6f 6f 70 20 63 6f 73 74 20 65  uter loop cost e
31aa0 73 74 69 6d 61 74 65 20 74 6f 20 61 63 63 6f 6d  stimate to accom
31ab0 70 6c 69 73 68 20 74 68 61 74 2e 20 2a 2f 0a 20  plish that. */. 
31ac0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52           WHERETR
31ad0 41 43 45 28 28 22 20 20 20 73 63 61 6c 69 6e 67  ACE(("   scaling
31ae0 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e 31 66 20   cost from %.1f 
31af0 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a 20 20 20 20  to %.1f\n",.    
31b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b10 20 20 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f 73    sWBI.cost.rCos
31b20 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
31b30 20 20 20 20 20 20 20 20 20 73 57 42 49 2e 63 6f           sWBI.co
31b40 73 74 2e 72 43 6f 73 74 2f 70 57 49 6e 66 6f 2d  st.rCost/pWInfo-
31b50 3e 61 5b 6a 5d 2e 72 4f 70 74 43 6f 73 74 29 29  >a[j].rOptCost))
31b60 3b 0a 20 20 20 20 20 20 20 20 20 20 73 57 42 49  ;.          sWBI
31b70 2e 63 6f 73 74 2e 72 43 6f 73 74 20 2f 3d 20 70  .cost.rCost /= p
31b80 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 72 4f 70 74  WInfo->a[j].rOpt
31b90 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Cost;.        }.
31ba0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64  .        /* Cond
31bb0 69 74 69 6f 6e 73 20 75 6e 64 65 72 20 77 68 69  itions under whi
31bc0 63 68 20 74 68 69 73 20 74 61 62 6c 65 20 62 65  ch this table be
31bd0 63 6f 6d 65 73 20 74 68 65 20 62 65 73 74 20 73  comes the best s
31be0 6f 20 66 61 72 3a 0a 20 20 20 20 20 20 20 20 2a  o far:.        *
31bf0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28  *.        **   (
31c00 31 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73  1) The table mus
31c10 74 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20  t not depend on 
31c20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 68 61  other tables tha
31c30 74 20 68 61 76 65 20 6e 6f 74 0a 20 20 20 20 20  t have not.     
31c40 20 20 20 2a 2a 20 20 20 20 20 20 20 79 65 74 20     **       yet 
31c50 72 75 6e 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  run.  (In other 
31c60 77 6f 72 64 73 2c 20 69 74 20 6d 75 73 74 20 6e  words, it must n
31c70 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20 74 61 62  ot depend on tab
31c80 6c 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  les.        **  
31c90 20 20 20 20 20 69 6e 20 69 6e 6e 65 72 20 6c 6f       in inner lo
31ca0 6f 70 73 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a  ops.).        **
31cb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 32  .        **   (2
31cc0 29 20 28 54 68 69 73 20 72 75 6c 65 20 77 61 73  ) (This rule was
31cd0 20 72 65 6d 6f 76 65 64 20 6f 6e 20 32 30 31 32   removed on 2012
31ce0 2d 31 31 2d 30 39 2e 20 20 54 68 65 20 73 63 61  -11-09.  The sca
31cf0 6c 69 6e 67 20 6f 66 20 74 68 65 0a 20 20 20 20  ling of the.    
31d00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 73      **       cos
31d10 74 20 75 73 69 6e 67 20 74 68 65 20 6f 70 74 69  t using the opti
31d20 6d 61 6c 20 73 63 61 6e 20 63 6f 73 74 20 6d 61  mal scan cost ma
31d30 64 65 20 74 68 69 73 20 72 75 6c 65 20 6f 62 73  de this rule obs
31d40 6f 6c 65 74 65 2e 29 0a 20 20 20 20 20 20 20 20  olete.).        
31d50 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
31d60 28 33 29 20 41 6c 6c 20 74 61 62 6c 65 73 20 68  (3) All tables h
31d70 61 76 65 20 61 6e 20 49 4e 44 45 58 45 44 20 42  ave an INDEXED B
31d80 59 20 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73  Y clause or this
31d90 20 74 61 62 6c 65 20 6c 61 63 6b 73 20 61 6e 0a   table lacks an.
31da0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
31db0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
31dc0 73 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65  se or this table
31dd0 20 75 73 65 73 20 74 68 65 20 73 70 65 63 69 66   uses the specif
31de0 69 63 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ic.        **   
31df0 20 20 20 20 69 6e 64 65 78 20 73 70 65 63 69 66      index specif
31e00 69 65 64 20 62 79 20 69 74 73 20 49 4e 44 45 58  ied by its INDEX
31e10 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ED BY clause.  T
31e20 68 69 73 20 72 75 6c 65 20 65 6e 73 75 72 65 73  his rule ensures
31e30 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
31e40 20 20 74 68 61 74 20 61 20 62 65 73 74 2d 73 6f    that a best-so
31e50 2d 66 61 72 20 69 73 20 61 6c 77 61 79 73 20 73  -far is always s
31e60 65 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  elected even if 
31e70 61 6e 20 69 6d 70 6f 73 73 69 62 6c 65 0a 20 20  an impossible.  
31e80 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63        **       c
31e90 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 49 4e  ombination of IN
31ea0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 73  DEXED BY clauses
31eb0 20 61 72 65 20 67 69 76 65 6e 2e 20 20 54 68 65   are given.  The
31ec0 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 2a   error.        *
31ed0 2a 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20  *       will be 
31ee0 64 65 74 65 63 74 65 64 20 61 6e 64 20 72 65 6c  detected and rel
31ef0 61 79 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  ayed back to the
31f00 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6c 61 74   application lat
31f10 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  er..        **  
31f20 20 20 20 20 20 54 68 65 20 4e 45 56 45 52 28 29       The NEVER()
31f30 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 62 65 63   comes about bec
31f40 61 75 73 65 20 72 75 6c 65 20 28 32 29 20 61 62  ause rule (2) ab
31f50 6f 76 65 20 70 72 65 76 65 6e 74 73 0a 20 20 20  ove prevents.   
31f60 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 6e       **       An
31f70 20 69 6e 64 65 78 61 62 6c 65 20 66 75 6c 6c 2d   indexable full-
31f80 74 61 62 6c 65 2d 73 63 61 6e 20 66 72 6f 6d 20  table-scan from 
31f90 72 65 61 63 68 69 6e 67 20 72 75 6c 65 20 28 33  reaching rule (3
31fa0 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  )..        **.  
31fb0 20 20 20 20 20 20 2a 2a 20 20 20 28 34 29 20 54        **   (4) T
31fc0 68 65 20 70 6c 61 6e 20 63 6f 73 74 20 6d 75 73  he plan cost mus
31fd0 74 20 62 65 20 6c 6f 77 65 72 20 74 68 61 6e 20  t be lower than 
31fe0 70 72 69 6f 72 20 70 6c 61 6e 73 2c 20 77 68 65  prior plans, whe
31ff0 72 65 20 22 63 6f 73 74 22 0a 20 20 20 20 20 20  re "cost".      
32000 20 20 2a 2a 20 20 20 20 20 20 20 69 73 20 64 65    **       is de
32010 66 69 6e 65 64 20 62 79 20 74 68 65 20 63 6f 6d  fined by the com
32020 70 61 72 65 43 6f 73 74 28 29 20 66 75 6e 63 74  pareCost() funct
32030 69 6f 6e 20 61 62 6f 76 65 2e 20 0a 20 20 20 20  ion above. .    
32040 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
32050 66 28 20 28 73 57 42 49 2e 63 6f 73 74 2e 75 73  f( (sWBI.cost.us
32060 65 64 26 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64  ed&sWBI.notValid
32070 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  )==0            
32080 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a          /* (1) *
32090 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  /.            &&
320a0 20 28 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64   (nUnconstrained
320b0 3d 3d 30 20 7c 7c 20 73 57 42 49 2e 70 53 72 63  ==0 || sWBI.pSrc
320c0 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 20 20 20 20  ->pIndex==0     
320d0 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
320e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
320f0 4e 45 56 45 52 28 28 73 57 42 49 2e 63 6f 73 74  NEVER((sWBI.cost
32100 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
32110 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
32120 41 4e 29 21 3d 30 29 29 0a 20 20 20 20 20 20 20  AN)!=0)).       
32130 20 20 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30       && (bestJ<0
32140 20 7c 7c 20 63 6f 6d 70 61 72 65 43 6f 73 74 28   || compareCost(
32150 26 73 57 42 49 2e 63 6f 73 74 2c 20 26 62 65 73  &sWBI.cost, &bes
32160 74 50 6c 61 6e 29 29 20 20 20 2f 2a 20 28 34 29  tPlan))   /* (4)
32170 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
32180 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52           WHERETR
32190 41 43 45 28 28 22 20 20 20 3d 3d 3d 20 74 61 62  ACE(("   === tab
321a0 6c 65 20 25 64 20 28 25 73 29 20 69 73 20 62 65  le %d (%s) is be
321b0 73 74 20 73 6f 20 66 61 72 5c 6e 22 0a 20 20 20  st so far\n".   
321c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321d0 20 20 20 22 20 20 20 20 20 20 20 63 6f 73 74 3d     "       cost=
321e0 25 2e 31 66 2c 20 6e 52 6f 77 3d 25 2e 31 66 2c  %.1f, nRow=%.1f,
321f0 20 6e 4f 42 53 61 74 3d 25 64 2c 20 77 73 46 6c   nOBSat=%d, wsFl
32200 61 67 73 3d 25 30 38 78 5c 6e 22 2c 0a 20 20 20  ags=%08x\n",.   
32210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32220 20 20 20 6a 2c 20 73 57 42 49 2e 70 53 72 63 2d     j, sWBI.pSrc-
32230 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  >pTab->zName,.  
32240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32250 20 20 20 20 73 57 42 49 2e 63 6f 73 74 2e 72 43      sWBI.cost.rC
32260 6f 73 74 2c 20 73 57 42 49 2e 63 6f 73 74 2e 70  ost, sWBI.cost.p
32270 6c 61 6e 2e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  lan.nRow,.      
32280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32290 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e  sWBI.cost.plan.n
322a0 4f 42 53 61 74 2c 20 73 57 42 49 2e 63 6f 73 74  OBSat, sWBI.cost
322b0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 29 29 3b  .plan.wsFlags));
322c0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 50  .          bestP
322d0 6c 61 6e 20 3d 20 73 57 42 49 2e 63 6f 73 74 3b  lan = sWBI.cost;
322e0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 4a  .          bestJ
322f0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = j;.        }.
32300 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61  .        /* In a
32310 20 6a 6f 69 6e 20 6c 69 6b 65 20 22 77 20 4a 4f   join like "w JO
32320 49 4e 20 78 20 4c 45 46 54 20 4a 4f 49 4e 20 79  IN x LEFT JOIN y
32330 20 4a 4f 49 4e 20 7a 22 20 20 6d 61 6b 65 20 73   JOIN z"  make s
32340 75 72 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ure that.       
32350 20 2a 2a 20 74 61 62 6c 65 20 79 20 28 61 6e 64   ** table y (and
32360 20 6e 6f 74 20 74 61 62 6c 65 20 7a 29 20 69 73   not table z) is
32370 20 61 6c 77 61 79 73 20 74 68 65 20 6e 65 78 74   always the next
32380 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 6e 73 69   inner loop insi
32390 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  de.        ** of
323a0 20 74 61 62 6c 65 20 78 2e 20 2a 2f 0a 20 20 20   table x. */.   
323b0 20 20 20 20 20 69 66 28 20 28 73 57 42 49 2e 70       if( (sWBI.p
323c0 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
323d0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 20 62 72  JT_LEFT)!=0 ) br
323e0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
323f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 62   }.    assert( b
32400 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20 61  estJ>=0 );.    a
32410 73 73 65 72 74 28 20 73 57 42 49 2e 6e 6f 74 56  ssert( sWBI.notV
32420 61 6c 69 64 20 26 20 67 65 74 4d 61 73 6b 28 70  alid & getMask(p
32430 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
32440 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72  t->a[bestJ].iCur
32450 73 6f 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65  sor) );.    asse
32460 72 74 28 20 62 65 73 74 4a 3d 3d 69 46 72 6f 6d  rt( bestJ==iFrom
32470 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61   || (pTabList->a
32480 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65  [iFrom].jointype
32490 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29   & JT_LEFT)==0 )
324a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
324b0 62 65 73 74 4a 3e 69 46 72 6f 6d 20 26 26 20 28  bestJ>iFrom && (
324c0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 46 72 6f  pTabList->a[iFro
324d0 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m].jointype & JT
324e0 5f 43 52 4f 53 53 29 21 3d 30 20 29 3b 0a 20 20  _CROSS)!=0 );.  
324f0 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73 74    testcase( best
32500 4a 3e 69 46 72 6f 6d 20 26 26 20 62 65 73 74 4a  J>iFrom && bestJ
32510 3c 6e 54 61 62 4c 69 73 74 2d 31 0a 20 20 20 20  <nTabList-1.    
32520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32530 20 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69        && (pTabLi
32540 73 74 2d 3e 61 5b 62 65 73 74 4a 2b 31 5d 2e 6a  st->a[bestJ+1].j
32550 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
32560 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 57 48 45  T)!=0 );.    WHE
32570 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
32580 74 69 6d 69 7a 65 72 20 73 65 6c 65 63 74 73 20  timizer selects 
32590 74 61 62 6c 65 20 25 64 20 28 25 73 29 20 66 6f  table %d (%s) fo
325a0 72 20 6c 6f 6f 70 20 25 64 20 77 69 74 68 3a 5c  r loop %d with:\
325b0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
325c0 20 20 20 22 20 20 20 20 63 6f 73 74 3d 25 2e 31     "    cost=%.1
325d0 66 2c 20 6e 52 6f 77 3d 25 2e 31 66 2c 20 6e 4f  f, nRow=%.1f, nO
325e0 42 53 61 74 3d 25 64 2c 20 77 73 46 6c 61 67 73  BSat=%d, wsFlags
325f0 3d 30 78 25 30 38 78 5c 6e 22 2c 0a 20 20 20 20  =0x%08x\n",.    
32600 20 20 20 20 20 20 20 20 20 20 20 20 62 65 73 74              best
32610 4a 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  J, pTabList->a[b
32620 65 73 74 4a 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d  estJ].pTab->zNam
32630 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
32640 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f     pLevel-pWInfo
32650 2d 3e 61 2c 20 62 65 73 74 50 6c 61 6e 2e 72 43  ->a, bestPlan.rC
32660 6f 73 74 2c 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ost, bestPlan.pl
32670 61 6e 2e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  an.nRow,.       
32680 20 20 20 20 20 20 20 20 20 62 65 73 74 50 6c 61           bestPla
32690 6e 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 2c 20 62  n.plan.nOBSat, b
326a0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
326b0 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20  lags));.    if( 
326c0 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
326d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  sFlags & WHERE_D
326e0 49 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20  ISTINCT)!=0 ){. 
326f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
32700 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
32710 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 );.      pWInf
32720 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
32730 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
32740 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  DERED;.    }.   
32750 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73   andFlags &= bes
32760 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
32770 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  gs;.    pLevel->
32780 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61 6e 2e  plan = bestPlan.
32790 70 6c 61 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  plan;.    pLevel
327a0 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61 62  ->iTabCur = pTab
327b0 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
327c0 43 75 72 73 6f 72 3b 0a 20 20 20 20 74 65 73 74  Cursor;.    test
327d0 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70  case( bestPlan.p
327e0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
327f0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20  ERE_INDEXED );. 
32800 20 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73     testcase( bes
32810 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
32820 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
32830 49 4e 44 45 58 20 29 3b 0a 20 20 20 20 69 66 28  INDEX );.    if(
32840 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77   bestPlan.plan.w
32850 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
32860 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 54 45  INDEXED|WHERE_TE
32870 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  MP_INDEX) ){.   
32880 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
32890 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
328a0 42 4c 45 5f 4f 4e 4c 59 29 20 0a 20 20 20 20 20  BLE_ONLY) .     
328b0 20 20 26 26 20 28 62 65 73 74 50 6c 61 6e 2e 70    && (bestPlan.p
328c0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
328d0 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3d  ERE_TEMP_INDEX)=
328e0 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =0 .      ){.   
328f0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
32900 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a  xCur = iIdxCur;.
32910 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32920 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
32930 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
32940 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Tab++;.      }. 
32950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32960 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
32970 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
32980 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 20 26 3d  sWBI.notValid &=
32990 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53   ~getMask(pMaskS
329a0 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
329b0 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b  bestJ].iCursor);
329c0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
329d0 6f 6d 20 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a  om = (u8)bestJ;.
329e0 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e      if( bestPlan
329f0 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d 28 64 6f 75  .plan.nRow>=(dou
32a00 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 20 20 70  ble)1 ){.      p
32a10 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
32a20 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c  p *= bestPlan.pl
32a30 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 0a  an.nRow;.    }..
32a40 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
32a50 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  t if the table s
32a60 63 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c  canned by this l
32a70 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 68 61  oop iteration ha
32a80 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44 45  d an.    ** INDE
32a90 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 61 74  XED BY clause at
32aa0 74 61 63 68 65 64 20 74 6f 20 69 74 2c 20 74 68  tached to it, th
32ab0 61 74 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  at the named ind
32ac0 65 78 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  ex is being.    
32ad0 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  ** used for the 
32ae0 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74 68  scan. If not, th
32af0 65 6e 20 71 75 65 72 79 20 63 6f 6d 70 69 6c 61  en query compila
32b00 74 69 6f 6e 20 68 61 73 20 66 61 69 6c 65 64 2e  tion has failed.
32b10 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61  .    ** Return a
32b20 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  n error..    */.
32b30 20 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 4c      pIdx = pTabL
32b40 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 49  ist->a[bestJ].pI
32b50 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
32b60 64 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  dx ){.      if( 
32b70 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
32b80 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
32b90 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20 20  NDEXED)==0 ){.  
32ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
32bb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
32bc0 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a  annot use index:
32bd0 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
32be0 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
32bf0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
32c00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
32c10 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
32c20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
32c30 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 62  e is used, the b
32c40 65 73 74 49 6e 64 65 78 28 29 20 66 75 6e 63 74  estIndex() funct
32c50 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20 2a  ion is.        *
32c60 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
32c70 66 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20 73  find the index s
32c80 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
32c90 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
32ca0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  e.        ** if 
32cb0 69 74 20 66 69 6e 64 20 61 6e 20 69 6e 64 65 78  it find an index
32cc0 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20   at all. */.    
32cd0 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74      assert( best
32ce0 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  Plan.plan.u.pIdx
32cf0 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20 20 20 20  ==pIdx );.      
32d00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  }.    }.  }.  WH
32d10 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
32d20 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
32d30 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66  d ***\n"));.  if
32d40 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
32d50 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
32d60 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
32d70 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
32d80 20 20 7d 0a 20 20 69 66 28 20 6e 54 61 62 4c 69    }.  if( nTabLi
32d90 73 74 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  st ){.    pLevel
32da0 2d 2d 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  --;.    pWInfo->
32db0 6e 4f 42 53 61 74 20 3d 20 70 4c 65 76 65 6c 2d  nOBSat = pLevel-
32dc0 3e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20  >plan.nOBSat;.  
32dd0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 49 6e 66  }else{.    pWInf
32de0 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20  o->nOBSat = 0;. 
32df0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
32e00 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79  total query only
32e10 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c   selects a singl
32e20 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20  e row, then the 
32e30 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c  ORDER BY.  ** cl
32e40 61 75 73 65 20 69 73 20 69 72 72 65 6c 65 76 61  ause is irreleva
32e50 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  nt..  */.  if( (
32e60 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45  andFlags & WHERE
32e70 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70  _UNIQUE)!=0 && p
32e80 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61  OrderBy ){.    a
32e90 73 73 65 72 74 28 20 6e 54 61 62 4c 69 73 74 3d  ssert( nTabList=
32ea0 3d 30 20 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70  =0 || (pLevel->p
32eb0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
32ec0 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29 21  ERE_ALL_UNIQUE)!
32ed0 3d 30 20 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 );.    pWInfo
32ee0 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65  ->nOBSat = pOrde
32ef0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  rBy->nExpr;.  }.
32f00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
32f10 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
32f20 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
32f30 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
32f40 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
32f50 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
32f60 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
32f70 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
32f80 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
32f90 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
32fa0 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
32fb0 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
32fc0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
32fd0 74 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  ts.  ** the stat
32fe0 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20  ement to update 
32ff0 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
33000 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
33010 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
33020 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
33030 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
33040 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
33050 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
33060 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
33070 45 53 49 52 45 44 29 21 3d 30 20 26 26 20 28 61  ESIRED)!=0 && (a
33080 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ndFlags & WHERE_
33090 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20  UNIQUE)!=0 ){.  
330a0 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50    pWInfo->okOneP
330b0 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49  ass = 1;.    pWI
330c0 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77  nfo->a[0].plan.w
330d0 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
330e0 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  _IDX_ONLY;.  }..
330f0 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
33100 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
33110 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
33120 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
33130 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
33140 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
33150 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
33160 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
33170 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e  arse, -1); /* In
33180 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20  sert the cookie 
33190 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f  verifier Goto */
331a0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
331b0 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49  Bitmask)0;.  pWI
331c0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28  nfo->nRowOut = (
331d0 64 6f 75 62 6c 65 29 31 3b 0a 20 20 66 6f 72 28  double)1;.  for(
331e0 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  ii=0, pLevel=pWI
331f0 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c  nfo->a; ii<nTabL
33200 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65  ist; ii++, pLeve
33210 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  l++){.    Table 
33220 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61  *pTab;     /* Ta
33230 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
33240 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
33250 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
33260 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
33270 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  ing table/index 
33280 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  */.    struct Sr
33290 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
332a0 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49  Item;..    pTabI
332b0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
332c0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
332d0 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
332e0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
332f0 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
33300 74 20 2a 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  t *= pLevel->pla
33310 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 69 44 62 20  n.nRow;.    iDb 
33320 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
33330 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
33340 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69  >pSchema);.    i
33350 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
33360 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
33370 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
33380 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
33390 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
333a0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
333b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
333c0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
333d0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
333e0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
333f0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
33400 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
33410 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
33420 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
33430 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
33440 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
33450 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
33460 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
33470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33480 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
33490 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
334a0 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
334b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
334c0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
334d0 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
334e0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
334f0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  if.    if( (pLev
33500 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
33510 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
33520 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  Y)==0.         &
33530 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
33540 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
33550 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  CLOSE)==0 ){.   
33560 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e     int op = pWIn
33570 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20  fo->okOnePass ? 
33580 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f  OP_OpenWrite : O
33590 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
335a0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
335b0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
335c0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
335d0 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20  b, pTab, op);.  
335e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
335f0 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
33600 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
33610 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  e( pTab->nCol==B
33620 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
33630 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
33640 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
33650 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20  <BMS ){.        
33660 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
33670 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
33680 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
33690 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
336a0 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
336b0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
336c0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
336d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
336e0 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20  entAddr(v)-1, . 
336f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33700 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
33710 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
33720 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
33730 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
33740 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
33750 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
33760 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
33770 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
33780 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
33790 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
337a0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
337b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
337c0 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69  ATIC_INDEX.    i
337d0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
337e0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
337f0 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20  _TEMP_INDEX)!=0 
33800 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75  ){.      constru
33810 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
33820 28 70 50 61 72 73 65 2c 20 73 57 42 49 2e 70 57  (pParse, sWBI.pW
33830 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74  C, pTabItem, not
33840 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a  Ready, pLevel);.
33850 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
33860 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
33870 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
33880 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
33890 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  =0 ){.      Inde
338a0 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  x *pIx = pLevel-
338b0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20  >plan.u.pIdx;.  
338c0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
338d0 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
338e0 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
338f0 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  pIx);.      int 
33900 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76  iIndexCur = pLev
33910 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
33920 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
33930 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
33940 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
33950 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
33960 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r>=0 );.      sq
33970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
33980 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
33990 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
339a0 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20  tnum, iDb,.     
339b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339c0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20     (char*)pKey, 
339d0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
339e0 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  FF);.      VdbeC
339f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
33a00 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20   pIx->zName));. 
33a10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
33a20 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
33a30 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
33a40 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
33a50 67 65 74 4d 61 73 6b 28 73 57 42 49 2e 70 57 43  getMask(sWBI.pWC
33a60 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  ->pMaskSet, pTab
33a70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
33a80 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
33a90 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
33aa0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
33ab0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
33ac0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
33ad0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
33ae0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
33af0 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
33b00 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
33b10 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
33b20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
33b30 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
33b40 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
33b50 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
33b60 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
33b70 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
33b80 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
33b90 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
33ba0 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
33bb0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
33bc0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a  &pWInfo->a[ii];.
33bd0 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
33be0 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  an(pParse, pTabL
33bf0 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c  ist, pLevel, ii,
33c00 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
33c10 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20  wctrlFlags);.   
33c20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65   notReady = code
33c30 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49  OneLoopStart(pWI
33c40 6e 66 6f 2c 20 69 69 2c 20 77 63 74 72 6c 46 6c  nfo, ii, wctrlFl
33c50 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a  ags, notReady);.
33c60 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
33c70 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e  tinue = pLevel->
33c80 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23  addrCont;.  }..#
33c90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
33ca0 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e  T  /* For testin
33cb0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
33cc0 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a  use only */.  /*
33cd0 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71   Record in the q
33ce0 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d  uery plan inform
33cf0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
33d00 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20  current table.  
33d10 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
33d20 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
33d30 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66  it (if any).  If
33d40 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
33d50 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73  f.  ** is not us
33d60 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20  ed, its name is 
33d70 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e  just '{}'.  If n
33d80 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a  o index is used.
33d90 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
33da0 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22  s listed as "{}"
33db0 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  .  If the primar
33dc0 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68  y key is used th
33dd0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d  e.  ** index nam
33de0 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20  e is '*'..  */. 
33df0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54   for(ii=0; ii<nT
33e00 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20  abList; ii++){. 
33e10 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
33e20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 6e 74 20 77  int n;.    int w
33e30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
33e40 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
33e50 74 65 6d 3b 0a 0a 20 20 20 20 70 4c 65 76 65 6c  tem;..    pLevel
33e60 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
33e70 5d 3b 0a 20 20 20 20 77 20 3d 20 70 4c 65 76 65  ];.    w = pLeve
33e80 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b  l->plan.wsFlags;
33e90 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
33ea0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
33eb0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
33ec0 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a   z = pTabItem->z
33ed0 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a  Alias;.    if( z
33ee0 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74  ==0 ) z = pTabIt
33ef0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  em->pTab->zName;
33f00 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
33f10 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
33f20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20   if( n+nQPlan < 
33f30 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71  sizeof(sqlite3_q
33f40 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b  uery_plan)-10 ){
33f50 0a 20 20 20 20 20 20 69 66 28 20 28 77 20 26 20  .      if( (w & 
33f60 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
33f70 3d 30 20 26 26 20 28 77 20 26 20 57 48 45 52 45  =0 && (w & WHERE
33f80 5f 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30 20  _COVER_SCAN)==0 
33f90 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
33fa0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
33fb0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
33fc0 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  {}", 2);.       
33fd0 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
33fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33ff0 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
34000 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
34010 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Plan], z, n);.  
34020 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
34030 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
34040 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
34050 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
34060 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  ' ';.    }.    t
34070 65 73 74 63 61 73 65 28 20 77 20 26 20 57 48 45  estcase( w & WHE
34080 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20  RE_ROWID_EQ );. 
34090 20 20 20 74 65 73 74 63 61 73 65 28 20 77 20 26     testcase( w &
340a0 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
340b0 47 45 20 29 3b 0a 20 20 20 20 69 66 28 20 77 20  GE );.    if( w 
340c0 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  & (WHERE_ROWID_E
340d0 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
340e0 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 6d 65  NGE) ){.      me
340f0 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
34100 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
34110 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20 20 20  , "* ", 2);.    
34120 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20    nQPlan += 2;. 
34130 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 77 20     }else if( (w 
34140 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
34150 21 3d 30 20 26 26 20 28 77 20 26 20 57 48 45 52  !=0 && (w & WHER
34160 45 5f 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30  E_COVER_SCAN)==0
34170 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71   ){.      n = sq
34180 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c  lite3Strlen30(pL
34190 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
341a0 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
341b0 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20   if( n+nQPlan < 
341c0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71  sizeof(sqlite3_q
341d0 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a  uery_plan)-2 ){.
341e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
341f0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
34200 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76  an[nQPlan], pLev
34210 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d  el->plan.u.pIdx-
34220 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  >zName, n);.    
34230 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b      nQPlan += n;
34240 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34250 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
34260 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
34270 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
34280 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
34290 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
342a0 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c  [nQPlan], "{} ",
342b0 20 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   3);.      nQPla
342c0 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20  n += 3;.    }.  
342d0 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61  }.  while( nQPla
342e0 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71  n>0 && sqlite3_q
342f0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
34300 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]==' ' ){.    
34310 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
34320 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30  an[--nQPlan] = 0
34330 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
34340 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
34350 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e  n] = 0;.  nQPlan
34360 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20   = 0;.#endif /* 
34370 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54  SQLITE_TEST // T
34380 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
34390 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f  ging use only */
343a0 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
343b0 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61  e continuation a
343c0 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68  ddress in the Wh
343d0 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
343e0 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c  e.  Then.  ** cl
343f0 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
34400 6e 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  n..  */.  return
34410 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a   pWInfo;..  /* J
34420 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c  ump here if mall
34430 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72  oc fails */.wher
34440 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69  eBeginError:.  i
34450 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20  f( pWInfo ){.   
34460 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
34470 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
34480 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
34490 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65     whereInfoFree
344a0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
344b0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
344c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
344d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
344e0 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
344f0 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
34500 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
34510 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
34520 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
34530 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
34540 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
34550 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61  o *pWInfo){.  Pa
34560 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
34570 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
34580 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
34590 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
345a0 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  ;.  WhereLevel *
345b0 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73  pLevel;.  SrcLis
345c0 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
345d0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
345e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
345f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
34600 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20  * Generate loop 
34610 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
34620 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
34630 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
34640 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
34650 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
34660 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
34670 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
34680 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71  fo->a[i];.    sq
34690 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
346a0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
346b0 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
346c0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
346d0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
346e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
346f0 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p2(v, pLevel->op
34700 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
34710 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20  evel->p2);.     
34720 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
34730 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geP5(v, pLevel->
34740 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  p5);.    }.    i
34750 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
34760 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
34770 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65  IN_ABLE && pLeve
34780 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b  l->u.in.nIn>0 ){
34790 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
347a0 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20  Loop *pIn;.     
347b0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
347c0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
347d0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
347e0 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20  >addrNxt);.     
347f0 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75   for(j=pLevel->u
34800 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c  .in.nIn, pIn=&pL
34810 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
34820 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d  op[j-1]; j>0; j-
34830 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20  -, pIn--){.     
34840 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
34850 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
34860 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20  ddrInTop+1);.   
34870 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34880 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65  AddOp2(v, pIn->e
34890 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e  EndLoopOp, pIn->
348a0 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
348b0 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73  nTop);.        s
348c0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
348d0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
348e0 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
348f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
34900 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
34910 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
34920 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
34930 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
34940 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
34950 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
34960 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
34970 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
34980 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
34990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
349a0 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
349b0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
349c0 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
349d0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
349e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
349f0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
34a00 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 65 76          || (pLev
34a10 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
34a20 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
34a30 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
34a40 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
34a50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
34a60 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
34a70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
34a80 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
34a90 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
34aa0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
34ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34ac0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  if( pLevel->iIdx
34ad0 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
34ae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34af0 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
34b00 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
34b10 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
34b20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
34b30 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a  p==OP_Return ){.
34b40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
34b50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
34b60 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70  Gosub, pLevel->p
34b70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  1, pLevel->addrF
34b80 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  irst);.      }el
34b90 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
34ba0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34bb0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
34bc0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
34bd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
34be0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
34bf0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
34c00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
34c10 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
34c20 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
34c30 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
34c40 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
34c50 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
34c60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
34c70 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
34c80 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
34c90 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
34ca0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
34cb0 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
34cc0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
34cd0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
34ce0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
34cf0 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==1 || pWInfo->n
34d00 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d  Level==pTabList-
34d10 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69  >nSrc );.  for(i
34d20 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
34d30 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  o->a; i<pWInfo->
34d40 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65  nLevel; i++, pLe
34d50 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65  vel++){.    Inde
34d60 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20  x *pIdx = 0;.   
34d70 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
34d80 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
34d90 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
34da0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
34db0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
34dc0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
34dd0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
34de0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
34df0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
34e00 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
34e10 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e  0.     && pTab->
34e20 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20  pSelect==0.     
34e30 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
34e40 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
34e50 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d  MIT_OPEN_CLOSE)=
34e60 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
34e70 69 6e 74 20 77 73 20 3d 20 70 4c 65 76 65 6c 2d  int ws = pLevel-
34e80 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  >plan.wsFlags;. 
34e90 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
34ea0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28  ->okOnePass && (
34eb0 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
34ec0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
34ed0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34ee0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
34ef0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
34f00 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
34f10 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
34f20 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
34f30 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 54  && (ws & WHERE_T
34f40 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20 29 7b  EMP_INDEX)==0 ){
34f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34f60 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34f70 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
34f80 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
34f90 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
34fa0 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
34fb0 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
34fc0 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69   code substituti
34fd0 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61  ons to read data
34fe0 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
34ff0 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72   index in prefer
35000 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c  ence to the tabl
35010 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68  e. Sometimes, th
35020 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
35030 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e  the table need n
35040 65 76 65 72 20 62 65 20 72 65 61 64 20 66 72 6f  ever be read fro
35050 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70 65 72  m. This is a per
35060 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a  formance boost,.
35070 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64      ** as the vd
35080 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75  be level waits u
35090 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69  ntil the table i
350a0 73 20 72 65 61 64 20 62 65 66 6f 72 65 20 61 63  s read before ac
350b0 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65  tually.    ** se
350c0 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  eking the table 
350d0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65  cursor to the re
350e0 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69  cord correspondi
350f0 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
35100 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f  t.    ** positio
35110 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  n in the index..
35120 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
35130 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
35140 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
35150 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
35160 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
35170 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
35180 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
35190 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
351a0 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
351b0 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
351c0 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
351d0 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
351e0 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
351f0 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
35200 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
35210 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
35220 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
35230 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
35240 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
35250 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
35260 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
35270 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
35280 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
35290 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76       pIdx = pLev
352a0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
352b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
352c0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
352d0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
352e0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49  I_OR ){.      pI
352f0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  dx = pLevel->u.p
35300 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  Covidx;.    }.  
35310 20 20 69 66 28 20 70 49 64 78 20 26 26 20 21 64    if( pIdx && !d
35320 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
35330 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a  {.      int k, j
35340 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64  , last;.      Vd
35350 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 20 20  beOp *pOp;..    
35360 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
35370 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e  dbeGetOp(v, pWIn
35380 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20  fo->iTop);.     
35390 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
353a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
353b0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  );.      for(k=p
353c0 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c  WInfo->iTop; k<l
353d0 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
353e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
353f0 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
35400 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
35410 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
35420 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
35430 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
35440 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
35450 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
35460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
35470 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78  f( pOp->p2==pIdx
35480 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b  ->aiColumn[j] ){
35490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
354a0 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20  Op->p2 = j;.    
354b0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
354c0 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
354d0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Cur;.           
354e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
354f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35500 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
35510 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70  sert( (pLevel->p
35520 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
35530 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
35540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35550 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  || j<pIdx->nColu
35560 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  mn );.        }e
35570 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
35580 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b  ode==OP_Rowid ){
35590 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
355a0 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
355b0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
355c0 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
355d0 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20  _IdxRowid;.     
355e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
355f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
35600 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
35610 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
35620 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
35630 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
35640 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
35650 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
35660 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.