/ Hex Artifact Content
Login

Artifact 9f706f54008083dac6079a75463d6921eab2fecd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0460: 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  e.# define WHERE
0470: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
0480: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0490: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
04a0: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
04b0: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65  WhereMaskSet Whe
04e0: 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64  reMaskSet;.typed
04f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0500: 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66  rInfo WhereOrInf
0510: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0520: 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57  t WhereAndInfo W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70  hereAndInfo;.typ
0540: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0550: 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b  eCost WhereCost;
0560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0570: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0580: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0590: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
05a0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
05b0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
05c0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
05d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05e0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05f0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0600: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0610: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0620: 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f   others by AND o
0630: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75  perators,.** usu
0640: 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d  ally, or sometim
0650: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
0660: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  s separated by O
0670: 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  R..**.** All Whe
0680: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
0690: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
06a0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06b0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
06c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
06d0: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
06e0: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
06f0: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
0700: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0710: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0720: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0730: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0750: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
0760: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
0770: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
0780: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
0790: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
07a0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07b0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
07c0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
07d0: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
07e0: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
07f0: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
0800: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
0810: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
0820: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
0830: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0840: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0850: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
0860: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0870: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0880: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0890: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
08a0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
08b0: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
08c0: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
08d0: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
08e0: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
08f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
0900: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
0910: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
0920: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
0930: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
0940: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
0950: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
0960: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
0970: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
0980: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
0990: 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68 65  e, wtFlag as the
09a0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74   TERM_ORINFO set
09b0: 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d   and eOperator==
09c0: 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65  WO_OR.** and the
09d0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
09e0: 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74  Info field point
09f0: 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69  s to auxiliary i
0a00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a  nformation that.
0a10: 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ** is collected 
0a20: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20  about the.**.** 
0a30: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
0a40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
0a50: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
0a60: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
0a70: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
0a80: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
0a90: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
0aa0: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
0ab0: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
0ac0: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
0ad0: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
0ae0: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
0af0: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
0b00: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
0b10: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
0b20: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
0b30: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
0b40: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
0b50: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
0b60: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
0b70: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0b80: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0ba0: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0bb0: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0bc0: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
0bd0: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
0be0: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
0bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
0c00: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
0c10: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
0c20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
0c30: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
0c40: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
0c50: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
0c60: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
0c70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
0c80: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
0c90: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
0ca0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0cb0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0cc0: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
0cd0: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
0ce0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
0cf0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
0d00: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
0d10: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
0d20: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
0d30: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
0d40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
0d50: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0d60: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0d70: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0d80: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0d90: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0da0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0db0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0dc0: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0dd0: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0de0: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0df0: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0e00: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0e10: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0e20: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0e30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0e40: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0e50: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
0e60: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
0e70: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
0e80: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
0e90: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
0ea0: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
0eb0: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
0ec0: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
0ed0: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
0ee0: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
0ef0: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
0f00: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
0f10: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65   tables..*/.type
0f20: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0f30: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0f40: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f50: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0f80: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
0f90: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
0fa0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0fc0: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
0fd0: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
0fe0: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
0ff0: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
1000: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
1010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1020: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
1030: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
1040: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
1050: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
1060: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
1070: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
1080: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
1090: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
10a0: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
10b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f  nformation if eO
10c0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a  perator==WO_OR *
10d0: 2f 0a 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e  /.    WhereAndIn
10e0: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a  fo *pAndInfo; /*
10f0: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
1100: 6f 6e 20 69 66 20 65 4f 70 65 72 61 74 6f 72 3d  on if eOperator=
1110: 3d 57 4f 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75  =WO_AND */.  } u
1120: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
1130: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
1140: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
1150: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
1160: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
1170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
1180: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
1190: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
11a0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
11b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11c0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
11d0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
11e0: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
11f0: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
1200: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
1210: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
1220: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
1230: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
1240: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
1250: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
1260: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
1270: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
1280: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
1290: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
12a0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
12b0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
12c0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
12d0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
12e0: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
12f0: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
1300: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
1310: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
1320: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1330: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
1340: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
1350: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
1360: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
1370: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
1380: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
1390: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
13a0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
13b0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
13c0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
13d0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
13e0: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
13f0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
1400: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
1410: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
1420: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
1430: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
1440: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
1450: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
1460: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
1470: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
1480: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
1490: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
14a0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
14b0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
14c0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
14d0: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
14e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14f0: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
1500: 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20  VNULL    0x80   
1510: 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20  /* Manufactured 
1520: 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c  x>NULL or x<=NUL
1530: 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a  L term */.#else.
1540: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
1550: 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f  NULL    0x00   /
1560: 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f  * Disabled if no
1570: 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f  t using stat3 */
1580: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1590: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
15a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
15b0: 63 74 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20  cture holds all 
15c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
15d0: 74 20 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  t a.** WHERE cla
15e0: 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69  use.  Mostly thi
15f0: 73 20 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72  s is a container
1600: 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   for one or more
1610: 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a   WhereTerms..**.
1620: 2a 2a 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ** Explanation o
1630: 66 20 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61  f pOuter:  For a
1640: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
1650: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
1660: 20 20 20 20 20 20 20 20 20 20 61 20 41 4e 44 20            a AND 
1670: 28 28 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64  ((b AND c) OR (d
1680: 20 41 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a   AND e)) AND f.*
1690: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73  *.** There are s
16a0: 65 70 61 72 61 74 65 20 57 68 65 72 65 43 6c 61  eparate WhereCla
16b0: 75 73 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  use objects for 
16c0: 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65  the whole clause
16d0: 20 61 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20   and for.** the 
16e0: 73 75 62 63 6c 61 75 73 65 73 20 22 28 62 20 41  subclauses "(b A
16f0: 4e 44 20 63 29 22 20 61 6e 64 20 22 28 64 20 41  ND c)" and "(d A
1700: 4e 44 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75  ND e)".  The pOu
1710: 74 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ter field of the
1720: 0a 2a 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70  .** subclauses p
1730: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65  oints to the Whe
1740: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
1750: 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c  for the whole cl
1760: 61 75 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ause..*/.struct 
1770: 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20  WhereClause {.  
1780: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1790: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17a0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
17b0: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
17c0: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a 20   *pMaskSet;  /* 
17d0: 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c 65  Mapping of table
17e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
17f0: 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20  to bitmasks */. 
1800: 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b 20   Bitmask vmask; 
1810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
1820: 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67  mask identifying
1830: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
1840: 75 72 73 6f 72 73 20 2a 2f 0a 20 20 57 68 65 72  ursors */.  Wher
1850: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
1860: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
1870: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
1880: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
1890: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
18a0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
18b0: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
18c0: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
18d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
18e0: 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45  ht include WHERE
18f0: 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69  _AND_ONLY */.  i
1900: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1910: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1920: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1930: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1950: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1960: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1970: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1980: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1990: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
19a0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
19b0: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
19c0: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
19d0: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
19e0: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
19f0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
1a00: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
1a10: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
1a20: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
1a30: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
1a40: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1a50: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1a60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1a70: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1a80: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1a90: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1aa0: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1ab0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1ac0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1ad0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1ae0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1af0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1b00: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1b10: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1b20: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1b30: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1b40: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1b50: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1b60: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1b70: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1b80: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1b90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1ba0: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1bb0: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1bc0: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1bd0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1be0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1bf0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1c00: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1c10: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1c20: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1c30: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1c40: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1c50: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1c60: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1c70: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1c80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1c90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1ca0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1cb0: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1cc0: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1cd0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ce0: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1cf0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1d00: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1d10: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1d20: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1d30: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1d40: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1d50: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1d60: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1d70: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1d80: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1d90: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1da0: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1db0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1dc0: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1dd0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1de0: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1df0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1e00: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1e10: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1e20: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1e30: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1e40: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1e50: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1e60: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1e70: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1e80: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1e90: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1ea0: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1eb0: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1ec0: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1ed0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1ee0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1ef0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1f00: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1f10: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1f20: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1f30: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1f40: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f50: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1f60: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1f70: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1f80: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1f90: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1fa0: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1fb0: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1fc0: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1fd0: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1fe0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1ff0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
2000: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
2010: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
2020: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
2030: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
2040: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
2050: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
2060: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
2070: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
2080: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
2090: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
20a0: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
20b0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
20c0: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
20d0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
20e0: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
20f0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
2100: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
2110: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
2120: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
2130: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
2140: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
2150: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
2160: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
2170: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
2180: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21b0: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
21c0: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
21d0: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
21e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21f0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
2200: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
2210: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
2220: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
2230: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
2240: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2250: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2260: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2270: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2280: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2290: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
22a0: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
22b0: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
22c0: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
22d0: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
22e0: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
22f0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2300: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
2310: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
2320: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
2330: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
2340: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2350: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2360: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2370: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2380: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2390: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
23a0: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
23b0: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
23c0: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
23d0: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
23e0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
23f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
2400: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
2410: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
2420: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
2430: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
2440: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2450: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2460: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2470: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2480: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2490: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
24a0: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
24b0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
24c0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
24d0: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
24e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
24f0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
2500: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
2510: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
2520: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
2530: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
2540: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2550: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2560: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2570: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2580: 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20  #define WO_NOOP 
2590: 20 20 30 78 38 30 30 20 20 20 20 20 20 20 2f 2a    0x800       /*
25a0: 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65 73 20   This term does 
25b0: 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73 65 61  not restrict sea
25c0: 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64  rch space */..#d
25d0: 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20  efine WO_ALL    
25e0: 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0xfff       /* M
25f0: 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69  ask of all possi
2600: 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  ble WO_* values 
2610: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49  */.#define WO_SI
2620: 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20  NGLE 0x0ff      
2630: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2640: 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f  non-compound WO_
2650: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a  * values */../*.
2660: 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46  ** Value for wsF
2670: 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2680: 20 62 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64   bestIndex() and
2690: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68   stored in.** Wh
26a0: 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73  ereLevel.wsFlags
26b0: 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 64  .  These flags d
26c0: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73  etermine which s
26d0: 65 61 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67  earch.** strateg
26e0: 69 65 73 20 61 72 65 20 61 70 70 72 6f 70 72 69  ies are appropri
26f0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ate..**.** The l
2700: 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  east significant
2710: 20 31 32 20 62 69 74 73 20 69 73 20 72 65 73 65   12 bits is rese
2720: 72 76 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66  rved as a mask f
2730: 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62  or WO_ values ab
2740: 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72  ove..** The Wher
2750: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66  eLevel.wsFlags f
2760: 69 65 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20  ield is usually 
2770: 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f  set to WO_IN|WO_
2780: 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a  EQ|WO_ISNULL..**
2790: 20 42 75 74 20 69 66 20 74 68 65 20 74 61 62 6c   But if the tabl
27a0: 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
27b0: 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a  able of a left j
27c0: 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e  oin, WhereLevel.
27d0: 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65  wsFlags.** is se
27e0: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
27f0: 2e 20 20 54 68 65 20 57 68 65 72 65 4c 65 76 65  .  The WhereLeve
2800: 6c 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20  l.wsFlags field 
2810: 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64  can then be used
2820: 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20   as.** the "op" 
2830: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e  parameter to fin
2840: 64 54 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72  dTerm when we ar
2850: 65 20 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61  e resolving equa
2860: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
2870: 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73  ..** ISNULL cons
2880: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65  traints will the
2890: 6e 20 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e  n not be used on
28a0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
28b0: 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f   of a left.** jo
28c0: 69 6e 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31  in.  Tickets #21
28d0: 37 37 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f  77 and #2189..*/
28e0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
28f0: 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78 30 30  OWID_EQ     0x00
2900: 30 30 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64  001000  /* rowid
2910: 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49  =EXPR or rowid I
2920: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
2930: 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  ne WHERE_ROWID_R
2940: 41 4e 47 45 20 20 30 78 30 30 30 30 32 30 30 30  ANGE  0x00002000
2950: 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20    /* rowid<EXPR 
2960: 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50  and/or rowid>EXP
2970: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
2980: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20  RE_COLUMN_EQ    
2990: 30 78 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78  0x00010000  /* x
29a0: 3d 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e  =EXPR or x IN (.
29b0: 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c  ..) or x IS NULL
29c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
29d0: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30  E_COLUMN_RANGE 0
29e0: 78 30 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c  x00020000  /* x<
29f0: 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58  EXPR and/or x>EX
2a00: 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  PR */.#define WH
2a10: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20  ERE_COLUMN_IN   
2a20: 20 30 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20   0x00040000  /* 
2a30: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
2a40: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
2a50: 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38 30  MN_NULL  0x00080
2a60: 30 30 30 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c  000  /* x IS NUL
2a70: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  L */.#define WHE
2a80: 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20  RE_INDEXED      
2a90: 30 78 30 30 30 66 30 30 30 30 20 20 2f 2a 20 41  0x000f0000  /* A
2aa0: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 75 73 65  nything that use
2ab0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64  s an index */.#d
2ac0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4e 4f 54 5f  efine WHERE_NOT_
2ad0: 46 55 4c 4c 53 43 41 4e 20 30 78 31 30 30 66 33  FULLSCAN 0x100f3
2ae0: 30 30 30 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74  000  /* Does not
2af0: 20 64 6f 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   do a full table
2b00: 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65   scan */.#define
2b10: 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20   WHERE_IN_ABLE  
2b20: 20 20 20 20 30 78 30 30 30 66 31 30 30 30 20 20      0x000f1000  
2b30: 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75 70 70 6f  /* Able to suppo
2b40: 72 74 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  rt an IN operato
2b50: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  r */.#define WHE
2b60: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20  RE_TOP_LIMIT    
2b70: 30 78 30 30 31 30 30 30 30 30 20 20 2f 2a 20 78  0x00100000  /* x
2b80: 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52  <EXPR or x<=EXPR
2b90: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
2ba0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d  define WHERE_BTM
2bb0: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 32 30  _LIMIT    0x0020
2bc0: 30 30 30 30 20 20 2f 2a 20 78 3e 45 58 50 52 20  0000  /* x>EXPR 
2bd0: 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74  or x>=EXPR const
2be0: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
2bf0: 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49   WHERE_BOTH_LIMI
2c00: 54 20 20 20 30 78 30 30 33 30 30 30 30 30 20 20  T   0x00300000  
2c10: 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50 52 20 61  /* Both x>EXPR a
2c20: 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65  nd x<EXPR */.#de
2c30: 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f  fine WHERE_IDX_O
2c40: 4e 4c 59 20 20 20 20 20 30 78 30 30 34 30 30 30  NLY     0x004000
2c50: 30 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  00  /* Use index
2c60: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
2c70: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
2c80: 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20  ERE_ORDERBY     
2c90: 20 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a 20   0x00800000  /* 
2ca0: 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65  Output will appe
2cb0: 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72  ar in correct or
2cc0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
2cd0: 48 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20  HERE_REVERSE    
2ce0: 20 20 30 78 30 31 30 30 30 30 30 30 20 20 2f 2a    0x01000000  /*
2cf0: 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   Scan in reverse
2d00: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2d10: 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20  e WHERE_UNIQUE  
2d20: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2d30: 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d   /* Selects no m
2d40: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
2d50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2d60: 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20 20 20 30  E_ALL_UNIQUE   0
2d70: 78 30 34 30 30 30 30 30 30 20 20 2f 2a 20 54 68  x04000000  /* Th
2d80: 69 73 20 61 6e 64 20 61 6c 6c 20 70 72 69 6f 72  is and all prior
2d90: 20 68 61 76 65 20 6f 6e 65 20 72 6f 77 20 2a 2f   have one row */
2da0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
2db0: 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78 30 38  IRTUALTABLE 0x08
2dc0: 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 76  000000  /* Use v
2dd0: 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f  irtual-table pro
2de0: 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69  cessing */.#defi
2df0: 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  ne WHERE_MULTI_O
2e00: 52 20 20 20 20 20 30 78 31 30 30 30 30 30 30 30  R     0x10000000
2e10: 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75    /* OR using mu
2e20: 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a  ltiple indices *
2e30: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2e40: 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78 32  TEMP_INDEX   0x2
2e50: 30 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 73  0000000  /* Uses
2e60: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2e70: 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  dex */.#define W
2e80: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 20 20 20  HERE_DISTINCT   
2e90: 20 20 30 78 34 30 30 30 30 30 30 30 20 20 2f 2a    0x40000000  /*
2ea0: 20 43 6f 72 72 65 63 74 20 6f 72 64 65 72 20 66   Correct order f
2eb0: 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 23  or DISTINCT */.#
2ec0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 56  define WHERE_COV
2ed0: 45 52 5f 53 43 41 4e 20 20 20 30 78 38 30 30 30  ER_SCAN   0x8000
2ee0: 30 30 30 30 20 20 2f 2a 20 46 75 6c 6c 20 73 63  0000  /* Full sc
2ef0: 61 6e 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67  an of a covering
2f00: 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   index */../*.**
2f10: 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63 6f 6e   This module con
2f20: 74 61 69 6e 73 20 6d 61 6e 79 20 73 65 70 61 72  tains many separ
2f30: 61 74 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ate subroutines 
2f40: 74 68 61 74 20 77 6f 72 6b 20 74 6f 67 65 74 68  that work togeth
2f50: 65 72 20 74 6f 0a 2a 2a 20 66 69 6e 64 20 74 68  er to.** find th
2f60: 65 20 62 65 73 74 20 69 6e 64 69 63 65 73 20 74  e best indices t
2f70: 6f 20 75 73 65 20 66 6f 72 20 61 63 63 65 73 73  o use for access
2f80: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
2f90: 20 74 61 62 6c 65 20 69 6e 20 61 20 71 75 65 72   table in a quer
2fa0: 79 2e 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  y..** An instanc
2fb0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2fc0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c  ng structure hol
2fd0: 64 73 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72  ds context infor
2fe0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
2ff0: 0a 2a 2a 20 69 6e 64 65 78 20 73 65 61 72 63 68  .** index search
3000: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
3010: 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 70  be more easily p
3020: 61 73 73 65 64 20 62 65 74 77 65 65 6e 20 74 68  assed between th
3030: 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 72 6f 75  e various.** rou
3040: 74 69 6e 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  tines..*/.typede
3050: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 42 65  f struct WhereBe
3060: 73 74 49 64 78 20 57 68 65 72 65 42 65 73 74 49  stIdx WhereBestI
3070: 64 78 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65  dx;.struct Where
3080: 42 65 73 74 49 64 78 20 7b 0a 20 20 50 61 72 73  BestIdx {.  Pars
3090: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30b0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
30c0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
30d0: 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
30e0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
30f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
3100: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3110: 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
3120: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
3130: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
3140: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
3150: 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
3160: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
3170: 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61  rsors not availa
3180: 62 6c 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ble */.  Bitmask
3190: 20 6e 6f 74 56 61 6c 69 64 3b 20 20 20 20 20 20   notValid;      
31a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
31b0: 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
31c0: 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73  e for any purpos
31d0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
31e0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20  *pOrderBy;      
31f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
3200: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3210: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
3220: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
3230: 20 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74     /* The select
3240: 2d 6c 69 73 74 20 69 66 20 71 75 65 72 79 20 69  -list if query i
3250: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
3260: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
3270: 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 3b 20  fo **ppIdxInfo; 
3280: 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61  /* Index informa
3290: 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78  tion passed to x
32a0: 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 69  BestIndex */.  i
32b0: 6e 74 20 69 2c 20 6e 3b 20 20 20 20 20 20 20 20  nt i, n;        
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32d0: 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20 69 73 20  * Which loop is 
32e0: 62 65 69 6e 67 20 63 6f 64 65 64 3b 20 23 20 6f  being coded; # o
32f0: 66 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65  f loops */.  Whe
3300: 72 65 4c 65 76 65 6c 20 2a 61 4c 65 76 65 6c 3b  reLevel *aLevel;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3320: 49 6e 66 6f 20 61 62 6f 75 74 20 6f 75 74 65 72  Info about outer
3330: 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65 72   loops */.  Wher
3340: 65 43 6f 73 74 20 63 6f 73 74 3b 20 20 20 20 20  eCost cost;     
3350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3360: 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
3370: 20 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   plan */.};../*.
3380: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
3390: 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  preallocated Whe
33a0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
33b0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
33c0: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  id whereClauseIn
33d0: 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  it(.  WhereClaus
33e0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f  e *pWC,        /
33f0: 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73  * The WhereClaus
3400: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
3410: 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  zed */.  Parse *
3420: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3430: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
3440: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
3450: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
3460: 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70 69 6e  kSet,  /* Mappin
3470: 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75 72  g from table cur
3480: 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62  sor numbers to b
3490: 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 75 31 36  itmasks */.  u16
34a0: 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
34b0: 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 69        /* Might i
34c0: 6e 63 6c 75 64 65 20 57 48 45 52 45 5f 41 4e 44  nclude WHERE_AND
34d0: 5f 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 70 57  _ONLY */.){.  pW
34e0: 43 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  C->pParse = pPar
34f0: 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d 61 73 6b  se;.  pWC->pMask
3500: 53 65 74 20 3d 20 70 4d 61 73 6b 53 65 74 3b 0a  Set = pMaskSet;.
3510: 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20    pWC->pOuter = 
3520: 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20  0;.  pWC->nTerm 
3530: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f  = 0;.  pWC->nSlo
3540: 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57  t = ArraySize(pW
3550: 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70  C->aStatic);.  p
3560: 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74  WC->a = pWC->aSt
3570: 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e 76 6d 61  atic;.  pWC->vma
3580: 73 6b 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 77  sk = 0;.  pWC->w
3590: 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
35a0: 6c 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 20 46 6f  lFlags;.}../* Fo
35b0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
35c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
35d0: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
35e0: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
35f0: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
3600: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
3610: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
3620: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
3630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3640: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
3650: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
3660: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
3670: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
3680: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
3690: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
36a0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
36b0: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
36c0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
36d0: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
36e0: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
36f0: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
3700: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
3710: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
3720: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
3730: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
3740: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
3750: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
3760: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
3770: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
3780: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
3790: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
37a0: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
37b0: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
37c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
37d0: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
37e0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
37f0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
3800: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
3810: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
3820: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
3830: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
3840: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
3850: 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  WC->pParse->db;.
3860: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
3870: 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20  rm-1, a=pWC->a; 
3880: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b  i>=0; i--, a++){
3890: 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c  .    if( a->wtFl
38a0: 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d  ags & TERM_DYNAM
38b0: 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IC ){.      sqli
38c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
38d0: 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  , a->pExpr);.   
38e0: 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74   }.    if( a->wt
38f0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
3900: 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65  NFO ){.      whe
3910: 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 64  reOrInfoDelete(d
3920: 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29  b, a->u.pOrInfo)
3930: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3940: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
3950: 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20  M_ANDINFO ){.   
3960: 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44     whereAndInfoD
3970: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
3980: 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  AndInfo);.    }.
3990: 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61    }.  if( pWC->a
39a0: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
39b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
39c0: 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b  ree(db, pWC->a);
39d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
39e0: 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57  d a single new W
39f0: 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74  hereTerm entry t
3a00: 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  o the WhereClaus
3a10: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a  e object pWC..**
3a20: 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   The new WhereTe
3a30: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  rm object is con
3a40: 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78  structed from Ex
3a50: 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77 74  pr p and with wt
3a60: 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e  Flags..** The in
3a70: 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20  dex in pWC->a[] 
3a80: 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65  of the new Where
3a90: 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64  Term is returned
3aa0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20   on success..** 
3ab0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  0 is returned if
3ac0: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   the new WhereTe
3ad0: 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  rm could not be 
3ae0: 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d  added due to a m
3af0: 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
3b00: 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20  ion error.  The 
3b10: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3b20: 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62  n failure will b
3b30: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a  e recorded in.**
3b40: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
3b50: 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68  ailed flag so th
3b60: 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  at higher-level 
3b70: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65  functions can de
3b80: 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  tect it..**.** T
3b90: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
3ba0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
3bb0: 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61  ze of the pWC->a
3bc0: 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
3bd0: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
3be0: 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67 75  the wtFlags argu
3bf0: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45  ment includes TE
3c00: 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  RM_DYNAMIC, then
3c10: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
3c20: 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  ** for freeing t
3c30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
3c40: 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74 68  is assumed by th
3c50: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
3c60: 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69  ject pWC..** Thi
3c70: 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69  s is true even i
3c80: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
3c90: 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ails to allocate
3ca0: 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d   a new WhereTerm
3cb0: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
3cc0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
3cd0: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20  ight reallocate 
3ce0: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74  the space used t
3cf0: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65  o store.** Where
3d00: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e  Terms.  All poin
3d10: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72  ters to WhereTer
3d20: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ms should be inv
3d30: 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a  alidated after.*
3d40: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * calling this r
3d50: 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f  outine.  Such po
3d60: 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65  inters may be re
3d70: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72  initialized by r
3d80: 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68  eferencing.** th
3d90: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
3da0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3db0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
3dc0: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
3dd0: 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38 20  WC, Expr *p, u8 
3de0: 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72  wtFlags){.  Wher
3df0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
3e00: 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74 63  int idx;.  testc
3e10: 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20 54  ase( wtFlags & T
3e20: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 20  ERM_VIRTUAL );  
3e30: 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31  /* EV: R-00211-1
3e40: 35 31 30 30 20 2a 2f 0a 20 20 69 66 28 20 70 57  5100 */.  if( pW
3e50: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
3e60: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
3e70: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
3e80: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
3e90: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61  3 *db = pWC->pPa
3ea0: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43  rse->db;.    pWC
3eb0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
3ec0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
3ed0: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
3ee0: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
3ef0: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
3f00: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74   ){.      if( wt
3f10: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  Flags & TERM_DYN
3f20: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20  AMIC ){.        
3f30: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3f40: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
3f50: 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d  }.      pWC->a =
3f60: 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74   pOld;.      ret
3f70: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
3f80: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
3f90: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
3fa0: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
3fb0: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
3fc0: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
3fd0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3fe0: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29  DbFree(db, pOld)
3ff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d  ;.    }.    pWC-
4000: 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33  >nSlot = sqlite3
4010: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
4020: 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28   pWC->a)/sizeof(
4030: 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a  pWC->a[0]);.  }.
4040: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
4050: 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65  a[idx = pWC->nTe
4060: 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e  rm++];.  pTerm->
4070: 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65  pExpr = p;.  pTe
4080: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74  rm->wtFlags = wt
4090: 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e  Flags;.  pTerm->
40a0: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65  pWC = pWC;.  pTe
40b0: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
40c0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a  ;.  return idx;.
40d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
40e0: 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73  utine identifies
40f0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
4100: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
4110: 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63  use where.** eac
4120: 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  h subexpression 
4130: 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
4140: 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  the AND operator
4150: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   or some other.*
4160: 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69  * operator speci
4170: 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70  fied in the op p
4180: 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57  arameter.  The W
4190: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
41a0: 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65  ture.** is fille
41b0: 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  d with pointers 
41c0: 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  to subexpression
41d0: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
41e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20  .**.**    WHERE 
41f0: 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20   a=='hello' AND 
4200: 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31  coalesce(b,11)<1
4210: 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f  0 AND (c+12!=d O
4220: 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20  R c==22).**     
4230: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f        \________/
4240: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
4250: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
4260: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
4270: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
4280: 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73  [0]            s
4290: 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20  lot[1]          
42a0: 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a       slot[2].**.
42b0: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
42c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
42d0: 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72  pExpr is unalter
42e0: 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f  ed.  All this ro
42f0: 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73  utine.** does is
4300: 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74   make slot[] ent
4310: 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75  ries point to su
4320: 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69  bstructure withi
4330: 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49  n pExpr..**.** I
4340: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  n the previous s
4350: 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74  entence and in t
4360: 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f  he diagram, "slo
4370: 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a  t[]" refers to.*
4380: 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  * the WhereClaus
4390: 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68  e.a[] array.  Th
43a0: 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67  e slot[] array g
43b0: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
43c0: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
43d0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
43e0: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
43f0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
4400: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
4410: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
4420: 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  xpr, int op){.  
4430: 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  pWC->op = (u8)op
4440: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
4450: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
4460: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
4470: 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
4480: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78  eInsert(pWC, pEx
4490: 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pr, 0);.  }else{
44a0: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
44b0: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  pWC, pExpr->pLef
44c0: 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72  t, op);.    wher
44d0: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
44e0: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a  r->pRight, op);.
44f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
4500: 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65  tialize an expre
4510: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 28  ssion mask set (
4520: 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f  a WhereMaskSet o
4530: 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65 66 69 6e  bject).*/.#defin
4540: 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29  e initMaskSet(P)
4550: 20 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20 73    memset(P, 0, s
4560: 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a  izeof(*P))../*.*
4570: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
4580: 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76  mask for the giv
4590: 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  en cursor number
45a0: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a  .  Return 0 if.*
45b0: 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74  * iCursor is not
45c0: 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a   in the set..*/.
45d0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67  static Bitmask g
45e0: 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  etMask(WhereMask
45f0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
4600: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69  nt iCursor){.  i
4610: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
4620: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e  pMaskSet->n<=(in
4630: 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  t)sizeof(Bitmask
4640: 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  )*8 );.  for(i=0
4650: 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b  ; i<pMaskSet->n;
4660: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
4670: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d  MaskSet->ix[i]==
4680: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
4690: 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61 73   return ((Bitmas
46a0: 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20  k)1)<<i;.    }. 
46b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
46c0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
46d0: 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75   new mask for cu
46e0: 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a  rsor iCursor..**
46f0: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  .** There is one
4700: 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c   cursor per tabl
4710: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
4720: 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65  ause.  The numbe
4730: 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69  r of.** tables i
4740: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
4750: 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
4760: 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20  a test early in 
4770: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  the.** sqlite3Wh
4780: 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69  ereBegin() routi
4790: 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20  ne.  So we know 
47a0: 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65  that the pMaskSe
47b0: 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79  t->ix[].** array
47c0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72   will never over
47d0: 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  flow..*/.static 
47e0: 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28  void createMask(
47f0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
4800: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
4810: 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  sor){.  assert( 
4820: 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72  pMaskSet->n < Ar
4830: 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74  raySize(pMaskSet
4840: 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b  ->ix) );.  pMask
4850: 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74  Set->ix[pMaskSet
4860: 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72  ->n++] = iCursor
4870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4880: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72  routine walks (r
4890: 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65  ecursively) an e
48a0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
48b0: 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20  nd generates.** 
48c0: 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61  a bitmask indica
48d0: 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65  ting which table
48e0: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
48f0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  at expression.**
4900: 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   tree..**.** In 
4910: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72  order for this r
4920: 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20  outine to work, 
4930: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
4940: 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a  tion must have.*
4950: 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76  * previously inv
4960: 6f 6b 65 64 20 73 71 6c 69 74 65 33 52 65 73 6f  oked sqlite3Reso
4970: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 6f  lveExprNames() o
4980: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
4990: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65  .  See.** the he
49a0: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
49b0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
49c0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
49d0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  rmation..** The 
49e0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
49f0: 70 72 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e  prNames() routin
4a00: 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c  es looks for col
4a10: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a  umn names and.**
4a20: 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f   sets their opco
4a30: 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  des to TK_COLUMN
4a40: 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e   and their Expr.
4a50: 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f  iTable fields to
4a60: 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75 72  .** the VDBE cur
4a70: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
4a80: 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  e table.  This r
4a90: 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20  outine just has 
4aa0: 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20  to.** translate 
4ab0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
4ac0: 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20  rs into bitmask 
4ad0: 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61 6c  values and OR al
4ae0: 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b  l.** the bitmask
4af0: 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73  s together..*/.s
4b00: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
4b10: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
4b20: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20  (WhereMaskSet*, 
4b30: 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
4b40: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
4b50: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
4b60: 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53  WhereMaskSet*, S
4b70: 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20  elect*);.static 
4b80: 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c  Bitmask exprTabl
4b90: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
4ba0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
4bb0: 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61  xpr *p){.  Bitma
4bc0: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
4bd0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
4be0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d   0;.  if( p->op=
4bf0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
4c00: 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b    mask = getMask
4c10: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54  (pMaskSet, p->iT
4c20: 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72  able);.    retur
4c30: 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61  n mask;.  }.  ma
4c40: 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  sk = exprTableUs
4c50: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
4c60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b  >pRight);.  mask
4c70: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
4c80: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
4c90: 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 45 78  pLeft);.  if( Ex
4ca0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
4cb0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
4cc0: 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  {.    mask |= ex
4cd0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
4ce0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
4cf0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65  x.pSelect);.  }e
4d00: 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  lse{.    mask |=
4d10: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4d20: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
4d30: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  >x.pList);.  }. 
4d40: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
4d50: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
4d60: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
4d70: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
4d80: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69  pMaskSet, ExprLi
4d90: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
4da0: 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  t i;.  Bitmask m
4db0: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
4dc0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
4dd0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
4de0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
4df0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
4e00: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4e10: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
4e20: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
4e30: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
4e40: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4e50: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
4e60: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
4e70: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c  t *pMaskSet, Sel
4e80: 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d  ect *pS){.  Bitm
4e90: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
4ea0: 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20  while( pS ){.   
4eb0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
4ec0: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 6d   pS->pSrc;.    m
4ed0: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
4ee0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4ef0: 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b  et, pS->pEList);
4f00: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
4f10: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
4f20: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47  pMaskSet, pS->pG
4f30: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73  roupBy);.    mas
4f40: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
4f50: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4f60: 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b  , pS->pOrderBy);
4f70: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
4f80: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
4f90: 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65  kSet, pS->pWhere
4fa0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
4fb0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4fc0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76  askSet, pS->pHav
4fd0: 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 41 4c  ing);.    if( AL
4fe0: 57 41 59 53 28 70 53 72 63 21 3d 30 29 20 29 7b  WAYS(pSrc!=0) ){
4ff0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
5000: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5010: 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
5020: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  .        mask |=
5030: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
5040: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
5050: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
5060: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 73  ct);.        mas
5070: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
5080: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
5090: 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20  rc->a[i].pOn);. 
50a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
50b0: 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72   pS = pS->pPrior
50c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
50d0: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ask;.}../*.** Re
50e0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
50f0: 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20   given operator 
5100: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  is one of the op
5110: 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a  erators that is.
5120: 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61  ** allowed for a
5130: 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52  n indexable WHER
5140: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20  E clause term.  
5150: 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72  The allowed oper
5160: 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22  ators are.** "="
5170: 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22  , "<", ">", "<="
5180: 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22  , ">=", and "IN"
5190: 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e  ..**.** IMPLEMEN
51a0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39  TATION-OF: R-599
51b0: 32 36 2d 32 36 33 39 33 20 54 6f 20 62 65 20 75  26-26393 To be u
51c0: 73 61 62 6c 65 20 62 79 20 61 6e 20 69 6e 64 65  sable by an inde
51d0: 78 20 61 20 74 65 72 6d 20 6d 75 73 74 20 62 65  x a term must be
51e0: 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68  .** of one of th
51f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
5200: 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72  s: column = expr
5210: 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20  ession column > 
5220: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f  expression.** co
5230: 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65 73 73 69  lumn >= expressi
5240: 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65 78 70 72  on column < expr
5250: 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d  ession column <=
5260: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65   expression.** e
5270: 78 70 72 65 73 73 69 6f 6e 20 3d 20 63 6f 6c 75  xpression = colu
5280: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 20  mn expression > 
5290: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
52a0: 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65  n >= column.** e
52b0: 78 70 72 65 73 73 69 6f 6e 20 3c 20 63 6f 6c 75  xpression < colu
52c0: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 3d  mn expression <=
52d0: 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49   column column I
52e0: 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73 69 6f 6e  N.** (expression
52f0: 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e 20 49 4e  -list) column IN
5300: 20 28 73 75 62 71 75 65 72 79 29 20 63 6f 6c 75   (subquery) colu
5310: 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74  mn IS NULL.*/.st
5320: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64  atic int allowed
5330: 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73  Op(int op){.  as
5340: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
5350: 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45  Q && TK_GT<TK_GE
5360: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b   );.  assert( TK
5370: 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f  _LT>TK_EQ && TK_
5380: 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  LT<TK_GE );.  as
5390: 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45  sert( TK_LE>TK_E
53a0: 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45  Q && TK_LE<TK_GE
53b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b   );.  assert( TK
53c0: 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a  _GE==TK_EQ+4 );.
53d0: 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f    return op==TK_
53e0: 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51  IN || (op>=TK_EQ
53f0: 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c   && op<=TK_GE) |
5400: 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b  | op==TK_ISNULL;
5410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74  .}../*.** Swap t
5420: 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79  wo objects of ty
5430: 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66  pe TYPE..*/.#def
5440: 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c  ine SWAP(TYPE,A,
5450: 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d  B) {TYPE t=A; A=
5460: 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20  B; B=t;}../*.** 
5470: 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72  Commute a compar
5480: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
5490: 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
54a0: 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22  he form "X op Y"
54b0: 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65  .** are converte
54c0: 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e  d into "Y op X".
54d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 6f 6c 6c  .**.** If a coll
54e0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
54f0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
5500: 68 20 65 69 74 68 65 72 20 74 68 65 20 6c 65 66  h either the lef
5510: 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a 20 73 69  t or right.** si
5520: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
5530: 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73  ison, it remains
5540: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5550: 20 74 68 65 20 73 61 6d 65 20 73 69 64 65 20 61   the same side a
5560: 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d  fter.** the comm
5570: 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63  utation. So "Y c
5580: 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70  ollate NOCASE op
5590: 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20   X" becomes .** 
55a0: 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53  "X collate NOCAS
55b0: 45 20 6f 70 20 59 22 2e 20 54 68 69 73 20 69 73  E op Y". This is
55c0: 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c   because any col
55d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
55e0: 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68  on.** the left h
55f0: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f  and side of a co
5600: 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64  mparison overrid
5610: 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  es any collation
5620: 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74   sequence .** at
5630: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72 69  tached to the ri
5640: 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d  ght. For the sam
5650: 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f  e reason the EP_
5660: 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a  ExpCollate flag.
5670: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74  ** is not commut
5680: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
5690: 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50  id exprCommute(P
56a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
56b0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31  pr *pExpr){.  u1
56c0: 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45  6 expRight = (pE
56d0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
56e0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
56f0: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
5700: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
5710: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  ft->flags & EP_E
5720: 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73  xpCollate);.  as
5730: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
5740: 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45  pExpr->op) && pE
5750: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29  xpr->op!=TK_IN )
5760: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ;.  pExpr->pRigh
5770: 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  t->pColl = sqlit
5780: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
5790: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
57a0: 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  ght);.  pExpr->p
57b0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Left->pColl = sq
57c0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
57d0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
57e0: 70 4c 65 66 74 29 3b 0a 20 20 53 57 41 50 28 43  pLeft);.  SWAP(C
57f0: 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e 70  ollSeq*,pExpr->p
5800: 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78  Right->pColl,pEx
5810: 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  pr->pLeft->pColl
5820: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
5830: 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78  ht->flags = (pEx
5840: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
5850: 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61  s & ~EP_ExpColla
5860: 74 65 29 20 7c 20 65 78 70 4c 65 66 74 3b 0a 20  te) | expLeft;. 
5870: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66   pExpr->pLeft->f
5880: 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70  lags = (pExpr->p
5890: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45  Left->flags & ~E
58a0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20  P_ExpCollate) | 
58b0: 65 78 70 52 69 67 68 74 3b 0a 20 20 53 57 41 50  expRight;.  SWAP
58c0: 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52  (Expr*,pExpr->pR
58d0: 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66  ight,pExpr->pLef
58e0: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
58f0: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op>=TK_GT ){.  
5900: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
5910: 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20  =TK_GT+2 );.    
5920: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
5930: 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_LE+2 );.    as
5940: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
5950: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
5960: 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a   TK_GT<TK_LE );.
5970: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
5980: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20  r->op>=TK_GT && 
5990: 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45  pExpr->op<=TK_GE
59a0: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   );.    pExpr->o
59b0: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d  p = ((pExpr->op-
59c0: 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b  TK_GT)^2)+TK_GT;
59d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
59e0: 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f  anslate from TK_
59f0: 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57  xx operator to W
5a00: 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f  O_xx bitmask..*/
5a10: 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70 65 72  .static u16 oper
5a20: 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29  atorMask(int op)
5a30: 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73  {.  u16 c;.  ass
5a40: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f  ert( allowedOp(o
5a50: 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  p) );.  if( op==
5a60: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d  TK_IN ){.    c =
5a70: 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20   WO_IN;.  }else 
5a80: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
5a90: 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  L ){.    c = WO_
5aa0: 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  ISNULL;.  }else{
5ab0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57 4f  .    assert( (WO
5ac0: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
5ad0: 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20 20   < 0x7fff );.   
5ae0: 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45 51   c = (u16)(WO_EQ
5af0: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20  <<(op-TK_EQ));. 
5b00: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21   }.  assert( op!
5b10: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d  =TK_ISNULL || c=
5b20: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =WO_ISNULL );.  
5b30: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
5b40: 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b  N || c==WO_IN );
5b50: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
5b60: 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51  K_EQ || c==WO_EQ
5b70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5b80: 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LT || c==WO
5b90: 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LT );.  assert(
5ba0: 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d   op!=TK_LE || c=
5bb0: 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65  =WO_LE );.  asse
5bc0: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  rt( op!=TK_GT ||
5bd0: 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61   c==WO_GT );.  a
5be0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45  ssert( op!=TK_GE
5bf0: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a   || c==WO_GE );.
5c00: 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
5c10: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
5c20: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
5c30: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
5c40: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
5c50: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
5c60: 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72  * where X is a r
5c70: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
5c80: 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65  iColumn of table
5c90: 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69   iCur and <op> i
5ca0: 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20  s one of.** the 
5cb0: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
5cc0: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
5cd0: 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  y the op paramet
5ce0: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  er..** Return a 
5cf0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
5d00: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69  erm.  Return 0 i
5d10: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
5d20: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
5d30: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
5d40: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
5d50: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5d60: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
5d70: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
5d80: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
5d90: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
5da0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
5db0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
5dc0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
5dd0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
5de0: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
5df0: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
5e00: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
5e10: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
5e20: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
5e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
5e40: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
5e50: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
5e60: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
5e70: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
5e80: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
5e90: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
5ea0: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
5eb0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
5ec0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
5ed0: 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65 72 74 28  int k;.  assert(
5ee0: 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20 20 6f 70   iCur>=0 );.  op
5ef0: 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20 20 66 6f   &= WO_ALL;.  fo
5f00: 72 28 3b 20 70 57 43 3b 20 70 57 43 3d 70 57 43  r(; pWC; pWC=pWC
5f10: 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 66  ->pOuter){.    f
5f20: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
5f30: 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k=pWC->nTerm; k
5f40: 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; k--, pTerm++){
5f50: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
5f60: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
5f70: 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ur.         && (
5f80: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
5f90: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  ht & notReady)==
5fa0: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 54  0.         && pT
5fb0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
5fc0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  n==iColumn.     
5fd0: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
5fe0: 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29 21 3d  Operator & op)!=
5ff0: 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
6000: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
6010: 30 20 26 26 20 70 49 64 78 20 26 26 20 70 54 65  0 && pIdx && pTe
6020: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
6030: 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
6040: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
6050: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
6060: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
6070: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
6080: 20 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a     char idxaff;.
6090: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
60a0: 0a 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65  .          Parse
60b0: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
60c0: 70 50 61 72 73 65 3b 0a 20 20 0a 20 20 20 20 20  pParse;.  .     
60d0: 20 20 20 20 20 69 64 78 61 66 66 20 3d 20 70 49       idxaff = pI
60e0: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
60f0: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
6100: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ty;.          if
6110: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
6120: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64  ffinityOk(pX, id
6130: 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  xaff) ) continue
6140: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 2f  ;.  .          /
6150: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
6160: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
6170: 6e 63 65 20 72 65 71 75 69 72 65 64 20 66 72 6f  nce required fro
6180: 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20  m an index for. 
6190: 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 74           ** it t
61a0: 6f 20 62 65 20 75 73 65 66 75 6c 20 66 6f 72 20  o be useful for 
61b0: 6f 70 74 69 6d 69 73 69 6e 67 20 65 78 70 72 65  optimising expre
61c0: 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72 65 20  ssion pX. Store 
61d0: 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
61e0: 2a 20 76 61 6c 75 65 20 69 6e 20 76 61 72 69 61  * value in varia
61f0: 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20  ble pColl..     
6200: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
6210: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
6220: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ft);.          p
6230: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
6240: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
6250: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
6260: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
6270: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
6280: 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20 70 50 61  ert(pColl || pPa
6290: 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 20 20 0a 20  rse->nErr);.  . 
62a0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
62b0: 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ; pIdx->aiColumn
62c0: 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b  [j]!=iColumn; j+
62d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
62e0: 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64  if( NEVER(j>=pId
62f0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65  x->nColumn) ) re
6300: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
6310: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
6320: 28 20 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69 74  ( pColl && sqlit
6330: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
6340: 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
6350: 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69  Coll[j]) ) conti
6360: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
6370: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54         return pT
6380: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
6390: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
63a0: 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  0;.}../* Forward
63b0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
63c0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
63d0: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
63e0: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
63f0: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
6400: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
6410: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
6420: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a  ERE clause.  .**
6430: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
6440: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
6450: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
6460: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
6470: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
6480: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
6490: 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f  e *pWC         /
64a0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
64b0: 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  se to be analyze
64c0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
64d0: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
64e0: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
64f0: 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  ){.    exprAnaly
6500: 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ze(pTabList, pWC
6510: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
6520: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6530: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
6540: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
6550: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
6560: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
6570: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
6580: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
6590: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
65a0: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
65b0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
65c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
65d0: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
65e0: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
65f0: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
6600: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
6610: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
6620: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
6630: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
6640: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
6650: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
6660: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
6670: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
6680: 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20  OrGlob(.  Parse 
6690: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
66a0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
66b0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
66c0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
66d0: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
66e0: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
66f0: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
6700: 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e  Prefix,  /* Poin
6710: 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47  ter to TK_STRING
6720: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
6730: 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20   pattern prefix 
6740: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d  */.  int *pisCom
6750: 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69  plete, /* True i
6760: 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63  f the only wildc
6770: 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20  ard is % in the 
6780: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a  last character *
6790: 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65  /.  int *pnoCase
67a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
67b0: 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71   uppercase is eq
67c0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65  uivalent to lowe
67d0: 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  rcase */.){.  co
67e0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
67f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
6800: 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b  ng on RHS of LIK
6810: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
6820: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
6830: 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69  Left;      /* Ri
6840: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a  ght and left siz
6850: 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  e of LIKE operat
6860: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  or */.  ExprList
6870: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
6880: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70     /* List of op
6890: 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49  erands to the LI
68a0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
68b0: 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20   int c;         
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
68d0: 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ne character in 
68e0: 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  z[] */.  int cnt
68f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6900: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6910: 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72   non-wildcard pr
6920: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20  efix characters 
6930: 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b  */.  char wc[3];
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72  /* Wildcard char
6960: 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  acters */.  sqli
6970: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6980: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
6990: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
69a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
69b0: 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pVal = 0;.  in
69c0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
69d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
69e0: 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a  de of pRight */.
69f0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
6a00: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
6a10: 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65  , pExpr, pnoCase
6a20: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
6a30: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  urn 0;.  }.#ifde
6a40: 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a  f SQLITE_EBCDIC.
6a50: 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29    if( *pnoCase )
6a60: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
6a70: 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  f.  pList = pExp
6a80: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c  r->x.pList;.  pL
6a90: 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31  eft = pList->a[1
6aa0: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
6ab0: 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Left->op!=TK_COL
6ac0: 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  UMN .   || sqlit
6ad0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
6ae0: 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46  Left)!=SQLITE_AF
6af0: 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73  F_TEXT .   || Is
6b00: 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70  Virtual(pLeft->p
6b10: 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  Tab).  ){.    /*
6b20: 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39   IMP: R-02065-49
6b30: 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  465 The left-han
6b40: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49  d side of the LI
6b50: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
6b60: 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  tor must.    ** 
6b70: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
6b80: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
6b90: 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e   with TEXT affin
6ba0: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ity. */.    retu
6bb0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 0;.  }.  asse
6bc0: 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  rt( pLeft->iColu
6bd0: 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42  mn!=(-1) ); /* B
6be0: 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72  ecause IPK never
6bf0: 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f   has AFF_TEXT */
6c00: 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69  ..  pRight = pLi
6c10: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
6c20: 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f    op = pRight->o
6c30: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
6c40: 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
6c50: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32  op = pRight->op2
6c60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
6c70: 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20  TK_VARIABLE ){. 
6c80: 20 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 70     Vdbe *pReprep
6c90: 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52  are = pParse->pR
6ca0: 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e  eprepare;.    in
6cb0: 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d  t iCol = pRight-
6cc0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56  >iColumn;.    pV
6cd0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  al = sqlite3Vdbe
6ce0: 47 65 74 56 61 6c 75 65 28 70 52 65 70 72 65 70  GetValue(pReprep
6cf0: 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54  are, iCol, SQLIT
6d00: 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20  E_AFF_NONE);.   
6d10: 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c   if( pVal && sql
6d20: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
6d30: 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  pVal)==SQLITE_TE
6d40: 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  XT ){.      z = 
6d50: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
6d60: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
6d70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6d80: 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
6d90: 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  k(pParse->pVdbe,
6da0: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65   iCol);.    asse
6db0: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
6dc0: 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70  TK_VARIABLE || p
6dd0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  Right->op==TK_RE
6de0: 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73  GISTER );.  }els
6df0: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52  e if( op==TK_STR
6e00: 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  ING ){.    z = p
6e10: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  Right->u.zToken;
6e20: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a  .  }.  if( z ){.
6e30: 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
6e40: 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74   while( (c=z[cnt
6e50: 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30  ])!=0 && c!=wc[0
6e60: 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26  ] && c!=wc[1] &&
6e70: 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20   c!=wc[2] ){.   
6e80: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
6e90: 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26      if( cnt!=0 &
6ea0: 26 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74  & 255!=(u8)z[cnt
6eb0: 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  -1] ){.      Exp
6ec0: 72 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20  r *pPrefix;.    
6ed0: 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d    *pisComplete =
6ee0: 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63   c==wc[0] && z[c
6ef0: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20  nt+1]==0;.      
6f00: 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65  pPrefix = sqlite
6f10: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52  3Expr(db, TK_STR
6f20: 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69  ING, z);.      i
6f30: 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72  f( pPrefix ) pPr
6f40: 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63  efix->u.zToken[c
6f50: 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a  nt] = 0;.      *
6f60: 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66  ppPrefix = pPref
6f70: 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ix;.      if( op
6f80: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
6f90: 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
6fa0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6fb0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6fc0: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
6fd0: 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  v, pRight->iColu
6fe0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mn);.        if(
6ff0: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26   *pisComplete &&
7000: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
7010: 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[1] ){.        
7020: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20    /* If the rhs 
7030: 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72  of the LIKE expr
7040: 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69  ession is a vari
7050: 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75  able, and the cu
7060: 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  rrent.          
7070: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
7080: 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74  variable means t
7090: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
70a0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49  to invoke the LI
70b0: 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  KE.          ** 
70c0: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e  function, then n
70d0: 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69  o OP_Variable wi
70e0: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
70f0: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
7100: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
7110: 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f  uses problems fo
7120: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  r the sqlite3_bi
7130: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
7140: 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
7150: 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f   API. To workaro
7160: 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20  und them, add a 
7170: 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c  dummy OP_Variabl
7180: 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20  e here..        
7190: 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
71a0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
71b0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
71c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
71d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
71e0: 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67  get(pParse, pRig
71f0: 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  ht, r1);.       
7200: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7210: 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65  angeP3(v, sqlite
7220: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
7230: 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  (v)-1, 0);.     
7240: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
7250: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
7260: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
7270: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
7280: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30  lse{.      z = 0
7290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
72a0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
72b0: 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVal);.  return 
72c0: 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  (z!=0);.}.#endif
72d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
72e0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
72f0: 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N */...#ifndef S
7300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
7310: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68  ALTABLE./*.** Ch
7320: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
7330: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
7340: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
7350: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  m.**.**         
7360: 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70  column MATCH exp
7370: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  r.**.** If it is
7380: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55   then return TRU
7390: 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75  E.  If not, retu
73a0: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
73b0: 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f  tic int isMatchO
73c0: 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20  fColumn(.  Expr 
73d0: 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54  *pExpr      /* T
73e0: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
73f0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ion */.){.  Expr
7400: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20  List *pList;..  
7410: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
7420: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
7430: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7440: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
7450: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
7460: 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30  oken,"match")!=0
7470: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7480: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
7490: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
74a0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
74b0: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  pr!=2 ){.    ret
74c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
74d0: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
74e0: 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c  pr->op != TK_COL
74f0: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
7500: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
7510: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
7520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7530: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
7540: 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65  .** If the pBase
7550: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
7560: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
7570: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
7580: 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74   of.** a join, t
7590: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
75a0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72   appropriate mar
75b0: 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65  kings over to de
75c0: 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rived..*/.static
75d0: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f   void transferJo
75e0: 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20  inMarkings(Expr 
75f0: 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20  *pDerived, Expr 
7600: 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69  *pBase){.  pDeri
7610: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
7620: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
7630: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72  FromJoin;.  pDer
7640: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
7650: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
7660: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
7670: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
7680: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
7690: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
76a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
76b0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f  OMIT_SUBQUERY)./
76c0: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74  *.** Analyze a t
76d0: 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74  erm that consist
76e0: 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s of two or more
76f0: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a   OR-connected.**
7700: 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69   subterms.  So i
7710: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  n:.**.**     ...
7720: 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e   WHERE  (a=5) AN
7730: 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52  D (b=7 OR c=9 OR
7740: 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33   d=13) AND (d=13
7750: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e                ^^
7770: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
7780: 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ^^.**.** This ro
7790: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
77a0: 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65  erms such as the
77b0: 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20   middle term in 
77c0: 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c  the above exampl
77d0: 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54  e..** A WhereOrT
77e0: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
77f0: 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63  mputed and attac
7800: 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20  hed to the term 
7810: 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69  under.** analysi
7820: 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  s, regardless of
7830: 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20   the outcome of 
7840: 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48  the analysis.  H
7850: 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ence:.**.**     
7860: 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67  WhereTerm.wtFlag
7870: 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49  s   |=  TERM_ORI
7880: 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  NFO.**     Where
7890: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20  Term.u.pOrInfo  
78a0: 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  =  a dynamically
78b0: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
78c0: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a  OrTerm object.**
78d0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69  .** The term bei
78e0: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74  ng analyzed must
78f0: 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72   have two or mor
7900: 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  e of OR-connecte
7910: 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41  d subterms..** A
7920: 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20   single subterm 
7930: 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f  might be a set o
7940: 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  f AND-connected 
7950: 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a  sub-subterms..**
7960: 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72   Examples of ter
7970: 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69  ms under analysi
7980: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29  s:.**.**     (A)
7990: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
79a0: 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74  R t1.x=t2.z OR t
79b0: 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74  1.y=15 OR t1.z=t
79c0: 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29  3.a+5.**     (B)
79d0: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
79e0: 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70  expr2=x OR x=exp
79f0: 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20  r3.**     (C)   
7a00: 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28    t1.x=t2.y OR (
7a10: 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31  t1.x=t2.z AND t1
7a20: 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44  .y=15).**     (D
7a30: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
7a40: 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20   (y>11 AND y<22 
7a50: 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c  AND z LIKE '*hel
7a60: 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29  lo*').**     (E)
7a70: 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20       (p.a=1 AND 
7a80: 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29  q.b=2 AND r.c=3)
7a90: 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71   OR (p.x=4 AND q
7aa0: 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a  .y=5 AND r.z=6).
7ab0: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a  **.** CASE 1:.**
7ac0: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
7ad0: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
7ae0: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72  orm T.C=expr for
7af0: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c   some single col
7b00: 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69  umn of C.** a si
7b10: 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73  ngle table T (as
7b20: 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c   shown in exampl
7b30: 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20  e B above) then 
7b40: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
7b50: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61  tual.** term tha
7b60: 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65  t is an equivale
7b70: 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  nt IN expression
7b80: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
7b90: 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a  s, if the term.*
7ba0: 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  * being analyzed
7bb0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   is:.**.**      
7bc0: 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65  x = expr1  OR  e
7bd0: 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20  xpr2 = x  OR  x 
7be0: 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68  = expr3.**.** th
7bf0: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7c00: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b  virtual term lik
7c10: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
7c20: 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65     x IN (expr1,e
7c30: 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a  xpr2,expr3).**.*
7c40: 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20  * CASE 2:.**.** 
7c50: 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20  If all subterms 
7c60: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79  are indexable by
7c70: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
7c80: 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a  T, then set.**.*
7c90: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
7ca0: 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20  eOperator       
7cb0: 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a         =  WO_OR.
7cc0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
7cd0: 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .u.pOrInfo->inde
7ce0: 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63  xable  |=  the c
7cf0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
7d00: 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41   table T.**.** A
7d10: 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64   subterm is "ind
7d20: 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73  exable" if it is
7d30: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20   of the form.** 
7d40: 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  "T.C <op> <expr>
7d50: 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79  " where C is any
7d60: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
7d70: 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20   T and .** <op> 
7d80: 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22  is one of "=", "
7d90: 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22  <", "<=", ">", "
7da0: 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20  >=", "IS NULL", 
7db0: 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75  or "IN"..** A su
7dc0: 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e  bterm is also in
7dd0: 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73  dexable if it is
7de0: 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f   an AND of two o
7df0: 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62  r more.** subsub
7e00: 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f  terms at least o
7e10: 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69  ne of which is i
7e20: 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78  ndexable.  Index
7e30: 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62  able AND .** sub
7e40: 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72  terms have their
7e50: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
7e60: 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65  o WO_AND and the
7e70: 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64  y have.** u.pAnd
7e80: 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79  Info set to a dy
7e90: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
7ea0: 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d  ted WhereAndTerm
7eb0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46   object..**.** F
7ec0: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e  rom another poin
7ed0: 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65  t of view, "inde
7ee0: 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61  xable" means tha
7ef0: 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f  t the subterm co
7f00: 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  uld.** potential
7f10: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ly be used with 
7f20: 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61  an index if an a
7f30: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
7f40: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73   exists..** This
7f50: 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e   analysis does n
7f60: 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74  ot consider whet
7f70: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69  her or not the i
7f80: 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61  ndex exists; tha
7f90: 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e  t.** is somethin
7fa0: 67 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28  g the bestIndex(
7fb0: 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  ) routine will d
7fc0: 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20  etermine.  This 
7fd0: 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79  analysis.** only
7fe0: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
7ff0: 72 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f  r subterms appro
8000: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78  priate for index
8010: 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ing exist..**.**
8020: 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20   All examples A 
8030: 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20  through E above 
8040: 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65  all satisfy case
8050: 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65   2.  But if a te
8060: 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69  rm.** also stati
8070: 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75  sfies case 1 (su
8080: 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77  ch as B) we know
8090: 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69   that the optimi
80a0: 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61  zer will.** alwa
80b0: 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31  ys prefer case 1
80c0: 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73  , so in that cas
80d0: 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61  e we pretend tha
80e0: 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a  t case 2 is not.
80f0: 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a  ** satisfied..**
8100: 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20  .** It might be 
8110: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75  the case that mu
8120: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72  ltiple tables ar
8130: 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f  e indexable.  Fo
8140: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45  r example,.** (E
8150: 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78  ) above is index
8160: 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50  able on tables P
8170: 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a  , Q, and R..**.*
8180: 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74  * Terms that sat
8190: 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20  isfy case 2 are 
81a0: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c  candidates for l
81b0: 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a  ookup by using.*
81c0: 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  * separate indic
81d0: 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64  es to find rowid
81e0: 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65  s for each subte
81f0: 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67  rm and composing
8200: 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66  .** the union of
8210: 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e   all rowids usin
8220: 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  g a RowSet objec
8230: 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69  t.  This is simi
8240: 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61  lar.** to "bitma
8250: 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74  p indices" in ot
8260: 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67  her database eng
8270: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45  ines..**.** OTHE
8280: 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  RWISE:.**.** If 
8290: 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e  neither case 1 n
82a0: 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c  or case 2 apply,
82b0: 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20   then leave the 
82c0: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
82d0: 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20  .** zero.  This 
82e0: 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66  term is not usef
82f0: 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a  ul for search..*
8300: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
8310: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
8320: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
8330: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
8340: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
8350: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
8360: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
8370: 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57  * the complete W
8380: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
8390: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
83a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
83b0: 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65  dex of the OR-te
83c0: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
83d0: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
83e0: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
83f0: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
8400: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
8410: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
8420: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8430: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
8440: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
8450: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  nection */.  Whe
8460: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
8470: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
8480: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
8490: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
84a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
84b0: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
84d0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
84e0: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
84f0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
8500: 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
8510: 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65  askSet; /* Table
8520: 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20   use masks */.  
8530: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8560: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
8570: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
8580: 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b  ;       /* Break
8590: 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f  up of pTerm into
85a0: 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57   subterms */.  W
85b0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
85c0: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75  m;       /* A Su
85d0: 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  b-term within th
85e0: 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65  e pOrWc */.  Whe
85f0: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66  reOrInfo *pOrInf
8600: 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69  o;     /* Additi
8610: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
8620: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8630: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d   pTerm */.  Bitm
8640: 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20  ask chngToIN;   
8650: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
8660: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
8670: 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42  fy case 1 */.  B
8680: 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65  itmask indexable
8690: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ;        /* Tabl
86a0: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65  es that are inde
86b0: 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e  xable, satisfyin
86c0: 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f  g case 2 */..  /
86d0: 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65  *.  ** Break the
86e0: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
86f0: 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62  its separate sub
8700: 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74  terms.  The subt
8710: 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74  erms are.  ** st
8720: 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43  ored in a WhereC
8730: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20  lause structure 
8740: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69  containing withi
8750: 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66  n the WhereOrInf
8760: 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68  o.  ** object th
8770: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74  at is attached t
8780: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f  o the original O
8790: 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20  R clause term.. 
87a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
87b0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
87c0: 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  (TERM_DYNAMIC|TE
87d0: 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41  RM_ORINFO|TERM_A
87e0: 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  NDINFO))==0 );. 
87f0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
8800: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70  op==TK_OR );.  p
8810: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20  Term->u.pOrInfo 
8820: 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69  = pOrInfo = sqli
8830: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
8840: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49  db, sizeof(*pOrI
8850: 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72  nfo));.  if( pOr
8860: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
8870: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
8880: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46  gs |= TERM_ORINF
8890: 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f  O;.  pOrWc = &pO
88a0: 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65  rInfo->wc;.  whe
88b0: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72  reClauseInit(pOr
88c0: 57 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c  Wc, pWC->pParse,
88d0: 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e   pMaskSet, pWC->
88e0: 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 77  wctrlFlags);.  w
88f0: 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c  hereSplit(pOrWc,
8900: 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a   pExpr, TK_OR);.
8910: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
8920: 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20  (pSrc, pOrWc);. 
8930: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
8940: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
8950: 20 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d    assert( pOrWc-
8960: 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20  >nTerm>=2 );..  
8970: 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20  /*.  ** Compute 
8980: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
8990: 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74  s that might sat
89a0: 69 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20  isfy cases 1 or 
89b0: 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61  2..  */.  indexa
89c0: 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ble = ~(Bitmask)
89d0: 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20  0;.  chngToIN = 
89e0: 7e 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20  ~(pWC->vmask);. 
89f0: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
8a00: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
8a10: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26  OrWc->a; i>=0 &&
8a20: 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c   indexable; i--,
8a30: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
8a40: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
8a50: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
8a60: 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NGLE)==0 ){.    
8a70: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
8a80: 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAndInfo;.      
8a90: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8aa0: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b  >eOperator==0 );
8ab0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
8ac0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8ad0: 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   & (TERM_ANDINFO
8ae0: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d  |TERM_ORINFO))==
8af0: 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54  0 );.      chngT
8b00: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  oIN = 0;.      p
8b10: 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  AndInfo = sqlite
8b20: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8b30: 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66   sizeof(*pAndInf
8b40: 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  o));.      if( p
8b50: 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  AndInfo ){.     
8b60: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
8b70: 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20  pAndWC;.        
8b80: 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54  WhereTerm *pAndT
8b90: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  erm;.        int
8ba0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   j;.        Bitm
8bb0: 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20  ask b = 0;.     
8bc0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41     pOrTerm->u.pA
8bd0: 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66  ndInfo = pAndInf
8be0: 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  o;.        pOrTe
8bf0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
8c00: 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20  ERM_ANDINFO;.   
8c10: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f       pOrTerm->eO
8c20: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44  perator = WO_AND
8c30: 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43  ;.        pAndWC
8c40: 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63   = &pAndInfo->wc
8c50: 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43  ;.        whereC
8c60: 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43  lauseInit(pAndWC
8c70: 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70  , pWC->pParse, p
8c80: 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77 63  MaskSet, pWC->wc
8c90: 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  trlFlags);.     
8ca0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 41     whereSplit(pA
8cb0: 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  ndWC, pOrTerm->p
8cc0: 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  Expr, TK_AND);. 
8cd0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
8ce0: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64  zeAll(pSrc, pAnd
8cf0: 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  WC);.        pAn
8d00: 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57  dWC->pOuter = pW
8d10: 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  C;.        testc
8d20: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
8d30: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
8d40: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
8d50: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
8d60: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
8d70: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
8d80: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
8d90: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
8da0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
8db0: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
8dc0: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
8dd0: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
8de0: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
8df0: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
8e00: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
8e10: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
8e20: 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74  , pAndTerm->left
8e30: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
8e40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8e50: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8e60: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
8e70: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
8e80: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
8e90: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
8ea0: 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20  RM_COPIED ){.   
8eb0: 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20     /* Skip this 
8ec0: 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57  term for now.  W
8ed0: 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65  e revisit it whe
8ee0: 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65  n we process the
8ef0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  .      ** corres
8f00: 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52  ponding TERM_VIR
8f10: 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20  TUAL term */.   
8f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
8f30: 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62  tmask b;.      b
8f40: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
8f50: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
8f60: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
8f70: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
8f80: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
8f90: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
8fa0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
8fb0: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
8fc0: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
8fd0: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
8fe0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
8ff0: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
9000: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
9010: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
9020: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  b;.      if( pOr
9030: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
9040: 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =WO_EQ ){.      
9050: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a    chngToIN = 0;.
9060: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9070: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d       chngToIN &=
9080: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
9090: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
90a0: 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20   Record the set 
90b0: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
90c0: 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20  atisfy case 2.  
90d0: 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65  The set might be
90e0: 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a  .  ** empty..  *
90f0: 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  /.  pOrInfo->ind
9100: 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62  exable = indexab
9110: 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  le;.  pTerm->eOp
9120: 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62  erator = indexab
9130: 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f  le==0 ? 0 : WO_O
9140: 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68  R;..  /*.  ** ch
9150: 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73  ngToIN holds a s
9160: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
9170: 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66  t *might* satisf
9180: 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20  y case 1.  But. 
9190: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64   ** we have to d
91a0: 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  o some additiona
91b0: 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65  l checking to se
91c0: 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c  e if case 1 real
91d0: 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73  ly.  ** is satis
91e0: 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fied..  **.  ** 
91f0: 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f  chngToIN will ho
9200: 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20  ld either 0, 1, 
9210: 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20  or 2 bits.  The 
9220: 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73  0-bit case means
9230: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65  .  ** that there
9240: 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69   is no possibili
9250: 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69  ty of transformi
9260: 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ng the OR clause
9270: 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e   into an.  ** IN
9280: 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73   operator becaus
9290: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65  e one or more te
92a0: 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  rms in the OR cl
92b0: 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a  ause contain.  *
92c0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  * something othe
92d0: 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63  r than == on a c
92e0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e  olumn in the sin
92f0: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
9300: 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20  1-bit.  ** case 
9310: 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79  means that every
9320: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20   term of the OR 
9330: 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65  clause is of the
9340: 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c   form.  ** "tabl
9350: 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66  e.column=expr" f
9360: 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74  or some single t
9370: 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62  able.  The one b
9380: 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20  it that is set. 
9390: 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70   ** will corresp
93a0: 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f  ond to the commo
93b0: 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69  n table.  We sti
93c0: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  ll need to check
93d0: 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75   to make.  ** su
93e0: 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  re the same colu
93f0: 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c  mn is used on al
9400: 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d  l terms.  The 2-
9410: 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e  bit case is when
9420: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65  .  ** the all te
9430: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
9440: 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75  orm "table1.colu
9450: 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  mn=table2.column
9460: 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68  ".  It.  ** migh
9470: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
9480: 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72   form an IN oper
9490: 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72  ator with either
94a0: 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20   table1.column. 
94b0: 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f   ** or table2.co
94c0: 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20  lumn as the LHS 
94d0: 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d  if either is com
94e0: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
94f0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52  m of.  ** the OR
9500: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
9510: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72  ** Note that ter
9520: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
9530: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61  table.column1=ta
9540: 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68  ble.column2" (th
9550: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c  e.  ** same tabl
9560: 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20  e on both sizes 
9570: 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f  of the ==) canno
9580: 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  t be optimized..
9590: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54    */.  if( chngT
95a0: 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  oIN ){.    int o
95b0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
95c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
95d0: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74  the conversion t
95e0: 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f  o IN is valid */
95f0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  .    int iColumn
9600: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
9610: 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  * Column index o
9620: 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72  n lhs of IN oper
9630: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ator */.    int 
9640: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20  iCursor = -1;   
9650: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63        /* Table c
9660: 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20  ursor common to 
9670: 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  all terms */.   
9680: 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20   int j = 0;     
9690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
96a0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
96b0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
96c0: 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c   a table and col
96d0: 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73  umn that appears
96e0: 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   on one side or 
96f0: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
9700: 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61   of the == opera
9710: 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62  tor in every sub
9720: 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c  term.  That tabl
9730: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20  e and column.   
9740: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f   ** will be reco
9750: 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20  rded in iCursor 
9760: 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68  and iColumn.  Th
9770: 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ere might not be
9780: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
9790: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
97a0: 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67  n.  Set okToChng
97b0: 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f  ToIN if an appro
97c0: 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20  priate table.   
97d0: 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69   ** and column i
97e0: 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76  s found but leav
97f0: 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66  e okToChngToIN f
9800: 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e  alse if not foun
9810: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
9820: 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f  r(j=0; j<2 && !o
9830: 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b  kToChngToIN; j++
9840: 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d  ){.      pOrTerm
9850: 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20   = pOrWc->a;.   
9860: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
9870: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
9880: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
9890: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
98a0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
98b0: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
98c0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
98d0: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
98e0: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
98f0: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
9900: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
9910: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
9920: 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74  his is the 2-bit
9930: 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65   case and we are
9940: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
9950: 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  teration and.   
9960: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
9970: 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74  t term is from t
9980: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
9990: 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69  on.  So skip thi
99a0: 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  s term. */.     
99b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
99c0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
99d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
99e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
99f0: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
9a00: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  sk(pMaskSet, pOr
9a10: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9a20: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
9a30: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
9a40: 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66  must be of the f
9a50: 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77  orm t1.a==t2.b w
9a60: 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68  here t2 is in th
9a70: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
9a80: 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20  hngToIN set but 
9a90: 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73  t1 is not.  This
9aa0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69   term will be ei
9ab0: 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20  ther preceeded. 
9ac0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
9ad0: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
9ae0: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
9af0: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
9b00: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
9b10: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
9b20: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
9b30: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
9b40: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
9b50: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
9b60: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
9b70: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
9b80: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9b90: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
9ba0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9bb0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9bc0: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
9bd0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
9be0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
9bf0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
9c00: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
9c10: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
9c20: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
9c30: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
9c40: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
9c50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9c60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9c70: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
9c80: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
9c90: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
9ca0: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
9cb0: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
9cc0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
9cd0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
9ce0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
9cf0: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
9d00: 20 20 61 73 73 65 72 74 28 20 28 63 68 6e 67 54    assert( (chngT
9d10: 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29  oIN&(chngToIN-1)
9d20: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
9d30: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
9d40: 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  ==getMask(pMaskS
9d50: 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a  et, iCursor) );.
9d60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9d70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
9d80: 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a  tcase( j==1 );..
9d90: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
9da0: 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61   found a candida
9db0: 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  te table and col
9dc0: 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  umn.  Check to s
9dd0: 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20  ee if that.     
9de0: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f   ** table and co
9df0: 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  lumn is common t
9e00: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
9e10: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f  the OR clause */
9e20: 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54  .      okToChngT
9e30: 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  oIN = 1;.      f
9e40: 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54  or(; i>=0 && okT
9e50: 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20  oChngToIN; i--, 
9e60: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
9e70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9e80: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
9e90: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
9ea0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
9eb0: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
9ec0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
9ed0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9ee0: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
9ef0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9f00: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
9f10: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
9f20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b   ){.          ok
9f30: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
9f40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9f50: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66           int aff
9f60: 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a  Left, affRight;.
9f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
9f80: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
9f90: 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f  ide is also a co
9fa0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61  lumn, then the a
9fb0: 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20  ffinities.      
9fc0: 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72      ** of both r
9fd0: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
9fe0: 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68  des must be such
9ff0: 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20   that no type.  
a000: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65          ** conve
a010: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
a020: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
a030: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
a040: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
a050: 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68           affRigh
a060: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
a070: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
a080: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
a090: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65  .          affLe
a0a0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
a0b0: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
a0c0: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
a0d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
a0e0: 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66  ffRight!=0 && af
a0f0: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
a100: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
a110: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
a120: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
a130: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
a140: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
a150: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
a160: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a170: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a180: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
a190: 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e  s point, okToChn
a1a0: 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66  gToIN is true if
a1b0: 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20   original pTerm 
a1c0: 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a  satisfies.    **
a1d0: 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61   case 1.  In tha
a1e0: 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63  t case, construc
a1f0: 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  t a new virtual 
a200: 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20  term that is .  
a210: 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65    ** pTerm conve
a220: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20  rted into an IN 
a230: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a  operator..    **
a240: 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30 30  .    ** EV: R-00
a250: 32 31 31 2d 31 35 31 30 30 0a 20 20 20 20 2a 2f  211-15100.    */
a260: 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e  .    if( okToChn
a270: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  gToIN ){.      E
a280: 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20  xpr *pDup;      
a290: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73        /* A trans
a2a0: 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65  ient duplicate e
a2b0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
a2c0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
a2d0: 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  st = 0;   /* The
a2e0: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
a2f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
a300: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
a310: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;       /* The L
a320: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
a330: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
a340: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
a350: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
a360: 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f  plete IN operato
a370: 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  r */..      for(
a380: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
a390: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
a3a0: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  >a; i>=0; i--, p
a3b0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
a3c0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
a3d0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
a3e0: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
a3f0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
a400: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
a410: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
a420: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a430: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
a440: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
a450: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a460: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
a470: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
a480: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
a490: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
a4a0: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
a4b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
a4c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
a4d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
a4e0: 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50  stAppend(pWC->pP
a4f0: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
a500: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
a510: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
a520: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
a530: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
a540: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
a550: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
a560: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
a570: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
a580: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
a590: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
a5a0: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
a5b0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
a5c0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
a5d0: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
a5e0: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
a5f0: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
a600: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
a610: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a620: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
a630: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
a640: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
a650: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
a660: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
a670: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
a680: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
a690: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
a6a0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
a6b0: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
a6c0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
a6d0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
a6e0: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
a6f0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
a700: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
a710: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
a720: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
a730: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
a740: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
a750: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a760: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
a770: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
a780: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
a790: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
a7a0: 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20  tor = WO_NOOP;  
a7b0: 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73  /* case 1 trumps
a7c0: 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d   case 2 */.    }
a7d0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
a7e0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52   !SQLITE_OMIT_OR
a7f0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26  _OPTIMIZATION &&
a800: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55   !SQLITE_OMIT_SU
a810: 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  BQUERY */.../*.*
a820: 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74  * The input to t
a830: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
a840: 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75  n WhereTerm stru
a850: 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20  cture with only 
a860: 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66  the.** "pExpr" f
a870: 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20  ield filled in. 
a880: 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
a890: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61   routine is to a
a8a0: 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75  nalyze the.** su
a8b0: 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20  bexpression and 
a8c0: 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65  populate all the
a8d0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
a8e0: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a   the WhereTerm.*
a8f0: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  * structure..**.
a900: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
a910: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
a920: 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e  orm "<expr> <op>
a930: 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d   X" it gets comm
a940: 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73  uted.** to the s
a950: 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20  tandard form of 
a960: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e  "X <op> <expr>".
a970: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
a980: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
a990: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
a9a0: 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20  Y" where both X 
a9b0: 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c  and Y are.** col
a9c0: 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f  umns, then the o
a9d0: 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69  riginal expressi
a9e0: 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  on is unchanged 
a9f0: 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61  and a new virtua
aa00: 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65  l.** term of the
aa10: 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22   form "Y <op> X"
aa20: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
aa30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e   WHERE clause an
aa40: 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65  d.** analyzed se
aa50: 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f  parately.  The o
aa60: 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20  riginal term is 
aa70: 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d  marked with TERM
aa80: 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74  _COPIED.** and t
aa90: 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d  he new term is m
aaa0: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
aab0: 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65  DYNAMIC (because
aac0: 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e   it's pExpr.** n
aad0: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
aae0: 20 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43   with the WhereC
aaf0: 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f  lause) and TERM_
ab00: 56 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65  VIRTUAL (because
ab10: 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d   it.** is a comm
ab20: 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70  uted copy of a p
ab30: 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65  rior term.)  The
ab40: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68   original term h
ab50: 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61  as nChild=1.** a
ab60: 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20  nd the copy has 
ab70: 69 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f  idxParent set to
ab80: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
ab90: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e  e original term.
aba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
abb0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53  exprAnalyze(.  S
abc0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
abd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
abe0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
abf0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
ac00: 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  C,         /* th
ac10: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
ac20: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac40: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65   Index of the te
ac50: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
ac60: 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  d */.){.  WhereT
ac70: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
ac80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ac90: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
aca0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lyzed */.  Where
acb0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
acc0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
acd0: 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65  et of table inde
ace0: 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70  x masks */.  Exp
acf0: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ad10: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
ad20: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
ad30: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
ad40: 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  eqLeft;         
ad50: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
ad60: 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78  sites of the pEx
ad70: 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42  pr->pLeft */.  B
ad80: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
ad90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ada0: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
adb0: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42   of pExpr */.  B
adc0: 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68  itmask extraRigh
add0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
ade0: 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65  /* Extra depende
adf0: 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f  ncies on LEFT JO
ae00: 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53  IN */.  Expr *pS
ae10: 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tr1 = 0;        
ae20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
ae30: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
ae40: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
ae50: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
ae70: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
ae80: 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61  ends with wildca
ae90: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61  rd */.  int noCa
aea0: 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
aeb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45           /* LIKE
aec0: 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73  /GLOB distinguis
aed0: 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e  hes case */.  in
aee0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af00: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
af10: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
af20: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
af30: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
af40: 65 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e;     /* Parsin
af50: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
af60: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
af70: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
af80: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
af90: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
afa0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
afb0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
afc0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
afd0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
afe0: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  .  pMaskSet = pW
aff0: 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70  C->pMaskSet;.  p
b000: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
b010: 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65 66  xpr;.  prereqLef
b020: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
b030: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
b040: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70  pr->pLeft);.  op
b050: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
b060: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
b070: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
b080: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
b090: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
b0a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
b0b0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
b0c0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  .      pTerm->pr
b0d0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
b0e0: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
b0f0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
b100: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
b110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b120: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
b130: 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c  t = exprListTabl
b140: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
b150: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
b160: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
b170: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
b180: 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  L ){.    pTerm->
b190: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
b1a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
b1b0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
b1c0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
b1d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
b1e0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  r->pRight);.  }.
b1f0: 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78    prereqAll = ex
b200: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
b210: 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20  skSet, pExpr);. 
b220: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
b230: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
b240: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
b250: 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d  Bitmask x = getM
b260: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  ask(pMaskSet, pE
b270: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
b280: 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65  able);.    prere
b290: 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65  qAll |= x;.    e
b2a0: 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b  xtraRight = x-1;
b2b0: 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74    /* ON clause t
b2c0: 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  erms may not be 
b2d0: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
b2e0: 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ex.             
b2f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20            ** on 
b300: 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20  left table of a 
b310: 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b  LEFT JOIN.  Tick
b320: 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a  et #3015 */.  }.
b330: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41    pTerm->prereqA
b340: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
b350: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
b360: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  sor = -1;.  pTer
b370: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
b380: 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  .  pTerm->eOpera
b390: 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  tor = 0;.  if( a
b3a0: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26 26 20  llowedOp(op) && 
b3b0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
b3c0: 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74  ght & prereqLeft
b3d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  )==0 ){.    Expr
b3e0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
b3f0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72  >pLeft;.    Expr
b400: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
b410: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66  ->pRight;.    if
b420: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
b430: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
b440: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
b450: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
b460: 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e;.      pTerm->
b470: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
b480: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
b490: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
b4a0: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
b4b0: 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d 0a  Mask(op);.    }.
b4c0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26      if( pRight &
b4d0: 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  & pRight->op==TK
b4e0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
b4f0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
b500: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  ;.      Expr *pD
b510: 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  up;.      if( pT
b520: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e  erm->leftCursor>
b530: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
b540: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
b550: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
b560: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
b570: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
b580: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
b590: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
b5a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
b5b0: 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20  te(db, pDup);.  
b5c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
b5d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b5e0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
b5f0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
b600: 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52  , pDup, TERM_VIR
b610: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
b620: 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  C);.        if( 
b630: 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  idxNew==0 ) retu
b640: 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  rn;.        pNew
b650: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
b660: 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w];.        pNew
b670: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
b680: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  erm;.        pTe
b690: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
b6a0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
b6b0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
b6c0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
b6d0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
b6e0: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 7d  _COPIED;.      }
b6f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
b700: 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  up = pExpr;.    
b710: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d      pNew = pTerm
b720: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b730: 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72  exprCommute(pPar
b740: 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  se, pDup);.     
b750: 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70   pLeft = pDup->p
b760: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
b770: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
b780: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
b790: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74      pNew->u.left
b7a0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
b7b0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74  iColumn;.      t
b7c0: 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71  estcase( (prereq
b7d0: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
b7e0: 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74  t) != prereqLeft
b7f0: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
b800: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
b810: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
b820: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65  Right;.      pNe
b830: 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  w->prereqAll = p
b840: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20  rereqAll;.      
b850: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
b860: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70  = operatorMask(p
b870: 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a  Dup->op);.    }.
b880: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
b890: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
b8a0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
b8b0: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
b8c0: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
b8d0: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
b8e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
b8f0: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
b900: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
b910: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
b920: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
b930: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
b940: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
b950: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
b960: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
b970: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
b980: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
b990: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
b9a0: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
b9b0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
b9c0: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
b9d0: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
b9e0: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
b9f0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
ba00: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
ba10: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
ba20: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
ba30: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
ba40: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
ba50: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
ba60: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
ba70: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
ba80: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
ba90: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
baa0: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
bab0: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
bac0: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
bad0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
bae0: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
baf0: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
bb00: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
bb10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
bb20: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
bb30: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
bb40: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
bb50: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
bb60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
bb70: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
bb80: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
bb90: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
bba0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
bbb0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
bbc0: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
bbd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
bbe0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
bbf0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
bc00: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
bc10: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
bc20: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bc30: 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20  , ops[i], .     
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bc60: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
bc70: 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  ->pLeft, 0),.   
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bca0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69  3ExprDup(db, pLi
bcb0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
bcc0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
bcd0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
bce0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
bcf0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
bd00: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
bd10: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
bd20: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
bd30: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
bd40: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
bd50: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
bd60: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
bd70: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
bd80: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
bd90: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
bda0: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
bdb0: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
bdc0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bdd0: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
bde0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
bdf0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
be00: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
be10: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
be20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
be30: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
be40: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
be50: 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20  hat is composed 
be60: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
be70: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
be80: 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20  d by.  ** an OR 
be90: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
bea0: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
beb0: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
bec0: 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f    assert( pWC->o
bed0: 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
bee0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
bef0: 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  rm(pSrc, pWC, id
bf00: 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  xTerm);.    pTer
bf10: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
bf20: 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  erm];.  }.#endif
bf30: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
bf40: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
bf50: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
bf60: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
bf70: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
bf80: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
bf90: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
bfa0: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
bfb0: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
bfc0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
bfd0: 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74    ** A like patt
bfe0: 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ern of the form 
bff0: 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20  "x LIKE 'abc%'" 
c000: 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20  is changed into 
c010: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
c020: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78  .  **          x
c030: 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61  >='abc' AND x<'a
c040: 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27  bd' AND x LIKE '
c050: 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20  abc%'.  **.  ** 
c060: 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  The last charact
c070: 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  er of the prefix
c080: 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d   "abc" is increm
c090: 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68  ented to form th
c0a0: 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69  e.  ** terminati
c0b0: 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62  on condition "ab
c0c0: 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d"..  */.  if( p
c0d0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a  WC->op==TK_AND .
c0e0: 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c     && isLikeOrGl
c0f0: 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ob(pParse, pExpr
c100: 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d  , &pStr1, &isCom
c110: 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a  plete, &noCase).
c120: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
c130: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Left;       /* L
c140: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
c150: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
c160: 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20  Expr *pStr2;    
c170: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53     /* Copy of pS
c180: 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b  tr1 - RHS of LIK
c190: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
c1a0: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  */.    Expr *pNe
c1b0: 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72  wExpr1;.    Expr
c1c0: 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
c1d0: 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20   int idxNew1;.  
c1e0: 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20    int idxNew2;. 
c1f0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
c200: 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  l;    /* Collati
c210: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75  ng sequence to u
c220: 73 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74  se */..    pLeft
c230: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
c240: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
c250: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
c260: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
c270: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tr1, 0);.    if(
c280: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
c290: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
c2a0: 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20  , *pC;       /* 
c2b0: 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  Last character b
c2c0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
c2d0: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20  wildcard */.    
c2e0: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
c2f0: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c  r2->u.zToken[sql
c300: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74  ite3Strlen30(pSt
c310: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d  r2->u.zToken)-1]
c320: 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b  ;.      c = *pC;
c330: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
c340: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
c350: 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  The point is to 
c360: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61  increment the la
c370: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
c380: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20  ore the first.  
c390: 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72        ** wildcar
c3a0: 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e  d.  But if we in
c3b0: 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61  crement '@', tha
c3c0: 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69  t will push it i
c3d0: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
c3e0: 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61  ** alphabetic ra
c3f0: 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63  nge where case c
c400: 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20  onversions will 
c410: 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20  mess up the .   
c420: 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69       ** inequali
c430: 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68  ty.  To avoid th
c440: 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f  is, make sure to
c450: 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75   also run the fu
c460: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49  ll.        ** LI
c470: 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64  KE on all candid
c480: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
c490: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
c4a0: 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a  isComplete flag.
c4b0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c4c0: 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20     if( c=='A'-1 
c4d0: 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  ) isComplete = 0
c4e0: 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33  ;   /* EV: R-643
c4f0: 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20  39-08207 */...  
c500: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
c510: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d  3UpperToLower[c]
c520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c530: 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20  *pC = c + 1;.   
c540: 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73   }.    pColl = s
c550: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
c560: 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
c570: 38 2c 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43  8, noCase ? "NOC
c580: 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 2c  ASE" : "BINARY",
c590: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
c5a0: 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  1 = sqlite3PExpr
c5b0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20  (pParse, TK_GE, 
c5c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c5d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c5e0: 72 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33  rSetColl(sqlite3
c5f0: 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74  ExprDup(db,pLeft
c600: 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20  ,0), pColl),.   
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20    pStr1, 0);.   
c630: 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65   idxNew1 = where
c640: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
c650: 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52  , pNewExpr1, TER
c660: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
c670: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
c680: 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d  tcase( idxNew1==
c690: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
c6a0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
c6b0: 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
c6c0: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
c6d0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
c6e0: 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_LT,.          
c6f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
c700: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 73 71  e3ExprSetColl(sq
c710: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c720: 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29  pLeft,0), pColl)
c730: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c740: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
c750: 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20  ;.    idxNew2 = 
c760: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
c770: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32  t(pWC, pNewExpr2
c780: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
c790: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
c7a0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
c7b0: 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew2==0 );.    ex
c7c0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
c7d0: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
c7e0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
c7f0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
c800: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
c810: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
c820: 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
c830: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
c840: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
c850: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
c860: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
c870: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
c880: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
c890: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
c8a0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
c8b0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
c8c0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
c8d0: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
c8e0: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
c8f0: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
c900: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
c910: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
c920: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
c930: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
c940: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
c950: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
c960: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
c970: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
c980: 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
c990: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
c9a0: 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
c9b0: 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
c9c0: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
c9d0: 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
c9e0: 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
c9f0: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
ca00: 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
ca10: 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
ca20: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
ca30: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
ca40: 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
ca50: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
ca60: 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
ca70: 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
ca80: 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
ca90: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
caa0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
cab0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
cac0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
cad0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72  .pExpr;.    prer
cae0: 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62  eqExpr = exprTab
caf0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
cb00: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  , pRight);.    p
cb10: 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78  rereqColumn = ex
cb20: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
cb30: 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20  skSet, pLeft);. 
cb40: 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78     if( (prereqEx
cb50: 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d  pr & prereqColum
cb60: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  n)==0 ){.      E
cb70: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
cb80: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
cb90: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
cba0: 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a  rse, TK_MATCH, .
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
cbd0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
cbe0: 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20  db, pRight, 0), 
cbf0: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
cc00: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
cc10: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
cc20: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
cc30: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
cc40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cc50: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
cc60: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
cc70: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
cc80: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
cc90: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
cca0: 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
ccb0: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
ccc0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
ccd0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
cce0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
ccf0: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
cd00: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
cd10: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
cd20: 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
cd30: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
cd40: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
cd50: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
cd60: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
cd70: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
cd80: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
cd90: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
cda0: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
cdb0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
cdc0: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
cdd0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
cde0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
cdf0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
ce00: 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
ce10: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
ce20: 54 41 54 33 0a 20 20 2f 2a 20 57 68 65 6e 20 73  TAT3.  /* When s
ce30: 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74  qlite_stat3 hist
ce40: 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
ce50: 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61  ailable an opera
ce60: 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  tor of the.  ** 
ce70: 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e  form "x IS NOT N
ce80: 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d  ULL" can sometim
ce90: 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  es be evaluated 
cea0: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
ceb0: 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c  .  ** as "x>NULL
cec0: 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e  " if x is not an
ced0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
cee0: 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72   KEY.  So constr
cef0: 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75  uct a.  ** virtu
cf00: 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20  al term of that 
cf10: 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form..  **.  ** 
cf20: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69  Note that the vi
cf30: 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20  rtual term must 
cf40: 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54  be tagged with T
cf50: 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73  ERM_VNULL.  This
cf60: 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c  .  ** TERM_VNULL
cf70: 20 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72 65   tag will suppre
cf80: 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20  ss the not-null 
cf90: 63 68 65 63 6b 20 61 74 20 74 68 65 20 62 65 67  check at the beg
cfa0: 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74  inning.  ** of t
cfb0: 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75  he loop.  Withou
cfc0: 74 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  t the TERM_VNULL
cfd0: 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e   flag, the not-n
cfe0: 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20 2a  ull check at.  *
cff0: 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
d000: 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65  he loop will pre
d010: 76 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74 73  vent any results
d020: 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74 75   from being retu
d030: 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rned..  */.  if(
d040: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
d050: 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78  OTNULL.   && pEx
d060: 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
d070: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70  K_COLUMN.   && p
d080: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  Expr->pLeft->iCo
d090: 6c 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a 20 20 20  lumn>=0.  ){.   
d0a0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
d0b0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
d0c0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
d0d0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
d0e0: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
d0f0: 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
d100: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
d110: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
d120: 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
d150: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d180: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
d190: 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
d1a0: 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
d1b0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
d1c0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
d1d0: 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
d200: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
d210: 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
d220: 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
d230: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
d240: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
d250: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
d260: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
d270: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
d280: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
d290: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
d2a0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
d2b0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
d2c0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
d2d0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
d2e0: 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
d2f0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
d300: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
d310: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
d320: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
d330: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
d340: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
d350: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
d360: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
d370: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
d380: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
d390: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
d3a0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
d3b0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
d3c0: 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72  STAT */..  /* Pr
d3d0: 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20  event ON clause 
d3e0: 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20  terms of a LEFT 
d3f0: 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20  JOIN from being 
d400: 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20  used to drive.  
d410: 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ** an index for 
d420: 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
d430: 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  ft of the join..
d440: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72    */.  pTerm->pr
d450: 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
d460: 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  raRight;.}../*.*
d470: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
d480: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
d490: 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64 20 61   is UNIQUE and a
d4a0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 70 61 73 74 20  ll columns past 
d4b0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 53 6b  the.** first nSk
d4c0: 69 70 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 4e  ip columns are N
d4d0: 4f 54 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  OT NULL..*/.stat
d4e0: 69 63 20 69 6e 74 20 69 6e 64 65 78 49 73 55 6e  ic int indexIsUn
d4f0: 69 71 75 65 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65  iqueNotNull(Inde
d500: 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 6e 53 6b  x *pIdx, int nSk
d510: 69 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ip){.  Table *pT
d520: 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
d530: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  e;.  int i;.  if
d540: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
d550: 3d 4f 45 5f 4e 6f 6e 65 20 29 20 72 65 74 75 72  =OE_None ) retur
d560: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 6e 53 6b  n 0;.  for(i=nSk
d570: 69 70 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  ip; i<pIdx->nCol
d580: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
d590: 6e 74 20 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt j = pIdx->aiC
d5a0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73  olumn[i];.    as
d5b0: 73 65 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c  sert( j>=0 && j<
d5c0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
d5d0: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
d5e0: 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  [j].notNull==0 )
d5f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d600: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
d610: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d620: 6e 20 73 65 61 72 63 68 65 73 20 74 68 65 20 65  n searches the e
d630: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
d640: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
d650: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
d660: 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f  for an expressio
d670: 6e 20 6f 66 20 74 79 70 65 20 54 4b 5f 43 4f 4c  n of type TK_COL
d680: 55 4d 4e 20 74 68 61 74 20 72 65 66 65 72 73 20  UMN that refers 
d690: 74 6f 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  to the same colu
d6a0: 6d 6e 20 61 6e 64 0a 2a 2a 20 75 73 65 73 20 74  mn and.** uses t
d6b0: 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6f  he same collatio
d6c0: 6e 20 73 65 71 75 65 6e 63 65 20 61 73 20 74 68  n sequence as th
d6d0: 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e  e iCol'th column
d6e0: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a   of index pIdx..
d6f0: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69 42 61 73  ** Argument iBas
d700: 65 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  e is the cursor 
d710: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
d720: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 70  the table that p
d730: 49 64 78 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f  Idx refers.** to
d740: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
d750: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
d760: 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65   found, its inde
d770: 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20  x in pList->a[] 
d780: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  is returned. If.
d790: 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e  ** no expression
d7a0: 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73   is found, -1 is
d7b0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
d7c0: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64  atic int findInd
d7d0: 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a  exCol(.  Parse *
d7e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
d800: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e context */.  E
d810: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d830: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * Expression lis
d840: 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  t to search */. 
d850: 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20   int iBase,     
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
d880: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
d890: 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49  with pIdx */.  I
d8a0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d8c0: 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  * Index to match
d8d0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20   column of */.  
d8e0: 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  /* Column of ind
d910: 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29  ex to match */.)
d920: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
d930: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
d940: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43   pIdx->azColl[iC
d950: 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ol];..  for(i=0;
d960: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
d970: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
d980: 2a 70 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  *p = pList->a[i]
d990: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
d9a0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
d9b0: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c  .     && p->iCol
d9c0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
d9d0: 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26  umn[iCol].     &
d9e0: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
d9f0: 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  se.    ){.      
da00: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
da10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
da20: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
da30: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
da40: 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71  (pColl) && 0==sq
da50: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
da60: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c  ll->zName, zColl
da70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
da80: 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20  urn i;.      }. 
da90: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
daa0: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
dab0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 74  This routine det
dac0: 65 72 6d 69 6e 65 73 20 69 66 20 70 49 64 78 20  ermines if pIdx 
dad0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
dae0: 73 73 69 73 74 20 69 6e 20 70 72 6f 63 65 73 73  ssist in process
daf0: 69 6e 67 20 61 0a 2a 2a 20 44 49 53 54 49 4e 43  ing a.** DISTINC
db00: 54 20 71 75 61 6c 69 66 69 65 72 2e 20 49 6e 20  T qualifier. In 
db10: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20  other words, it 
db20: 74 65 73 74 73 20 77 68 65 74 68 65 72 20 6f 72  tests whether or
db30: 20 6e 6f 74 20 75 73 69 6e 67 20 74 68 69 73 0a   not using this.
db40: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
db50: 20 6f 75 74 65 72 20 6c 6f 6f 70 20 67 75 61 72   outer loop guar
db60: 61 6e 74 65 65 73 20 74 68 61 74 20 72 6f 77 73  antees that rows
db70: 20 77 69 74 68 20 65 71 75 61 6c 20 76 61 6c 75   with equal valu
db80: 65 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78  es for.** all ex
db90: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
dba0: 20 70 44 69 73 74 69 6e 63 74 20 6c 69 73 74 20   pDistinct list 
dbb0: 61 72 65 20 64 65 6c 69 76 65 72 65 64 20 67 72  are delivered gr
dbc0: 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 0a  ouped together..
dbd0: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
dbe0: 65 2c 20 74 68 65 20 71 75 65 72 79 20 0a 2a 2a  e, the query .**
dbf0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 44 49 53  .**   SELECT DIS
dc00: 54 49 4e 43 54 20 61 2c 20 62 2c 20 63 20 46 52  TINCT a, b, c FR
dc10: 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d  OM tbl WHERE a =
dc20: 20 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e   ?.**.** can ben
dc30: 65 66 69 74 20 66 72 6f 6d 20 61 6e 79 20 69 6e  efit from any in
dc40: 64 65 78 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22  dex on columns "
dc50: 62 22 20 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73  b" and "c"..*/.s
dc60: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
dc70: 69 6e 63 74 49 6e 64 65 78 28 0a 20 20 50 61 72  inctIndex(.  Par
dc80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dca0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
dcb0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
dcc0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
dcd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
dce0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e  E clause */.  In
dcf0: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd10: 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
dd20: 20 63 6f 6e 73 69 64 65 72 65 64 20 2a 2f 0a 20   considered */. 
dd30: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
dd60: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
dd70: 70 49 64 78 20 69 73 20 6f 6e 20 2a 2f 0a 20 20  pIdx is on */.  
dd80: 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69  ExprList *pDisti
dd90: 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  nct,            
dda0: 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
ddb0: 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20  expressions */. 
ddc0: 20 69 6e 74 20 6e 45 71 43 6f 6c 20 20 20 20 20   int nEqCol     
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dde0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
ddf0: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68  dex columns with
de00: 20 3d 3d 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d   == */.){.  Bitm
de10: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 20 20 20  ask mask = 0;   
de20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
de30: 61 73 6b 20 6f 66 20 75 6e 61 63 63 6f 75 6e 74  ask of unaccount
de40: 65 64 20 66 6f 72 20 70 44 69 73 74 69 6e 63 74  ed for pDistinct
de50: 20 65 78 70 72 73 20 2a 2f 0a 20 20 69 6e 74 20   exprs */.  int 
de60: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
de70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
de80: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
de90: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
dea0: 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20  Distinct!=0 );. 
deb0: 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65   if( pIdx->zName
dec0: 3d 3d 30 20 7c 7c 20 70 44 69 73 74 69 6e 63 74  ==0 || pDistinct
ded0: 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 72  ->nExpr>=BMS ) r
dee0: 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63  eturn 0;.  testc
def0: 61 73 65 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  ase( pDistinct->
df00: 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a  nExpr==BMS-1 );.
df10: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
df20: 67 68 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65  gh all the expre
df30: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 64 69  ssions in the di
df40: 73 74 69 6e 63 74 20 6c 69 73 74 2e 20 49 66 20  stinct list. If 
df50: 61 6e 79 20 6f 66 20 74 68 65 6d 0a 20 20 2a 2a  any of them.  **
df60: 20 61 72 65 20 6e 6f 74 20 73 69 6d 70 6c 65 20   are not simple 
df70: 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
df80: 73 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e  s, return early.
df90: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 65 73 74   Otherwise, test
dfa0: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
dfb0: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
dfc0: 6e 73 20 61 20 22 63 6f 6c 3d 58 22 20 63 6c 61  ns a "col=X" cla
dfd0: 75 73 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  use. If it does,
dfe0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
dff0: 20 20 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f    ** can be igno
e000: 72 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73 20  red. If it does 
e010: 6e 6f 74 2c 20 61 6e 64 20 74 68 65 20 63 6f 6c  not, and the col
e020: 75 6d 6e 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c  umn does not bel
e030: 6f 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ong to the.  ** 
e040: 73 61 6d 65 20 74 61 62 6c 65 20 61 73 20 69 6e  same table as in
e050: 64 65 78 20 70 49 64 78 2c 20 72 65 74 75 72 6e  dex pIdx, return
e060: 20 65 61 72 6c 79 2e 20 46 69 6e 61 6c 6c 79 2c   early. Finally,
e070: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a   if there is no.
e080: 20 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20 22 63    ** matching "c
e090: 6f 6c 3d 58 22 20 65 78 70 72 65 73 73 69 6f 6e  ol=X" expression
e0a0: 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20   and the column 
e0b0: 69 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  is on the same t
e0c0: 61 62 6c 65 20 61 73 20 70 49 64 78 2c 0a 20 20  able as pIdx,.  
e0d0: 2a 2a 20 73 65 74 20 74 68 65 20 63 6f 72 72 65  ** set the corre
e0e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
e0f0: 76 61 72 69 61 62 6c 65 20 6d 61 73 6b 2e 0a 20  variable mask.. 
e100: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
e110: 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70  <pDistinct->nExp
e120: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65  r; i++){.    Whe
e130: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
e140: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 44 69     Expr *p = pDi
e150: 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78  stinct->a[i].pEx
e160: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  pr;.    if( p->o
e170: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
e180: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 54 65  eturn 0;.    pTe
e190: 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
e1a0: 43 2c 20 70 2d 3e 69 54 61 62 6c 65 2c 20 70 2d  C, p->iTable, p-
e1b0: 3e 69 43 6f 6c 75 6d 6e 2c 20 7e 28 42 69 74 6d  >iColumn, ~(Bitm
e1c0: 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 30 29  ask)0, WO_EQ, 0)
e1d0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 20  ;.    if( pTerm 
e1e0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
e1f0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
e200: 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
e210: 2a 70 31 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  *p1 = sqlite3Bin
e220: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
e230: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
e240: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
e250: 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
e260: 2a 70 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  *p2 = sqlite3Exp
e270: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
e280: 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   p);.      if( p
e290: 31 3d 3d 70 32 20 29 20 63 6f 6e 74 69 6e 75 65  1==p2 ) continue
e2a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e2b0: 70 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20  p->iTable!=base 
e2c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
e2d0: 6d 61 73 6b 20 7c 3d 20 28 28 28 42 69 74 6d 61  mask |= (((Bitma
e2e0: 73 6b 29 31 29 20 3c 3c 20 69 29 3b 0a 20 20 7d  sk)1) << i);.  }
e2f0: 0a 0a 20 20 66 6f 72 28 69 3d 6e 45 71 43 6f 6c  ..  for(i=nEqCol
e300: 3b 20 6d 61 73 6b 20 26 26 20 69 3c 70 49 64 78  ; mask && i<pIdx
e310: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
e320: 0a 20 20 20 20 69 6e 74 20 69 45 78 70 72 20 3d  .    int iExpr =
e330: 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50   findIndexCol(pP
e340: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
e350: 20 62 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b   base, pIdx, i);
e360: 0a 20 20 20 20 69 66 28 20 69 45 78 70 72 3c 30  .    if( iExpr<0
e370: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6d 61   ) break;.    ma
e380: 73 6b 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73  sk &= ~(((Bitmas
e390: 6b 29 31 29 20 3c 3c 20 69 45 78 70 72 29 3b 0a  k)1) << iExpr);.
e3a0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 6d    }..  return (m
e3b0: 61 73 6b 3d 3d 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ask==0);.}.../*.
e3c0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
e3d0: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65  f the DISTINCT e
e3e0: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70  xpression-list p
e3f0: 61 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69  assed as the thi
e400: 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  rd argument.** i
e410: 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 41 20 44  s redundant. A D
e420: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20  ISTINCT list is 
e430: 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68 65  redundant if the
e440: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
e450: 6e 73 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 69  ns a.** UNIQUE i
e460: 6e 64 65 78 20 74 68 61 74 20 67 75 61 72 61 6e  ndex that guaran
e470: 74 65 65 73 20 74 68 61 74 20 74 68 65 20 72 65  tees that the re
e480: 73 75 6c 74 20 6f 66 20 74 68 65 20 71 75 65 72  sult of the quer
e490: 79 20 77 69 6c 6c 20 62 65 20 64 69 73 74 69 6e  y will be distin
e4a0: 63 74 0a 2a 2a 20 61 6e 79 77 61 79 2e 0a 2a 2f  ct.** anyway..*/
e4b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69  .static int isDi
e4c0: 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
e4d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e4e0: 2c 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ,.  SrcList *pTa
e4f0: 62 4c 69 73 74 2c 0a 20 20 57 68 65 72 65 43 6c  bList,.  WhereCl
e500: 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 45 78 70  ause *pWC,.  Exp
e510: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
e520: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
e530: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
e540: 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65      .  int iBase
e570: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
e580: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
e590: 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73  e table or sub-s
e5a0: 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  elect in the FRO
e5b0: 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a  M clause of.  **
e5c0: 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
e5d0: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n it will not be
e5e0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f   possible to sho
e5f0: 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  w that the DISTI
e600: 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65  NCT .  ** clause
e610: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
e620: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
e630: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
e640: 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20  rn 0;.  iBase = 
e650: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
e660: 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d  Cursor;.  pTab =
e670: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
e680: 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pTab;..  /* If a
e690: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
e6a0: 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20  sions is an IPK 
e6b0: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20  column on table 
e6c0: 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75  iBase, then retu
e6d0: 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e  rn .  ** true. N
e6e0: 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61  ote: The (p->iTa
e6f0: 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74  ble==iBase) part
e700: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61   of this test ma
e710: 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68  y be false if th
e720: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53  e.  ** current S
e730: 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65  ELECT is a corre
e740: 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e  lated sub-query.
e750: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
e760: 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
e770: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
e780: 78 70 72 20 2a 70 20 3d 20 70 44 69 73 74 69 6e  xpr *p = pDistin
e790: 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  ct->a[i].pExpr;.
e7a0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
e7b0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69  K_COLUMN && p->i
e7c0: 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20  Table==iBase && 
e7d0: 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  p->iColumn<0 ) r
e7e0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
e7f0: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
e800: 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74  all indices on t
e810: 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69  he table, checki
e820: 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69  ng each to see i
e830: 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20  f it makes.  ** 
e840: 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
e850: 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74  lifier redundant
e860: 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a  . It does so if:
e870: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20  .  **.  **   1. 
e880: 54 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73  The index is its
e890: 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a  elf UNIQUE, and.
e8a0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41    **.  **   2. A
e8b0: 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ll of the column
e8c0: 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61  s in the index a
e8d0: 72 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f  re either part o
e8e0: 66 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a  f the pDistinct.
e8f0: 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20    **      list, 
e900: 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52  or else the WHER
e910: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
e920: 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
e930: 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20  form "col=X",.  
e940: 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20  **      where X 
e950: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61  is a constant va
e960: 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69  lue. The collati
e970: 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20  on sequences of 
e980: 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  the.  **      co
e990: 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c  mparison and sel
e9a0: 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73  ect-list express
e9b0: 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20  ions must match 
e9c0: 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64  those of the ind
e9d0: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ex..  **.  **   
e9e0: 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20  3. All of those 
e9f0: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f  index columns fo
ea00: 72 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52  r which the WHER
ea10: 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  E clause does no
ea20: 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74  t.  **      cont
ea30: 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65  ain a "col=X" te
ea40: 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74  rm are subject t
ea50: 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e  o a NOT NULL con
ea60: 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
ea70: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
ea80: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
ea90: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
eaa0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
eab0: 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
eac0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
ead0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
eae0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
eaf0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
eb00: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
eb10: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ];.      if( 0==
eb20: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42  findTerm(pWC, iB
eb30: 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74  ase, iCol, ~(Bit
eb40: 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70  mask)0, WO_EQ, p
eb50: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
eb60: 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69  int iIdxCol = fi
eb70: 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73  ndIndexCol(pPars
eb80: 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42  e, pDistinct, iB
eb90: 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20  ase, pIdx, i);. 
eba0: 20 20 20 20 20 20 20 69 66 28 20 69 49 64 78 43         if( iIdxC
ebb0: 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43  ol<0 || pTab->aC
ebc0: 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
ebd0: 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  n[i]].notNull==0
ebe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
ebf0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
ec00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ec10: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43   if( i==pIdx->nC
ec20: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 2f  olumn ){.      /
ec30: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
ec40: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
ec50: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
ec60: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
ec70: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
ec80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
ec90: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
eca0: 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64  * Prepare a crud
ecb0: 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
ecc0: 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  e logarithm of t
ecd0: 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a  he input value..
ece0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e  ** The results n
ecf0: 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74  eed not be exact
ed00: 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  .  This is only 
ed10: 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74  used for estimat
ed20: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c  ing.** the total
ed30: 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d   cost of perform
ed40: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  ing operations w
ed50: 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f  ith O(logN) or O
ed60: 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c  (NlogN).** compl
ed70: 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20  exity.  Because 
ed80: 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73  N is just a gues
ed90: 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61  s, it is no grea
eda0: 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20  t tragedy if.** 
edb0: 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65  logN is a little
edc0: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
edd0: 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f  double estLog(do
ede0: 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c  uble N){.  doubl
edf0: 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f  e logN = 1;.  do
ee00: 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77  uble x = 10;.  w
ee10: 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20  hile( N>x ){.   
ee20: 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20   logN += 1;.    
ee30: 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72  x *= 10;.  }.  r
ee40: 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f  eturn logN;.}../
ee50: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
ee60: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
ee70: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
ee80: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
ee90: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
eea0: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
eeb0: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
eec0: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
eed0: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
eee0: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
eef0: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
ef00: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
ef10: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
ef20: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
ef30: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
ef40: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
ef50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
ef60: 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
ef70: 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
ef80: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
ef90: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
efa0: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
efb0: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
efc0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
efd0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
efe0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
eff0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f000: 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
f010: 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
f020: 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
f030: 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
f040: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
f050: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
f060: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
f070: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
f080: 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
f090: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
f0a0: 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
f0b0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
f0c0: 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
f0d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f0e0: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
f0f0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
f100: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
f110: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
f120: 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
f130: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
f140: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
f150: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
f160: 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
f170: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
f180: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
f190: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
f1a0: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
f1b0: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
f1c0: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
f1d0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
f1e0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
f1f0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
f200: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f210: 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
f220: 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
f230: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
f240: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
f250: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
f260: 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
f270: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
f280: 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
f290: 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
f2a0: 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
f2b0: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
f2c0: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
f2d0: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
f2e0: 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
f2f0: 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
f300: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
f310: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
f320: 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
f330: 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
f340: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f350: 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
f360: 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
f370: 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73  tedCost);.}.#els
f380: 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  e.#define TRACE_
f390: 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64  IDX_INPUTS(A).#d
f3a0: 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
f3b0: 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69  OUTPUTS(A).#endi
f3c0: 66 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72  f../* .** Requir
f3d0: 65 64 20 62 65 63 61 75 73 65 20 62 65 73 74 49  ed because bestI
f3e0: 6e 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64  ndex() is called
f3f0: 20 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65   by bestOrClause
f400: 49 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74  Index() .*/.stat
f410: 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65  ic void bestInde
f420: 78 28 57 68 65 72 65 42 65 73 74 49 64 78 2a 29  x(WhereBestIdx*)
f430: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
f440: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
f450: 6f 20 66 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69  o find an scanni
f460: 6e 67 20 73 74 72 61 74 65 67 79 20 74 68 61 74  ng strategy that
f470: 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a   can be used .**
f480: 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20   to optimize an 
f490: 27 4f 52 27 20 65 78 70 72 65 73 73 69 6f 6e 20  'OR' expression 
f4a0: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
f4b0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  a WHERE clause. 
f4c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
f4d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
f4e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
f4f0: 6d 20 70 53 72 63 20 6d 61 79 20 62 65 20 65 69  m pSrc may be ei
f500: 74 68 65 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61  ther a.** regula
f510: 72 20 42 2d 54 72 65 65 20 74 61 62 6c 65 20 6f  r B-Tree table o
f520: 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  r a virtual tabl
f530: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
f540: 64 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e  d bestOrClauseIn
f550: 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78  dex(WhereBestIdx
f560: 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   *p){.#ifndef SQ
f570: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
f580: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 57 68 65 72  IMIZATION.  Wher
f590: 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70  eClause *pWC = p
f5a0: 2d 3e 70 57 43 3b 20 20 20 20 20 20 20 20 20 20  ->pWC;          
f5b0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
f5c0: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
f5d0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
f5e0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 2f  Src = p->pSrc; /
f5f0: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
f600: 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
f610: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
f620: 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75  iCur = pSrc->iCu
f630: 72 73 6f 72 3b 20 20 20 20 20 20 2f 2a 20 54 68  rsor;      /* Th
f640: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
f650: 74 61 62 6c 65 20 20 2a 2f 0a 20 20 63 6f 6e 73  table  */.  cons
f660: 74 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72  t Bitmask maskSr
f670: 63 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d  c = getMask(pWC-
f680: 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >pMaskSet, iCur)
f690: 3b 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f  ;  /* Bitmask fo
f6a0: 72 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72  r pSrc */.  Wher
f6b0: 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 57  eTerm * const pW
f6c0: 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70  CEnd = &pWC->a[p
f6d0: 57 43 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20 20 20  WC->nTerm];     
f6e0: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
f6f0: 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  ->a[] */.  Where
f700: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
f730: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
f740: 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  ause */..  /* Th
f750: 65 20 4f 52 2d 63 6c 61 75 73 65 20 6f 70 74 69  e OR-clause opti
f760: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61  mization is disa
f770: 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20 49 4e  llowed if the IN
f780: 44 45 58 45 44 20 42 59 20 6f 72 0a 20 20 2a 2a  DEXED BY or.  **
f790: 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
f7a0: 75 73 65 73 20 61 72 65 20 75 73 65 64 20 6f 72  uses are used or
f7b0: 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 41 4e   if the WHERE_AN
f7c0: 44 5f 4f 4e 4c 59 20 62 69 74 20 69 73 20 73 65  D_ONLY bit is se
f7d0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  t. */.  if( pSrc
f7e0: 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 7c 7c 20  ->notIndexed || 
f7f0: 70 53 72 63 2d 3e 70 49 6e 64 65 78 21 3d 30 20  pSrc->pIndex!=0 
f800: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
f810: 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 77 63   }.  if( pWC->wc
f820: 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
f830: 5f 41 4e 44 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20  _AND_ONLY ){.   
f840: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
f850: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 57 48  /* Search the WH
f860: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
f870: 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20 57 4f   for a usable WO
f880: 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 66  _OR term. */.  f
f890: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
f8a0: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
f8b0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
f8c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
f8d0: 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20 20 20 26  r==WO_OR .     &
f8e0: 26 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  & ((pTerm->prere
f8f0: 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63 29  qAll & ~maskSrc)
f900: 20 26 20 70 2d 3e 6e 6f 74 52 65 61 64 79 29 3d   & p->notReady)=
f910: 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
f920: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
f930: 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53 72  dexable & maskSr
f940: 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  c)!=0 .    ){.  
f950: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
f960: 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20  * const pOrWC = 
f970: 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
f980: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65  o->wc;.      Whe
f990: 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
f9a0: 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43  OrWCEnd = &pOrWC
f9b0: 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d  ->a[pOrWC->nTerm
f9c0: 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ];.      WhereTe
f9d0: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20  rm *pOrTerm;.   
f9e0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 57     int flags = W
f9f0: 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
fa00: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f 74       double rTot
fa10: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f  al = 0;.      do
fa20: 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20  uble nRow = 0;. 
fa30: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73 65       Bitmask use
fa40: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 57 68 65  d = 0;.      Whe
fa50: 72 65 42 65 73 74 49 64 78 20 73 42 4f 49 3b 0a  reBestIdx sBOI;.
fa60: 0a 20 20 20 20 20 20 73 42 4f 49 20 3d 20 2a 70  .      sBOI = *p
fa70: 3b 0a 20 20 20 20 20 20 73 42 4f 49 2e 70 4f 72  ;.      sBOI.pOr
fa80: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
fa90: 20 73 42 4f 49 2e 70 44 69 73 74 69 6e 63 74 20   sBOI.pDistinct 
faa0: 3d 20 30 3b 0a 20 20 20 20 20 20 73 42 4f 49 2e  = 0;.      sBOI.
fab0: 70 70 49 64 78 49 6e 66 6f 20 3d 20 30 3b 0a 20  ppIdxInfo = 0;. 
fac0: 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d       for(pOrTerm
fad0: 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65  =pOrWC->a; pOrTe
fae0: 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72  rm<pOrWCEnd; pOr
faf0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
fb00: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
fb10: 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52  . Multi-index OR
fb20: 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 65 72   testing for ter
fb30: 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c 6e  m %d of %d....\n
fb40: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  ", .          (p
fb50: 4f 72 54 65 72 6d 20 2d 20 70 4f 72 57 43 2d 3e  OrTerm - pOrWC->
fb60: 61 29 2c 20 28 70 54 65 72 6d 20 2d 20 70 57 43  a), (pTerm - pWC
fb70: 2d 3e 61 29 0a 20 20 20 20 20 20 20 20 29 29 3b  ->a).        ));
fb80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
fb90: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
fba0: 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20  =WO_AND ){.     
fbb0: 20 20 20 20 20 73 42 4f 49 2e 70 57 43 20 3d 20       sBOI.pWC = 
fbc0: 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
fbd0: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
fbe0: 20 20 20 20 62 65 73 74 49 6e 64 65 78 28 26 73      bestIndex(&s
fbf0: 42 4f 49 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  BOI);.        }e
fc00: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
fc10: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
fc20: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  r ){.          W
fc30: 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
fc40: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  C;.          tem
fc50: 70 57 43 2e 70 50 61 72 73 65 20 3d 20 70 57 43  pWC.pParse = pWC
fc60: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
fc70: 20 20 20 20 74 65 6d 70 57 43 2e 70 4d 61 73 6b      tempWC.pMask
fc80: 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b  Set = pWC->pMask
fc90: 53 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Set;.          t
fca0: 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70  empWC.pOuter = p
fcb0: 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  WC;.          te
fcc0: 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
fcd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
fce0: 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
fcf0: 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
fd00: 2e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b  .wctrlFlags = 0;
fd10: 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
fd20: 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  C.nTerm = 1;.   
fd30: 20 20 20 20 20 20 20 73 42 4f 49 2e 70 57 43 20         sBOI.pWC 
fd40: 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  = &tempWC;.     
fd50: 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28 26       bestIndex(&
fd60: 73 42 4f 49 29 3b 0a 20 20 20 20 20 20 20 20 7d  sBOI);.        }
fd70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
fd80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
fd90: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 54 6f 74    }.        rTot
fda0: 61 6c 20 2b 3d 20 73 42 4f 49 2e 63 6f 73 74 2e  al += sBOI.cost.
fdb0: 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6e  rCost;.        n
fdc0: 52 6f 77 20 2b 3d 20 73 42 4f 49 2e 63 6f 73 74  Row += sBOI.cost
fdd0: 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20  .plan.nRow;.    
fde0: 20 20 20 20 75 73 65 64 20 7c 3d 20 73 42 4f 49      used |= sBOI
fdf0: 2e 63 6f 73 74 2e 75 73 65 64 3b 0a 20 20 20 20  .cost.used;.    
fe00: 20 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3e 3d      if( rTotal>=
fe10: 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 20  p->cost.rCost ) 
fe20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
fe30: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
fe40: 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
fe50: 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73   clause, increas
fe60: 65 20 74 68 65 20 73 63 61 6e 20 63 6f 73 74 20  e the scan cost 
fe70: 74 6f 20 61 63 63 6f 75 6e 74 20 0a 20 20 20 20  to account .    
fe80: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 73    ** for the cos
fe90: 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2e 20 2a  t of the sort. *
fea0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  /.      if( p->p
feb0: 4f 72 64 65 72 42 79 21 3d 30 20 29 7b 0a 20 20  OrderBy!=0 ){.  
fec0: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
fed0: 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69  (("... sorting i
fee0: 6e 63 72 65 61 73 65 73 20 4f 52 20 63 6f 73 74  ncreases OR cost
fef0: 20 25 2e 39 67 20 74 6f 20 25 2e 39 67 5c 6e 22   %.9g to %.9g\n"
ff00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ff10: 20 20 20 20 20 20 72 54 6f 74 61 6c 2c 20 72 54        rTotal, rT
ff20: 6f 74 61 6c 2b 6e 52 6f 77 2a 65 73 74 4c 6f 67  otal+nRow*estLog
ff30: 28 6e 52 6f 77 29 29 29 3b 0a 20 20 20 20 20 20  (nRow)));.      
ff40: 20 20 72 54 6f 74 61 6c 20 2b 3d 20 6e 52 6f 77    rTotal += nRow
ff50: 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20  *estLog(nRow);. 
ff60: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
ff70: 20 49 66 20 74 68 65 20 63 6f 73 74 20 6f 66 20   If the cost of 
ff80: 73 63 61 6e 6e 69 6e 67 20 75 73 69 6e 67 20 74  scanning using t
ff90: 68 69 73 20 4f 52 20 74 65 72 6d 20 66 6f 72 20  his OR term for 
ffa0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a  optimization is.
ffb0: 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68        ** less th
ffc0: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  an the current c
ffd0: 6f 73 74 20 73 74 6f 72 65 64 20 69 6e 20 70 43  ost stored in pC
ffe0: 6f 73 74 2c 20 72 65 70 6c 61 63 65 20 74 68 65  ost, replace the
fff0: 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20 20   contents.      
10000 2a 2a 20 6f 66 20 70 43 6f 73 74 2e 20 2a 2f 0a  ** of pCost. */.
10010 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
10020 28 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d 69 6e 64  (("... multi-ind
10030 65 78 20 4f 52 20 63 6f 73 74 3d 25 2e 39 67 20  ex OR cost=%.9g 
10040 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c 20 72 54  nrow=%.9g\n", rT
10050 6f 74 61 6c 2c 20 6e 52 6f 77 29 29 3b 0a 20 20  otal, nRow));.  
10060 20 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3c 70      if( rTotal<p
10070 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a  ->cost.rCost ){.
10080 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e          p->cost.
10090 72 43 6f 73 74 20 3d 20 72 54 6f 74 61 6c 3b 0a  rCost = rTotal;.
100a0 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e          p->cost.
100b0 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20  used = used;.   
100c0 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61       p->cost.pla
100d0 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  n.nRow = nRow;. 
100e0 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70         p->cost.p
100f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c  lan.wsFlags = fl
10100 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ags;.        p->
10110 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 54 65 72  cost.plan.u.pTer
10120 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
10130 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
10140 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10150 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
10160 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66  ON */.}..#ifndef
10170 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
10180 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
10190 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
101a0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
101b0 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73  se term pTerm is
101c0 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65   of a form where
101d0 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20   it.** could be 
101e0 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
101f0 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72  ex to access pSr
10200 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61  c, assuming an a
10210 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e  ppropriate.** in
10220 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a  dex existed..*/.
10230 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43  static int termC
10240 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20  anDriveIndex(.  
10250 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
10260 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10270 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
10280 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  erm to check */.
10290 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
102a0 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
102b0 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65   /* Table we are
102c0 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73   trying to acces
102d0 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  s */.  Bitmask n
102e0 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20  otReady         
102f0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
10300 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f  in outer loops o
10310 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b  f the join */.){
10320 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69  .  char aff;.  i
10330 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
10340 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72  rsor!=pSrc->iCur
10350 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  sor ) return 0;.
10360 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
10370 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20  erator!=WO_EQ ) 
10380 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
10390 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
103a0 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
103b0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
103c0 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
103d0 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
103e0 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
103f0 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
10400 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
10410 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
10420 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
10430 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
10440 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
10450 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10460 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
10470 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
10480 20 70 6c 61 6e 20 66 6f 72 20 70 53 72 63 20 73   plan for pSrc s
10490 70 65 63 69 66 69 65 64 20 69 6e 20 70 43 6f 73  pecified in pCos
104a0 74 20 69 73 20 61 20 66 75 6c 6c 20 74 61 62 6c  t is a full tabl
104b0 65 20 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e  e scan.** and in
104c0 64 65 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73  dexing is allows
104d0 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f   (if there is no
104e0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
104f0 75 73 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70  use) and it.** p
10500 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74  ossible to const
10510 72 75 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74  ruct a transient
10520 20 69 6e 64 65 78 20 74 68 61 74 20 77 6f 75 6c   index that woul
10530 64 20 70 65 72 66 6f 72 6d 20 62 65 74 74 65 72  d perform better
10540 0a 2a 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c 20  .** than a full 
10550 74 61 62 6c 65 20 73 63 61 6e 20 65 76 65 6e 20  table scan even 
10560 77 68 65 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  when the cost of
10570 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68   constructing th
10580 65 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61  e index.** is ta
10590 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  ken into account
105a0 2c 20 74 68 65 6e 20 61 6c 74 65 72 20 74 68 65  , then alter the
105b0 20 71 75 65 72 79 20 70 6c 61 6e 20 74 6f 20 75   query plan to u
105c0 73 65 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69  se the.** transi
105d0 65 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ent index..*/.st
105e0 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 41 75  atic void bestAu
105f0 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 57 68 65  tomaticIndex(Whe
10600 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20  reBestIdx *p){. 
10610 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
10620 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20   p->pParse;     
10630 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
10640 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10650 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
10660 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20 20 20  pWC = p->pWC;   
10670 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10680 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
10690 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
106a0 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70 2d  _item *pSrc = p-
106b0 3e 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  >pSrc;  /* The F
106c0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
106d0 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 64  to search */.  d
106e0 6f 75 62 6c 65 20 6e 54 61 62 6c 65 52 6f 77 3b  ouble nTableRow;
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10700 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20       /* Rows in 
10710 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65 20  the input table 
10720 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e  */.  double logN
10730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
10750 67 28 6e 54 61 62 6c 65 52 6f 77 29 20 2a 2f 0a  g(nTableRow) */.
10760 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 54 65 6d    double costTem
10770 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIdx;         /*
10780 20 70 65 72 2d 71 75 65 72 79 20 63 6f 73 74 20   per-query cost 
10790 6f 66 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  of the transient
107a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
107b0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
107c0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
107d0 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
107e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
107f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
10800 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
10810 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
10820 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
10830 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
10840 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 74 20 6d    /* Table tht m
10850 69 67 68 74 20 62 65 20 69 6e 64 65 78 65 64 20  ight be indexed 
10860 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  */..  if( pParse
10870 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3c 3d 28 64  ->nQueryLoop<=(d
10880 6f 75 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 2f  ouble)1 ){.    /
10890 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  * There is no po
108a0 69 6e 74 20 69 6e 20 62 75 69 6c 64 69 6e 67 20  int in building 
108b0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
108c0 65 78 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ex for a single 
108d0 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75  scan */.    retu
108e0 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  rn;.  }.  if( (p
108f0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
10900 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   & SQLITE_AutoIn
10910 64 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  dex)==0 ){.    /
10920 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69  * Automatic indi
10930 63 65 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  ces are disabled
10940 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 2a 2f 0a   at run-time */.
10950 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10960 20 20 69 66 28 20 28 70 2d 3e 63 6f 73 74 2e 70    if( (p->cost.p
10970 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
10980 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
10990 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  )!=0 ){.    /* W
109a0 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 73  e already have s
109b0 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 69 6e 64 65  ome kind of inde
109c0 78 20 69 6e 20 75 73 65 20 66 6f 72 20 74 68 69  x in use for thi
109d0 73 20 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20  s query. */.    
109e0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
109f0 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
10a00 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
10a10 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
10a20 75 73 65 20 61 70 70 65 61 72 73 20 69 6e 20 74  use appears in t
10a30 68 65 20 53 51 4c 2e 20 2a 2f 0a 20 20 20 20 72  he SQL. */.    r
10a40 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
10a50 20 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61   pSrc->isCorrela
10a60 74 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ted ){.    /* Th
10a70 65 20 73 6f 75 72 63 65 20 69 73 20 61 20 63 6f  e source is a co
10a80 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65  rrelated sub-que
10a90 72 79 2e 20 4e 6f 20 70 6f 69 6e 74 20 69 6e 20  ry. No point in 
10aa0 69 6e 64 65 78 69 6e 67 20 69 74 2e 20 2a 2f 0a  indexing it. */.
10ab0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10ac0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
10ad0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3e 3d  e->nQueryLoop >=
10ae0 20 28 64 6f 75 62 6c 65 29 31 20 29 3b 0a 20 20   (double)1 );.  
10af0 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
10b00 54 61 62 3b 0a 20 20 6e 54 61 62 6c 65 52 6f 77  Tab;.  nTableRow
10b10 20 3d 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45   = pTable->nRowE
10b20 73 74 3b 0a 20 20 6c 6f 67 4e 20 3d 20 65 73 74  st;.  logN = est
10b30 4c 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29 3b 0a  Log(nTableRow);.
10b40 20 20 63 6f 73 74 54 65 6d 70 49 64 78 20 3d 20    costTempIdx = 
10b50 32 2a 6c 6f 67 4e 2a 28 6e 54 61 62 6c 65 52 6f  2*logN*(nTableRo
10b60 77 2f 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  w/pParse->nQuery
10b70 4c 6f 6f 70 20 2b 20 31 29 3b 0a 20 20 69 66 28  Loop + 1);.  if(
10b80 20 63 6f 73 74 54 65 6d 70 49 64 78 3e 3d 70 2d   costTempIdx>=p-
10b90 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a 20  >cost.rCost ){. 
10ba0 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
10bb0 66 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 74  f creating the t
10bc0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 77  ransient table w
10bd0 6f 75 6c 64 20 62 65 20 67 72 65 61 74 65 72 20  ould be greater 
10be0 74 68 61 6e 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  than.    ** doin
10bf0 67 20 74 68 65 20 66 75 6c 6c 20 74 61 62 6c 65  g the full table
10c00 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72 65 74   scan */.    ret
10c10 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  urn;.  }..  /* S
10c20 65 61 72 63 68 20 66 6f 72 20 61 6e 79 20 65 71  earch for any eq
10c30 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
10c40 6e 20 74 65 72 6d 20 2a 2f 0a 20 20 70 57 43 45  n term */.  pWCE
10c50 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43  nd = &pWC->a[pWC
10c60 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 66 6f 72 28  ->nTerm];.  for(
10c70 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
10c80 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
10c90 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
10ca0 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
10cb0 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 70 2d 3e  pTerm, pSrc, p->
10cc0 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
10cd0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
10ce0 61 75 74 6f 2d 69 6e 64 65 78 20 72 65 64 75 63  auto-index reduc
10cf0 65 73 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e 31  es cost from %.1
10d00 66 20 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a 20 20  f to %.1f\n",.  
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 2c    p->cost.rCost,
10d30 20 63 6f 73 74 54 65 6d 70 49 64 78 29 29 3b 0a   costTempIdx));.
10d40 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43        p->cost.rC
10d50 6f 73 74 20 3d 20 63 6f 73 74 54 65 6d 70 49 64  ost = costTempId
10d60 78 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74  x;.      p->cost
10d70 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67  .plan.nRow = log
10d80 4e 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  N + 1;.      p->
10d90 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
10da0 73 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s = WHERE_TEMP_I
10db0 4e 44 45 58 3b 0a 20 20 20 20 20 20 70 2d 3e 63  NDEX;.      p->c
10dc0 6f 73 74 2e 75 73 65 64 20 3d 20 70 54 65 72 6d  ost.used = pTerm
10dd0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
10de0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10df0 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
10e00 64 65 66 69 6e 65 20 62 65 73 74 41 75 74 6f 6d  define bestAutom
10e10 61 74 69 63 49 6e 64 65 78 28 41 29 20 20 2f 2a  aticIndex(A)  /*
10e20 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66   no-op */.#endif
10e30 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10e40 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
10e50 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
10e60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
10e70 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47  IC_INDEX./*.** G
10e80 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
10e90 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  construct the In
10ea0 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  dex object for a
10eb0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
10ec0 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20  x.** and to set 
10ed0 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65  up the WhereLeve
10ee0 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20  l object pLevel 
10ef0 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  so that the code
10f00 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61   generator.** ma
10f10 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61  kes use of the a
10f20 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a  utomatic index..
10f30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10f40 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
10f50 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  cIndex(.  Parse 
10f60 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10f70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
10f80 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
10f90 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
10fa0 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
10fb0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
10fc0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
10fd0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
10fe0 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
10ff0 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65  lause term to ge
11000 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  t the next index
11010 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
11020 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
11030 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
11040 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
11050 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
11060 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
11070 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  vel          /* 
11080 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20  Write new index 
11090 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
110a0 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   nColumn;       
110b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
110c0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
110d0 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
110e0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
110f0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
11100 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
11110 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
11120 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
11130 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
11140 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
11150 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
11160 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d    /* Byte of mem
11190 6f 72 79 20 6e 65 65 64 65 64 20 66 6f 72 20 70  ory needed for p
111a0 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  Idx */.  Index *
111b0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
111c0 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64       /* Object d
111d0 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72  escribing the tr
111e0 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f  ansient index */
111f0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11210 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
11220 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
11230 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
11240 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20   addrInit;      
11250 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
11260 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69  ess of the initi
11270 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73  alization bypass
11280 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65   jump */.  Table
11290 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
112a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
112b0 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
112c0 64 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  d */.  KeyInfo *
112d0 70 4b 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyinfo;       
112e0 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
112f0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e  ation for the in
11300 64 65 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20  dex */   .  int 
11310 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
11320 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
11330 66 20 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c  f the index fill
11340 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72   loop */.  int r
11350 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
11360 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
11370 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  er holding an in
11380 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
11390 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
113a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
113b0 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f  olumn counter */
113c0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
113e0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
113f0 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c  /.  int mxBitCol
11400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11410 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d  /* Maximum colum
11420 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73  n in pSrc->colUs
11430 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  ed */.  CollSeq 
11440 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
11450 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
11460 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20   sequence to on 
11470 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 42 69  a column */.  Bi
11480 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
11490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
114a0 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
114b0 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
114c0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
114d0 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
114e0 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
114f0 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
11500 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  s */..  /* Gener
11510 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70  ate code to skip
11520 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74 69   over the creati
11530 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  on and initializ
11540 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
11550 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  * transient inde
11560 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62  x on 2nd and sub
11570 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
11580 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ns of the loop. 
11590 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
115a0 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
115b0 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72  ( v!=0 );.  addr
115c0 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  Init = sqlite3Co
115d0 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
115e0 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
115f0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
11600 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61  s that will be a
11610 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  dded to the inde
11620 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20  x.  ** and used 
11630 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20 63  to match WHERE c
11640 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
11650 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d  s */.  nColumn =
11660 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   0;.  pTable = p
11670 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
11680 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
11690 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 69 64 78  C->nTerm];.  idx
116a0 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
116b0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
116c0 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
116d0 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65  m++){.    if( te
116e0 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
116f0 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74  pTerm, pSrc, not
11700 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20  Ready) ){.      
11710 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d  int iCol = pTerm
11720 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
11730 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d        Bitmask cM
11740 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20  ask = iCol>=BMS 
11750 3f 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  ? ((Bitmask)1)<<
11760 28 42 4d 53 2d 31 29 20 3a 20 28 28 42 69 74 6d  (BMS-1) : ((Bitm
11770 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20  ask)1)<<iCol;.  
11780 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
11790 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
117a0 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
117b0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
117c0 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
117d0 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
117e0 20 20 20 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20      nColumn++;. 
117f0 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c         idxCols |
11800 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  = cMask;.      }
11810 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
11820 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29  ert( nColumn>0 )
11830 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  ;.  pLevel->plan
11840 2e 6e 45 71 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  .nEq = nColumn;.
11850 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
11860 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69  number of additi
11870 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
11880 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a  ded to create a.
11890 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e    ** covering in
118a0 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e  dex.  A "coverin
118b0 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69  g index" is an i
118c0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
118d0 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75  ns all.  ** colu
118e0 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65 65  mns that are nee
118f0 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ded by the query
11900 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72 69  .  With a coveri
11910 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20  ng index, the.  
11920 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
11930 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  e never needs to
11940 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20 41   be accessed.  A
11950 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73  utomatic indices
11960 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20   must.  ** be a 
11970 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62  covering index b
11980 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65 78  ecause the index
11990 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
119a0 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a  ated if the.  **
119b0 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
119c0 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20  changes and the 
119d0 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
119e0 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75  cannot both be u
119f0 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  sed.  ** if they
11a00 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e   go out of sync.
11a10 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c  .  */.  extraCol
11a20 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  s = pSrc->colUse
11a30 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20  d & (~idxCols | 
11a40 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
11a50 42 4d 53 2d 31 29 29 29 3b 0a 20 20 6d 78 42 69  BMS-1)));.  mxBi
11a60 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e  tCol = (pTable->
11a70 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f  nCol >= BMS-1) ?
11a80 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d   BMS-1 : pTable-
11a90 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73  >nCol;.  testcas
11aa0 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
11ab0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74  =BMS-1 );.  test
11ac0 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
11ad0 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66  ol==BMS-2 );.  f
11ae0 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
11af0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
11b00 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 28 28  ( extraCols & ((
11b10 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20  (Bitmask)1)<<i) 
11b20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d  ) nColumn++;.  }
11b30 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
11b40 55 73 65 64 20 26 20 28 28 28 42 69 74 6d 61 73  Used & (((Bitmas
11b50 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29  k)1)<<(BMS-1)) )
11b60 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d  {.    nColumn +=
11b70 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20   pTable->nCol - 
11b80 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70  BMS + 1;.  }.  p
11b90 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
11ba0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
11bb0 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49  UMN_EQ | WHERE_I
11bc0 44 58 5f 4f 4e 4c 59 20 7c 20 57 4f 5f 45 51 3b  DX_ONLY | WO_EQ;
11bd0 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  ..  /* Construct
11be0 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
11bf0 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  t to describe th
11c00 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 6e 42  is index */.  nB
11c10 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64  yte = sizeof(Ind
11c20 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b 3d 20  ex);.  nByte += 
11c30 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 69  nColumn*sizeof(i
11c40 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65  nt);     /* Inde
11c50 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  x.aiColumn */.  
11c60 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
11c70 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b 20  *sizeof(char*); 
11c80 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
11c90 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20  l */.  nByte += 
11ca0 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  nColumn;        
11cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
11cc0 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a  x.aSortOrder */.
11cd0 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
11ce0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
11cf0 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  rse->db, nByte);
11d00 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
11d10 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 65 76 65   return;.  pLeve
11d20 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d  l->plan.u.pIdx =
11d30 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 61   pIdx;.  pIdx->a
11d40 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zColl = (char**)
11d50 26 70 49 64 78 5b 31 5d 3b 0a 20 20 70 49 64 78  &pIdx[1];.  pIdx
11d60 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e  ->aiColumn = (in
11d70 74 2a 29 26 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  t*)&pIdx->azColl
11d80 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64  [nColumn];.  pId
11d90 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
11da0 28 75 38 2a 29 26 70 49 64 78 2d 3e 61 69 43 6f  (u8*)&pIdx->aiCo
11db0 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  lumn[nColumn];. 
11dc0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22   pIdx->zName = "
11dd0 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70  auto-index";.  p
11de0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e  Idx->nColumn = n
11df0 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e  Column;.  pIdx->
11e00 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
11e10 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
11e20 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
11e30 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
11e40 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
11e50 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
11e60 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
11e70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
11e80 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
11e90 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
11ea0 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
11eb0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
11ec0 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
11ed0 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28   ((Bitmask)1)<<(
11ee0 42 4d 53 2d 31 29 20 3a 20 28 28 42 69 74 6d 61  BMS-1) : ((Bitma
11ef0 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20  sk)1)<<iCol;.   
11f00 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
11f10 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
11f20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
11f30 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
11f40 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
11f50 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
11f60 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
11f70 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
11f80 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
11f90 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
11fa0 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
11fb0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
11fc0 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
11fd0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
11fe0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
11ff0 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f   ALWAYS(pColl) ?
12000 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
12010 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
12020 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
12030 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
12040 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 65 76 65  t( (u32)n==pLeve
12050 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 29 3b 0a 0a  l->plan.nEq );..
12060 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f    /* Add additio
12070 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  nal columns need
12080 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61  ed to make the a
12090 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
120a0 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72  nto.  ** a cover
120b0 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66  ing index */.  f
120c0 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
120d0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
120e0 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 28 28  ( extraCols & ((
120f0 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20  (Bitmask)1)<<i) 
12100 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
12110 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
12120 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
12130 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
12140 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
12150 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72   }.  }.  if( pSr
12160 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28 28  c->colUsed & (((
12170 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
12180 2d 31 29 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  -1)) ){.    for(
12190 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c  i=BMS-1; i<pTabl
121a0 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
121b0 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
121c0 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
121d0 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
121e0 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
121f0 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
12200 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d   }.  assert( n==
12210 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a  nColumn );..  /*
12220 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f   Create the auto
12230 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  matic index */. 
12240 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69   pKeyinfo = sqli
12250 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
12260 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
12270 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
12280 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20  >iIdxCur>=0 );. 
12290 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
122a0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74  p4(v, OP_OpenAut
122b0 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e  oindex, pLevel->
122c0 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e  iIdxCur, nColumn
122d0 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +1, 0,.         
122e0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
122f0 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyinfo, P4_K
12300 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
12310 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
12320 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
12330 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
12340 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
12350 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
12360 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61  h content */.  a
12370 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
12380 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12390 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d  _Rewind, pLevel-
123a0 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72 65 67  >iTabCur);.  reg
123b0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
123c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
123d0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  e);.  sqlite3Gen
123e0 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50  erateIndexKey(pP
123f0 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76  arse, pIdx, pLev
12400 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67  el->iTabCur, reg
12410 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71  Record, 1);.  sq
12420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12430 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
12440 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
12450 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
12460 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
12470 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
12480 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
12490 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
124a0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c  2(v, OP_Next, pL
124b0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61  evel->iTabCur, a
124c0 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c  ddrTop+1);.  sql
124d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
124e0 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  (v, SQLITE_STMTS
124f0 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29  TATUS_AUTOINDEX)
12500 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
12510 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
12520 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  op);.  sqlite3Re
12530 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
12540 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
12550 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  .  .  /* Jump he
12560 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67  re when skipping
12570 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
12580 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
12590 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
125a0 61 64 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e  addrInit);.}.#en
125b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
125c0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
125d0 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EX */..#ifndef S
125e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
125f0 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c  ALTABLE./*.** Al
12600 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  locate and popul
12610 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69  ate an sqlite3_i
12620 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
12630 75 72 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ure. It is the .
12640 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
12650 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
12660 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65  to eventually re
12670 6c 65 61 73 65 20 74 68 65 20 73 74 72 75 63 74  lease the struct
12680 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e  ure.** by passin
12690 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65  g the pointer re
126a0 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
126b0 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74  unction to sqlit
126c0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
126d0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64  atic sqlite3_ind
126e0 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74  ex_info *allocat
126f0 65 49 6e 64 65 78 49 6e 66 6f 28 57 68 65 72 65  eIndexInfo(Where
12700 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20 20 50  BestIdx *p){.  P
12710 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
12720 2d 3e 70 50 61 72 73 65 3b 20 0a 20 20 57 68 65  ->pParse; .  Whe
12730 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20  reClause *pWC = 
12740 70 2d 3e 70 57 43 3b 0a 20 20 73 74 72 75 63 74  p->pWC;.  struct
12750 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
12760 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
12770 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
12780 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
12790 79 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  y;.  int i, j;. 
127a0 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74   int nTerm;.  st
127b0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
127c0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
127d0 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
127e0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
127f0 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
12800 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
12810 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
12820 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
12830 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
12840 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
12850 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
12860 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12870 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48  *pIdxInfo;..  WH
12880 45 52 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d  ERETRACE(("Recom
12890 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66  puting index inf
128a0 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20  o for %s...\n", 
128b0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
128c0 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  e));..  /* Count
128d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
128e0 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c  ossible WHERE cl
128f0 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
12900 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20   referring.  ** 
12910 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
12920 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
12930 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d  =nTerm=0, pTerm=
12940 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
12950 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
12960 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
12970 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
12980 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
12990 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
129a0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
129b0 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d  eOperator&(pTerm
129c0 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d  ->eOperator-1))=
129d0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
129e0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
129f0 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20  ator==WO_IN );. 
12a00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
12a10 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
12a20 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
12a30 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
12a40 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
12a50 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
12a60 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
12a70 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
12a80 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
12a90 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b  nue;.    nTerm++
12aa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
12ab0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
12ac0 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
12ad0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
12ae0 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69  current .  ** vi
12af0 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
12b00 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
12b10 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
12b20 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68   part of.  ** th
12b30 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
12b40 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  info structure..
12b50 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20    */.  nOrderBy 
12b60 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  = 0;.  if( pOrde
12b70 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rBy ){.    int n
12b80 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
12b90 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
12ba0 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
12bb0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
12bc0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
12bd0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
12be0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
12bf0 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
12c00 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
12c10 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
12c20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e    }.    if( i==n
12c30 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42  ){.      nOrderB
12c40 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = n;.    }.  }
12c50 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
12c60 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
12c70 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
12c80 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
12c90 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
12ca0 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
12cb0 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49  b, sizeof(*pIdxI
12cc0 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20  nfo).           
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43  + (sizeof(*pIdxC
12cf0 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ons) + sizeof(*p
12d00 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20  Usage))*nTerm.  
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
12d30 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
12d40 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66  nOrderBy );.  if
12d50 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
12d60 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12d70 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
12d80 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
12d90 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20     /* (double)0 
12da0 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54  In case of SQLIT
12db0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
12dc0 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20  POINT... */.    
12dd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
12de0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
12df0 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  he structure.  T
12e00 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
12e10 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
12e20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61  contains.  ** ma
12e30 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ny fields that a
12e40 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e  re declared "con
12e50 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78  st" to prevent x
12e60 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20  BestIndex from. 
12e70 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65   ** changing the
12e80 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  m.  We have to d
12e90 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73  o some funky cas
12ea0 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f  ting in order to
12eb0 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
12ec0 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20   those fields.. 
12ed0 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
12ee0 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
12ef0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
12f00 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b  t*)&pIdxInfo[1];
12f10 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d  .  pIdxOrderBy =
12f20 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
12f30 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
12f40 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
12f50 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74  ;.  pUsage = (st
12f60 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
12f70 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
12f80 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
12f90 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a  y[nOrderBy];.  *
12fa0 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
12fb0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
12fc0 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  Term;.  *(int*)&
12fd0 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
12fe0 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
12ff0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
13000 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
13010 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
13020 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
13030 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75  dxCons;.  *(stru
13040 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13050 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
13060 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
13070 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
13080 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
13090 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
130a0 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49  t_usage**)&pIdxI
130b0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
130c0 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13100 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67             pUsag
13110 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c  e;..  for(i=j=0,
13120 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
13130 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
13140 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
13150 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
13160 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
13170 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
13180 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
13190 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
131a0 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  &(pTerm->eOperat
131b0 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20  or-1))==0 );.   
131c0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
131d0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
131e0 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
131f0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
13200 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator==WO_ISNULL 
13210 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
13220 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
13230 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
13240 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13250 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
13260 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
13270 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13280 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
13290 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
132a0 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
132b0 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
132c0 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
132d0 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
132e0 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
132f0 72 61 74 6f 72 3b 0a 20 20 20 20 2f 2a 20 54 68  rator;.    /* Th
13300 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d  e direct assignm
13310 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ent in the previ
13320 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73  ous line is poss
13330 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73  ible only becaus
13340 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f  e.    ** the WO_
13350 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45   and SQLITE_INDE
13360 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f  X_CONSTRAINT_ co
13370 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  des are identica
13380 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66  l.  The.    ** f
13390 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
133a0 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63   verify this fac
133b0 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
133c0 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f  ( WO_EQ==SQLITE_
133d0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
133e0 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
133f0 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45  t( WO_LT==SQLITE
13400 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
13410 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LT );.    asse
13420 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
13430 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
13440 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_LE );.    ass
13450 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
13460 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
13470 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73  INT_GT );.    as
13480 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c  sert( WO_GE==SQL
13490 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
134a0 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61  AINT_GE );.    a
134b0 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d  ssert( WO_MATCH=
134c0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
134d0 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29  NSTRAINT_MATCH )
134e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
134f0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
13500 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f   (WO_EQ|WO_LT|WO
13510 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
13520 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20  WO_MATCH) );.   
13530 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
13540 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
13550 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
13560 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
13570 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
13580 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
13590 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
135a0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
135b0 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
135c0 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
135d0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
135e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
135f0 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dxInfo;.}../*.**
13600 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   The table objec
13610 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73  t reference pass
13620 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
13630 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
13640 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
13650 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76  st represent a v
13660 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68  irtual table. Th
13670 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
13680 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64  kes the xBestInd
13690 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ex().** method o
136a0 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
136b0 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c  ble with the sql
136c0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
136d0 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 0a 2a  pointer passed.*
136e0 2a 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  * as the argumen
136f0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
13700 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
13710 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
13720 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
13730 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
13740 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
13750 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
13760 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
13770 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
13780 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
13790 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
137a0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
137b0 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
137c0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
137d0 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
137e0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
137f0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
13800 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
13810 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
13820 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
13830 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
13840 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
13850 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
13860 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
13870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
13880 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
13890 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
138a0 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
138b0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
138c0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
138d0 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
138e0 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
138f0 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
13900 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
13910 74 20 72 63 3b 0a 0a 20 20 57 48 45 52 45 54 52  t rc;..  WHERETR
13920 41 43 45 28 28 22 78 42 65 73 74 49 6e 64 65 78  ACE(("xBestIndex
13930 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61 62   for %s\n", pTab
13940 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41  ->zName));.  TRA
13950 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
13960 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
13970 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
13980 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
13990 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
139a0 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
139b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
139c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
139d0 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
139e0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
139f0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
13a00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56     }else if( !pV
13a10 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
13a20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13a30 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
13a40 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
13a50 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  r(rc));.    }els
13a60 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
13a70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13a80 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45   "%s", pVtab->zE
13a90 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
13aa0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
13ab0 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
13ac0 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
13ad0 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  sg = 0;..  for(i
13ae0 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
13af0 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
13b00 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61  if( !p->aConstra
13b10 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26  int[i].usable &&
13b20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
13b30 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
13b40 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
13b50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13b60 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
13b70 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
13b80 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
13b90 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
13ba0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13bb0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
13bc0 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  rn pParse->nErr;
13bd0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
13be0 74 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  te the best inde
13bf0 78 20 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20  x for a virtual 
13c00 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
13c10 20 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 63   best index is c
13c20 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 78  omputed by the x
13c30 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
13c40 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 0a   of the virtual.
13c50 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e  ** table module.
13c60 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
13c70 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
13c80 77 72 61 70 70 65 72 20 74 68 61 74 20 73 65 74  wrapper that set
13c90 73 20 75 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s up.** the sqli
13ca0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
13cb0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
13cc0 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69   used to communi
13cd0 63 61 74 65 20 77 69 74 68 0a 2a 2a 20 78 42 65  cate with.** xBe
13ce0 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49  stIndex..**.** I
13cf0 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72  n a join, this r
13d00 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 62 65 20  outine might be 
13d10 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20  called multiple 
13d20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a  times for the.**
13d30 20 73 61 6d 65 20 76 69 72 74 75 61 6c 20 74 61   same virtual ta
13d40 62 6c 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ble.  The sqlite
13d50 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
13d60 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
13d70 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  d.** and initial
13d80 69 7a 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73  ized on the firs
13d90 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
13da0 20 72 65 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73   reused on all s
13db0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76  ubsequent.** inv
13dc0 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 65 20 73  ocations.  The s
13dd0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13de0 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
13df0 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a  lso used when.**
13e00 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
13e10 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
13e20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
13e30 20 54 68 65 20 77 68 65 72 65 49 6e 66 6f 44 65   The whereInfoDe
13e40 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69  lete() .** routi
13e50 6e 65 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ne takes care of
13e60 20 66 72 65 65 69 6e 67 20 74 68 65 20 73 71 6c   freeing the sql
13e70 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13e80 73 74 72 75 63 74 75 72 65 20 61 66 74 65 72 0a  structure after.
13e90 2a 2a 20 65 76 65 72 79 62 6f 64 79 20 68 61 73  ** everybody has
13ea0 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 69   finished with i
13eb0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
13ec0 64 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64  d bestVirtualInd
13ed0 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20  ex(WhereBestIdx 
13ee0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
13ef0 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
13f00 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ;      /* The pa
13f10 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
13f20 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
13f30 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b 20 20 20  pWC = p->pWC;   
13f40 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
13f50 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
13f60 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
13f70 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
13f80 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
13f90 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
13fa0 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ch */.  Table *p
13fb0 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  Tab = pSrc->pTab
13fc0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
13fd0 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
13fe0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
13ff0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14000 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
14010 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
14020 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
14030 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
14040 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
14050 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
14060 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
14070 20 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 0a    double rCost;.
14080 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
14090 77 73 46 6c 61 67 73 20 69 73 20 69 6e 69 74 69  wsFlags is initi
140a0 61 6c 69 7a 65 64 20 74 6f 20 73 6f 6d 65 20 73  alized to some s
140b0 61 6e 65 20 76 61 6c 75 65 2e 20 4f 74 68 65 72  ane value. Other
140c0 77 69 73 65 2c 20 69 66 20 74 68 65 20 0a 20 20  wise, if the .  
140d0 2a 2a 20 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c  ** malloc in all
140e0 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29  ocateIndexInfo()
140f0 20 66 61 69 6c 73 20 61 6e 64 20 74 68 69 73 20   fails and this 
14100 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
14110 20 6c 65 61 76 69 6e 67 0a 20 20 2a 2a 20 77 73   leaving.  ** ws
14120 46 6c 61 67 73 20 69 6e 20 61 6e 20 75 6e 69 6e  Flags in an unin
14130 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2c  itialized state,
14140 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 20   the caller may 
14150 62 65 68 61 76 65 20 75 6e 70 72 65 64 69 63 74  behave unpredict
14160 61 62 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ably..  */.  mem
14170 73 65 74 28 26 70 2d 3e 63 6f 73 74 2c 20 30 2c  set(&p->cost, 0,
14180 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 73 74 29   sizeof(p->cost)
14190 29 3b 0a 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61  );.  p->cost.pla
141a0 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  n.wsFlags = WHER
141b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
141c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c  .  /* If the sql
141d0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
141e0 73 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f  structure has no
141f0 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  t been previousl
14200 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
14210 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
14220 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  , then allocate 
14230 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
14240 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 49  t now..  */.  pI
14250 64 78 49 6e 66 6f 20 3d 20 2a 70 2d 3e 70 70 49  dxInfo = *p->ppI
14260 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49  dxInfo;.  if( pI
14270 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
14280 20 2a 70 2d 3e 70 70 49 64 78 49 6e 66 6f 20 3d   *p->ppIdxInfo =
14290 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f   pIdxInfo = allo
142a0 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 29  cateIndexInfo(p)
142b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
142c0 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Info==0 ){.    r
142d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
142e0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
142f0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
14300 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14310 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20 70   that pIdxInfo p
14320 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69  oints.  ** to wi
14330 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e 69  ll have been ini
14340 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65 72  tialized, either
14350 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
14360 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ent invocation o
14370 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f  r.  ** during so
14380 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74  me prior invocat
14390 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73  ion.  Now we jus
143a0 74 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f 6d  t have to custom
143b0 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65 74  ize the.  ** det
143c0 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66 6f  ails of pIdxInfo
143d0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
143e0 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20   invocation and 
143f0 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20  pass it to.  ** 
14400 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f  xBestIndex..  */
14410 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c  ..  /* The modul
14420 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 64  e name must be d
14430 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79  efined. Also, by
14440 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
14450 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61  e must.  ** be a
14460 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
14470 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
14480 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65  cture. Otherwise
14490 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69 65  .  ** sqlite3Vie
144a0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
144b0 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69 63  ) would have pic
144c0 6b 65 64 20 75 70 20 74 68 65 20 65 72 72 6f 72  ked up the error
144d0 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  . .  */.  assert
144e0 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  ( pTab->azModule
144f0 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d  Arg && pTab->azM
14500 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20  oduleArg[0] );. 
14510 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14520 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65  GetVTable(pParse
14530 2d 3e 64 62 2c 20 70 54 61 62 29 20 29 3b 0a 0a  ->db, pTab) );..
14540 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f    /* Set the aCo
14550 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c  nstraint[].usabl
14560 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69  e fields and ini
14570 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a  tialize all .  *
14580 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
14590 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  es to zero..  **
145a0 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e  .  ** aConstrain
145b0 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72  t[].usable is tr
145c0 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ue for constrain
145d0 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67  ts where the rig
145e0 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64  ht-hand.  ** sid
145f0 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
14600 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
14610 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
14620 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a   of the current.
14630 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20    ** table.  In 
14640 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
14650 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
14660 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
14670 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
14680 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72     column = expr
14690 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77  .  **.  ** and w
146a0 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
146b0 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
146c0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e constraint on 
146d0 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20  column is .  ** 
146e0 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c  only valid if al
146f0 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  l tables referen
14700 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75  ced in expr occu
14710 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  r to the left.  
14720 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
14730 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
14740 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
14750 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20   aConstraints[] 
14760 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65  array contains e
14770 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
14780 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
14790 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
147a0 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20  able.  That way 
147b0 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20  we only have to 
147c0 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a  compute it once.
147d0 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
147e0 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f   we might try to
147f0 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69   pick the best i
14800 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69  ndex multiple ti
14810 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61  mes..  ** For ea
14820 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69  ch attempt at pi
14830 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  cking an index, 
14840 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62  the order of tab
14850 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  les in the.  ** 
14860 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69  join might be di
14870 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61  fferent so we ha
14880 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  ve to recompute 
14890 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a  the usable flag.
148a0 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a    ** each time..
148b0 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
148c0 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
148d0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
148e0 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
148f0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
14900 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
14910 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
14920 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  age;.  for(i=0; 
14930 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
14940 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
14950 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a  dxCons++){.    j
14960 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
14970 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54  rmOffset;.    pT
14980 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
14990 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e  ;.    pIdxCons->
149a0 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
149b0 3e 70 72 65 72 65 71 52 69 67 68 74 26 70 2d 3e  >prereqRight&p->
149c0 6e 6f 74 52 65 61 64 79 29 20 3f 20 30 20 3a 20  notReady) ? 0 : 
149d0 31 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  1;.  }.  memset(
149e0 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
149f0 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
14a00 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
14a10 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nt);.  if( pIdxI
14a20 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
14a30 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  dxStr ){.    sql
14a40 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
14a50 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d  fo->idxStr);.  }
14a60 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
14a70 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
14a80 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
14a90 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  .  pIdxInfo->nee
14aa0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
14ab0 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  0;.  pIdxInfo->o
14ac0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
14ad0 20 30 3b 0a 20 20 2f 2a 20 28 28 64 6f 75 62 6c   0;.  /* ((doubl
14ae0 65 29 32 29 20 49 6e 20 63 61 73 65 20 6f 66 20  e)2) In case of 
14af0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
14b00 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
14b10 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
14b20 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
14b30 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28  ITE_BIG_DBL / ((
14b40 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20 6e 4f 72  double)2);.  nOr
14b50 64 65 72 42 79 20 3d 20 70 49 64 78 49 6e 66 6f  derBy = pIdxInfo
14b60 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66  ->nOrderBy;.  if
14b70 28 20 21 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  ( !p->pOrderBy )
14b80 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
14b90 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
14ba0 7d 0a 0a 20 20 69 66 28 20 76 74 61 62 42 65 73  }..  if( vtabBes
14bb0 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
14bc0 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 20 29  Tab, pIdxInfo) )
14bd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
14be0 7d 0a 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  }..  pIdxCons = 
14bf0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
14c00 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
14c10 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
14c20 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f  Constraint;.  fo
14c30 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
14c40 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
14c50 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 55  i++){.    if( pU
14c60 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
14c70 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  x>0 ){.      p->
14c80 63 6f 73 74 2e 75 73 65 64 20 7c 3d 20 70 57 43  cost.used |= pWC
14c90 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 5b 69 5d 2e  ->a[pIdxCons[i].
14ca0 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65  iTermOffset].pre
14cb0 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a  reqRight;.    }.
14cc0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
14cd0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
14ce0 59 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68  Y clause, and th
14cf0 65 20 73 65 6c 65 63 74 65 64 20 76 69 72 74 75  e selected virtu
14d00 61 6c 20 74 61 62 6c 65 20 69 6e 64 65 78 0a 20  al table index. 
14d10 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 61 74   ** does not sat
14d20 69 73 66 79 20 69 74 2c 20 69 6e 63 72 65 61 73  isfy it, increas
14d30 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68  e the cost of th
14d40 65 20 73 63 61 6e 20 61 63 63 6f 72 64 69 6e 67  e scan according
14d50 6c 79 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61  ly. This.  ** ma
14d60 74 63 68 65 73 20 74 68 65 20 70 72 6f 63 65 73  tches the proces
14d70 73 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76 69 72  sing for non-vir
14d80 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20 62  tual tables in b
14d90 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 2e  estBtreeIndex().
14da0 0a 20 20 2a 2f 0a 20 20 72 43 6f 73 74 20 3d 20  .  */.  rCost = 
14db0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
14dc0 74 65 64 43 6f 73 74 3b 0a 20 20 69 66 28 20 70  tedCost;.  if( p
14dd0 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 49  ->pOrderBy && pI
14de0 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
14df0 6f 6e 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20 20  onsumed==0 ){.  
14e00 20 20 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f    rCost += estLo
14e10 67 28 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b 0a  g(rCost)*rCost;.
14e20 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
14e30 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  st is not allowe
14e40 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74  d to be larger t
14e50 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  han SQLITE_BIG_D
14e60 42 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e 69  BL (the.  ** ini
14e70 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77  tal value of low
14e80 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20  estCost in this 
14e90 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20  loop. If it is, 
14ea0 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28 63  then the.  ** (c
14eb0 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20  ost<lowestCost) 
14ec0 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20  test below will 
14ed0 6e 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20  never be true.. 
14ee0 20 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22 28   ** .  ** Use "(
14ef0 64 6f 75 62 6c 65 29 32 22 20 69 6e 73 74 65 61  double)2" instea
14f00 64 20 6f 66 20 22 32 2e 30 22 20 69 6e 20 63 61  d of "2.0" in ca
14f10 73 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  se OMIT_FLOATING
14f20 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73 20  _POINT .  ** is 
14f30 64 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  defined..  */.  
14f40 69 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f  if( (SQLITE_BIG_
14f50 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29  DBL/((double)2))
14f60 3c 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 70 2d  <rCost ){.    p-
14f70 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 28 53  >cost.rCost = (S
14f80 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28  QLITE_BIG_DBL/((
14f90 64 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65  double)2));.  }e
14fa0 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74  lse{.    p->cost
14fb0 2e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a  .rCost = rCost;.
14fc0 20 20 7d 0a 20 20 70 2d 3e 63 6f 73 74 2e 70 6c    }.  p->cost.pl
14fd0 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d 20  an.u.pVtabIdx = 
14fe0 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pIdxInfo;.  if( 
14ff0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
15000 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20  yConsumed ){.   
15010 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73   p->cost.plan.ws
15020 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
15030 52 44 45 52 42 59 3b 0a 20 20 7d 0a 20 20 70 2d  RDERBY;.  }.  p-
15040 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 45 71 20 3d  >cost.plan.nEq =
15050 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
15060 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
15070 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  rBy;..  /* Try t
15080 6f 20 66 69 6e 64 20 61 20 6d 6f 72 65 20 65 66  o find a more ef
15090 66 69 63 69 65 6e 74 20 61 63 63 65 73 73 20 70  ficient access p
150a0 61 74 74 65 72 6e 20 62 79 20 75 73 69 6e 67 20  attern by using 
150b0 6d 75 6c 74 69 70 6c 65 20 69 6e 64 65 78 65 73  multiple indexes
150c0 0a 20 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a  .  ** to optimiz
150d0 65 20 61 6e 20 4f 52 20 65 78 70 72 65 73 73 69  e an OR expressi
150e0 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 57 48  on within the WH
150f0 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 20 20 2a  ERE clause. .  *
15100 2f 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65  /.  bestOrClause
15110 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 23 65 6e 64  Index(p);.}.#end
15120 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15130 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
15140 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
15150 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a  _ENABLE_STAT3./*
15160 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
15170 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70   location of a p
15180 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d  articular key am
15190 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20  ong all keys in 
151a0 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74  an.** index.  St
151b0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
151c0 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c  in aStat as foll
151d0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53  ows:.**.**    aS
151e0 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e  tat[0]      Est.
151f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
15200 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a  less than pVal.*
15210 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20  *    aStat[1]   
15220 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
15230 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20  f rows equal to 
15240 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  pVal.**.** Retur
15250 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15260 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  uccess..*/.stati
15270 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74  c int whereKeySt
15280 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
15290 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
152a0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
152b0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
152c0 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
152d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
152e0 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
152f0 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73  domain of */.  s
15300 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
15310 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61  al,        /* Va
15320 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  lue to consider 
15330 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  */.  int roundUp
15340 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15350 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20   /* Round up if 
15360 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77  true.  Round dow
15370 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20  n if false */.  
15380 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20  tRowcnt *aStat  
15390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
153a0 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65  UT: stats writte
153b0 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74  n here */.){.  t
153c0 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65  Rowcnt n;.  Inde
153d0 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
153e0 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79 70 65  ;.  int i, eType
153f0 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d 20 30  ;.  int isEq = 0
15400 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64 6f 75  ;.  i64 v;.  dou
15410 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73  ble r, rS;..  as
15420 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30  sert( roundUp==0
15430 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29   || roundUp==1 )
15440 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
15450 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
15460 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 72   if( pVal==0 ) r
15470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
15480 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e  OR;.  n = pIdx->
15490 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61  aiRowEst[0];.  a
154a0 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
154b0 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65 20  Sample;.  eType 
154c0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
154d0 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69  type(pVal);..  i
154e0 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
154f0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
15500 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
15510 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20  e_int64(pVal);. 
15520 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b 0a 20     r = (i64)v;. 
15530 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
15540 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  dx->nSample; i++
15550 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  ){.      if( aSa
15560 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
15570 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e  QLITE_NULL ) con
15580 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
15590 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
155a0 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  e>=SQLITE_TEXT )
155b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
155c0 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
155d0 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  pe==SQLITE_INTEG
155e0 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ER ){.        if
155f0 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69  ( aSample[i].u.i
15600 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=v ){.         
15610 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b   isEq = aSample[
15620 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20  i].u.i==v;.     
15630 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15640 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
15650 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
15660 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  t( aSample[i].eT
15670 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
15680 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
15690 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e   aSample[i].u.r>
156a0 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =r ){.          
156b0 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69  isEq = aSample[i
156c0 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20  ].u.r==r;.      
156d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
156e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
156f0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
15700 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
15710 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20 73 71  AT ){.    r = sq
15720 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
15730 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f  le(pVal);.    fo
15740 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
15750 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
15760 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
15770 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  i].eType==SQLITE
15780 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  _NULL ) continue
15790 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d  ;.      if( aSam
157a0 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51  ple[i].eType>=SQ
157b0 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65 61  LITE_TEXT ) brea
157c0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  k;.      if( aSa
157d0 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
157e0 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
157f0 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d         rS = aSam
15800 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20  ple[i].u.r;.    
15810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15820 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d   rS = aSample[i]
15830 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  .u.i;.      }.  
15840 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20 29 7b      if( rS>=r ){
15850 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20  .        isEq = 
15860 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 62  rS==r;.        b
15870 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15880 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
15890 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  eType==SQLITE_NU
158a0 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b  LL ){.    i = 0;
158b0 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65  .    if( aSample
158c0 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [0].eType==SQLIT
158d0 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d 20  E_NULL ) isEq = 
158e0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
158f0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
15900 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54  QLITE_TEXT || eT
15910 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
15920 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
15930 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
15940 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
15950 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
15960 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe==SQLITE_TEXT 
15970 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  || aSample[i].eT
15980 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
15990 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
159a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
159b0 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d  .    if( i<pIdx-
159c0 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20 20 20  >nSample ){     
159d0 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20   .      sqlite3 
159e0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
159f0 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
15a00 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f  *pColl;.      co
15a10 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20  nst u8 *z;.     
15a20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
15a30 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20  TE_BLOB ){.     
15a40 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38     z = (const u8
15a50 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
15a60 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20  _blob(pVal);.   
15a70 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
15a80 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
15a90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
15aa0 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  l->enc==SQLITE_U
15ab0 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  TF8 );.      }el
15ac0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
15ad0 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
15ae0 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
15af0 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64 78 2d  _UTF8, 0, *pIdx-
15b00 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  >azColl);.      
15b10 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
15b20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
15b30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15b40 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  se, "no such col
15b50 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a  lation sequence:
15b60 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b80 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a  *pIdx->azColl);.
15b90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15ba0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
15bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15bc0 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a   z = (const u8 *
15bd0 29 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78  )sqlite3ValueTex
15be0 74 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65  t(pVal, pColl->e
15bf0 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nc);.        if(
15c00 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20   !z ){.         
15c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
15c20 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
15c30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15c40 7a 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43  z && pColl && pC
15c50 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20  oll->xCmp );.   
15c60 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73     }.      n = s
15c70 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65 73  qlite3ValueBytes
15c80 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  (pVal, pColl->en
15c90 63 29 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72  c);.  .      for
15ca0 28 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  (; i<pIdx->nSamp
15cb0 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
15cc0 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
15cd0 20 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65   int eSampletype
15ce0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54   = aSample[i].eT
15cf0 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ype;.        if(
15d00 20 65 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79   eSampletype<eTy
15d10 70 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pe ) continue;. 
15d20 20 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70         if( eSamp
15d30 6c 65 74 79 70 65 21 3d 65 54 79 70 65 20 29 20  letype!=eType ) 
15d40 62 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53  break;.#ifndef S
15d50 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
15d60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
15d70 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f  ll->enc!=SQLITE_
15d80 55 54 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20  UTF8 ){.        
15d90 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20    int nSample;. 
15da0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
15db0 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33  Sample = sqlite3
15dc0 55 74 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20  Utf8to16(.      
15dd0 20 20 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c          db, pCol
15de0 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b  l->enc, aSample[
15df0 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b  i].u.z, aSample[
15e00 69 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70  i].nByte, &nSamp
15e10 6c 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  le.          );.
15e20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a            if( !z
15e30 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
15e40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
15e50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
15e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15e80 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
15e90 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f           c = pCo
15ea0 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
15eb0 70 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20  pUser, nSample, 
15ec0 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a  zSample, n, z);.
15ed0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15ee0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d  3DbFree(db, zSam
15ef0 70 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ple);.        }e
15f00 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
15f10 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63     {.          c
15f20 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
15f30 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61  Coll->pUser, aSa
15f40 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61  mple[i].nByte, a
15f50 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e  Sample[i].u.z, n
15f60 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , z);.        }.
15f70 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30          if( c>=0
15f80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
15f90 28 20 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20  ( c==0 ) isEq = 
15fa0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
15fb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
15fc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15fd0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
15fe0 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20  int, aSample[i] 
15ff0 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d  is the first sam
16000 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ple that is grea
16010 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72  ter than.  ** or
16020 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20   equal to pVal. 
16030 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e   Or if i==pIdx->
16040 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c  nSample, then al
16050 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65  l samples are le
16060 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61  ss.  ** than pVa
16070 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69  l.  If aSample[i
16080 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73  ]==pVal, then is
16090 45 71 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66  Eq==1..  */.  if
160a0 28 20 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73  ( isEq ){.    as
160b0 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53  sert( i<pIdx->nS
160c0 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74  ample );.    aSt
160d0 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[0] = aSample[
160e0 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61  i].nLt;.    aSta
160f0 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
16100 5d 2e 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ].nEq;.  }else{.
16110 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77      tRowcnt iLow
16120 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70  er, iUpper, iGap
16130 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29  ;.    if( i==0 )
16140 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  {.      iLower =
16150 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72   0;.      iUpper
16160 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c   = aSample[0].nL
16170 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
16180 20 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d      iUpper = i>=
16190 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20  pIdx->nSample ? 
161a0 6e 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  n : aSample[i].n
161b0 4c 74 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72  Lt;.      iLower
161c0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   = aSample[i-1].
161d0 6e 45 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d  nEq + aSample[i-
161e0 31 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20  1].nLt;.    }.  
161f0 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64    aStat[1] = pId
16200 78 2d 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66  x->avgEq;.    if
16210 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72  ( iLower>=iUpper
16220 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
16230 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
16240 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70       iGap = iUpp
16250 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20  er - iLower;.   
16260 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64   }.    if( round
16270 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70  Up ){.      iGap
16280 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20   = (iGap*2)/3;. 
16290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
162a0 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20  iGap = iGap/3;. 
162b0 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30     }.    aStat[0
162c0 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61  ] = iLower + iGa
162d0 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
162e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
162f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
16300 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f  ABLE_STAT3 */../
16310 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
16320 6f 6e 20 70 45 78 70 72 20 72 65 70 72 65 73 65  on pExpr represe
16330 6e 74 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61  nts a literal va
16340 6c 75 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  lue, set *pp to 
16350 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73  point to.** an s
16360 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
16370 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
16380 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  g the same value
16390 2c 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a  , with affinity.
163a0 2a 2a 20 61 66 66 20 61 70 70 6c 69 65 64 20 74  ** aff applied t
163b0 6f 20 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74  o it, before ret
163c0 75 72 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68  urning. It is th
163d0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
163e0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c   of the .** call
163f0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
16400 20 72 65 6c 65 61 73 65 20 74 68 69 73 20 73 74   release this st
16410 72 75 63 74 75 72 65 20 62 79 20 70 61 73 73 69  ructure by passi
16420 6e 67 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c  ng it to .** sql
16430 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e  ite3ValueFree().
16440 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
16450 72 72 65 6e 74 20 70 61 72 73 65 20 69 73 20 61  rrent parse is a
16460 20 72 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69   recompile (sqli
16470 74 65 33 52 65 70 72 65 70 61 72 65 28 29 29 20  te3Reprepare()) 
16480 61 6e 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20  and pExpr.** is 
16490 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  an SQL variable 
164a0 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68  that currently h
164b0 61 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  as a non-NULL va
164c0 6c 75 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c  lue bound to it,
164d0 0a 2a 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71  .** create an sq
164e0 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
164f0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
16500 20 74 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61   this value, aga
16510 69 6e 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e  in with.** affin
16520 69 74 79 20 61 66 66 20 61 70 70 6c 69 65 64 20  ity aff applied 
16530 74 6f 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a  to it, instead..
16540 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72  **.** If neither
16550 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 70   of the above ap
16560 70 6c 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ply, set *pp to 
16570 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
16580 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
16590 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
165a0 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
165b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23   SQLITE_OK..*/.#
165c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
165d0 42 4c 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63  BLE_STAT3.static
165e0 20 69 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78   int valueFromEx
165f0 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
16600 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  rse, .  Expr *pE
16610 78 70 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20  xpr, .  u8 aff, 
16620 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
16630 20 2a 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70   **pp.){.  if( p
16640 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  Expr->op==TK_VAR
16650 49 41 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78  IABLE.   || (pEx
16660 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
16670 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  TER && pExpr->op
16680 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a  2==TK_VARIABLE).
16690 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61    ){.    int iVa
166a0 72 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  r = pExpr->iColu
166b0 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  mn;.    sqlite3V
166c0 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50  dbeSetVarmask(pP
166d0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61  arse->pVdbe, iVa
166e0 72 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71  r);.    *pp = sq
166f0 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75  lite3VdbeGetValu
16700 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65  e(pParse->pRepre
16710 70 61 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29  pare, iVar, aff)
16720 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16730 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
16740 74 75 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75  turn sqlite3Valu
16750 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
16760 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c  ->db, pExpr, SQL
16770 49 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70  ITE_UTF8, aff, p
16780 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  p);.}.#endif../*
16790 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
167a0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74  n is used to est
167b0 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
167c0 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
167d0 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a  ll be visited.**
167e0 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20   by scanning an 
167f0 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67  index for a rang
16800 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65  e of values. The
16810 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20   range may have 
16820 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e  an upper.** boun
16830 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64  d, a lower bound
16840 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57  , or both. The W
16850 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
16860 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75  s that set the u
16870 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65  pper.** and lowe
16880 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70  r bounds are rep
16890 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77  resented by pLow
168a0 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
168b0 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a  spectively. For.
168c0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  ** example, assu
168d0 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20  ming that index 
168e0 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a  p is on t1(a):.*
168f0 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
16900 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
16910 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20  ND a < ? ....** 
16920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16930 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f     |_____|   |__
16940 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___|.**         
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
16960 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65   pLower    pUppe
16990 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  r.**.** If eithe
169a0 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f  r of the upper o
169b0 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73  r lower bound is
169c0 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68   not present, th
169d0 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65  en NULL is passe
169e0 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66  d in.** place of
169f0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
16a00 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a  ng WhereTerm..**
16a10 0a 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61  .** The nEq para
16a20 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20  meter is passed 
16a30 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
16a40 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75   index column su
16a50 62 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20  bject to the.** 
16a60 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
16a70 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74  . Or, equivalent
16a80 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ly, the number o
16a90 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  f equality const
16aa0 72 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69  raints.** optimi
16ab0 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f  zed by the propo
16ac0 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20  sed index scan. 
16ad0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  For example, ass
16ae0 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73  uming index p is
16af0 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c  .** on t1(a, b),
16b00 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65   and the SQL que
16b10 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
16b20 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
16b30 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f   a = ? AND b > ?
16b40 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND b < ? ....*
16b50 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68  *.** then nEq sh
16b60 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74  ould be passed t
16b70 68 65 20 76 61 6c 75 65 20 31 20 28 61 73 20 74  he value 1 (as t
16b80 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63  he range restric
16b90 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62  ted column,.** b
16ba0 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  , is the second 
16bb0 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
16bc0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20   of the index). 
16bd0 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  Or, if the query
16be0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
16bf0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
16c00 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
16c10 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
16c20 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  q should be pass
16c30 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ed 0..**.** The 
16c40 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
16c50 73 20 61 6e 20 69 6e 74 65 67 65 72 20 64 69 76  s an integer div
16c60 69 73 6f 72 20 74 6f 20 72 65 64 75 63 65 20 74  isor to reduce t
16c70 68 65 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20  he estimated.** 
16c80 73 65 61 72 63 68 20 73 70 61 63 65 2e 20 20 41  search space.  A
16c90 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
16ca0 20 31 20 6d 65 61 6e 73 20 74 68 61 74 20 72 61   1 means that ra
16cb0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
16cc0 61 72 65 0a 2a 2a 20 6e 6f 20 68 65 6c 70 20 61  are.** no help a
16cd0 74 20 61 6c 6c 2e 20 20 41 20 72 65 74 75 72 6e  t all.  A return
16ce0 20 76 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e   value of 2 mean
16cf0 73 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  s range constrai
16d00 6e 74 73 20 61 72 65 0a 2a 2a 20 65 78 70 65 63  nts are.** expec
16d10 74 65 64 20 74 6f 20 72 65 64 75 63 65 20 74 68  ted to reduce th
16d20 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62  e search space b
16d30 79 20 68 61 6c 66 2e 20 20 41 6e 64 20 73 6f 20  y half.  And so 
16d40 66 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49  forth....**.** I
16d50 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
16d60 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e   sqlite_stat3 AN
16d70 41 4c 59 5a 45 20 64 61 74 61 2c 20 65 61 63 68  ALYZE data, each
16d80 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
16d90 79 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65  y.** reduces the
16da0 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
16db0 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20   a factor of 4. 
16dc0 20 48 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20   Hence a single 
16dd0 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29  constraint (x>?)
16de0 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61  .** results in a
16df0 20 72 65 74 75 72 6e 20 6f 66 20 34 20 61 6e 64   return of 4 and
16e00 20 61 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61   a range constra
16e10 69 6e 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f  int (x>? AND x<?
16e20 29 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20  ) results.** in 
16e30 61 20 72 65 74 75 72 6e 20 6f 66 20 31 36 2e 0a  a return of 16..
16e40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
16e50 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
16e60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16e70 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
16e80 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
16e90 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
16ea0 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20    Index *p,     
16eb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
16ec0 64 65 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  dex containing t
16ed0 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65  he range-compare
16ee0 64 20 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f  d column; "x" */
16ef0 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20  .  int nEq,     
16f00 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78          /* index
16f10 20 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20   into p->aCol[] 
16f20 6f 66 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d  of the range-com
16f30 70 61 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  pared column */.
16f40 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
16f50 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
16f60 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
16f70 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
16f80 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
16f90 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
16fa0 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
16fb0 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
16fc0 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
16fd0 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
16fe0 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 52 61 6e  /.  double *pRan
16ff0 67 65 44 69 76 20 20 20 2f 2a 20 4f 55 54 3a 20  geDiv   /* OUT: 
17000 52 65 64 75 63 65 20 73 65 61 72 63 68 20 73 70  Reduce search sp
17010 61 63 65 20 62 79 20 74 68 69 73 20 64 69 76 69  ace by this divi
17020 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  sor */.){.  int 
17030 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17040 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17050 4e 41 42 4c 45 5f 53 54 41 54 33 0a 0a 20 20 69  NABLE_STAT3..  i
17060 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e  f( nEq==0 && p->
17070 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73  nSample ){.    s
17080 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
17090 61 6e 67 65 56 61 6c 3b 0a 20 20 20 20 74 52 6f  angeVal;.    tRo
170a0 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b  wcnt iLower = 0;
170b0 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70  .    tRowcnt iUp
170c0 70 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  per = p->aiRowEs
170d0 74 5b 30 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e  t[0];.    tRowcn
170e0 74 20 61 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61  t a[2];.    u8 a
170f0 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
17100 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
17110 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a  [0]].affinity;..
17120 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29      if( pLower )
17130 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
17140 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45  xpr = pLower->pE
17150 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
17160 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f     rc = valueFro
17170 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  mExpr(pParse, pE
17180 78 70 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67  xpr, aff, &pRang
17190 65 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  eVal);.      ass
171a0 65 72 74 28 20 70 4c 6f 77 65 72 2d 3e 65 4f 70  ert( pLower->eOp
171b0 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 20 7c 7c  erator==WO_GT ||
171c0 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74   pLower->eOperat
171d0 6f 72 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 20  or==WO_GE );.   
171e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
171f0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77  E_OK.       && w
17200 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
17210 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61  rse, p, pRangeVa
17220 6c 2c 20 30 2c 20 61 29 3d 3d 53 51 4c 49 54 45  l, 0, a)==SQLITE
17230 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  _OK.      ){.   
17240 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
17250 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
17260 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
17270 72 3d 3d 57 4f 5f 47 54 20 29 20 69 4c 6f 77 65  r==WO_GT ) iLowe
17280 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20  r += a[1];.     
17290 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
172a0 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65  ValueFree(pRange
172b0 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
172c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
172d0 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20  K && pUpper ){. 
172e0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
172f0 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
17300 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
17310 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
17320 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
17330 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61  , aff, &pRangeVa
17340 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
17350 28 20 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ( pUpper->eOpera
17360 74 6f 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55  tor==WO_LT || pU
17370 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  pper->eOperator=
17380 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =WO_LE );.      
17390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
173a0 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72  K.       && wher
173b0 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
173c0 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20  , p, pRangeVal, 
173d0 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, a)==SQLITE_OK
173e0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
173f0 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b    iUpper = a[0];
17400 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 55 70  .        if( pUp
17410 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  per->eOperator==
17420 57 4f 5f 4c 45 20 29 20 69 55 70 70 65 72 20 2b  WO_LE ) iUpper +
17430 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  = a[1];.      }.
17440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
17450 75 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c  ueFree(pRangeVal
17460 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
17470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17480 7b 0a 20 20 20 20 20 20 69 66 28 20 69 55 70 70  {.      if( iUpp
17490 65 72 3c 3d 69 4c 6f 77 65 72 20 29 7b 0a 20 20  er<=iLower ){.  
174a0 20 20 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76        *pRangeDiv
174b0 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69   = (double)p->ai
174c0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20  RowEst[0];.     
174d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
174e0 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f  *pRangeDiv = (do
174f0 75 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74  uble)p->aiRowEst
17500 5b 30 5d 2f 28 64 6f 75 62 6c 65 29 28 69 55 70  [0]/(double)(iUp
17510 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20  per - iLower);. 
17520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45       }.      WHE
17530 52 45 54 52 41 43 45 28 28 22 72 61 6e 67 65 20  RETRACE(("range 
17540 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75  scan regions: %u
17550 2e 2e 25 75 20 20 64 69 76 3d 25 67 5c 6e 22 2c  ..%u  div=%g\n",
17560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17570 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20     (u32)iLower, 
17580 28 75 33 32 29 69 55 70 70 65 72 2c 20 2a 70 52  (u32)iUpper, *pR
17590 61 6e 67 65 44 69 76 29 29 3b 0a 20 20 20 20 20  angeDiv));.     
175a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
175b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  K;.    }.  }.#el
175c0 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
175d0 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20  METER(pParse);. 
175e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
175f0 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  R(p);.  UNUSED_P
17600 41 52 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23  ARAMETER(nEq);.#
17610 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
17620 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
17630 20 29 3b 0a 20 20 2a 70 52 61 6e 67 65 44 69 76   );.  *pRangeDiv
17640 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20   = (double)1;.  
17650 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 28 70  if( pLower && (p
17660 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67 73 20 26  Lower->wtFlags &
17670 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
17680 29 20 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d 20  ) *pRangeDiv *= 
17690 28 64 6f 75 62 6c 65 29 34 3b 0a 20 20 69 66 28  (double)4;.  if(
176a0 20 70 55 70 70 65 72 20 29 20 2a 70 52 61 6e 67   pUpper ) *pRang
176b0 65 44 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29  eDiv *= (double)
176c0 34 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  4;.  return rc;.
176d0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
176e0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a  _ENABLE_STAT3./*
176f0 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
17700 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
17710 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
17720 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
17730 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f  * an equality co
17740 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45  nstraint x=VALUE
17750 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20   and where that 
17760 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a  VALUE occurs in.
17770 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d  ** the histogram
17780 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c   data.  This onl
17790 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69  y works when x i
177a0 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a  s the left-most.
177b0 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20  ** column of an 
177c0 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65  index and sqlite
177d0 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d  _stat3 histogram
177e0 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
177f0 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69  le.** for that i
17800 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70  ndex.  When pExp
17810 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  r==NULL that mea
17820 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  ns the constrain
17830 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55  t is.** "x IS NU
17840 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  LL" instead of "
17850 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20  x=VALUE"..**.** 
17860 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61  Write the estima
17870 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e  ted row count in
17880 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65  to *pnRow and re
17890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
178a0 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  .** If unable to
178b0 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74   make an estimat
178c0 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20  e, leave *pnRow 
178d0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65  unchanged and re
178e0 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
178f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
17900 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66  tine can fail if
17910 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f   it is unable to
17920 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e   load a collatin
17930 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65  g sequence.** re
17940 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e  quired for strin
17950 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72  g comparison, or
17960 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c   if unable to al
17970 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a  locate memory.**
17980 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65   for a UTF conve
17990 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  rsion required f
179a0 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  or comparison.  
179b0 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f  The error is sto
179c0 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  red.** in the pP
179d0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
179e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
179f0 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
17a00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17a10 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
17a20 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
17a30 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
17a40 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20    Index *p,     
17a50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
17a60 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d  dex whose left-m
17a70 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54  ost column is pT
17a80 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  erm */.  Expr *p
17a90 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  Expr,         /*
17aa0 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
17ab0 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56  VALUE in the x=V
17ac0 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  ALUE constraint 
17ad0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52  */.  double *pnR
17ae0 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ow        /* Wri
17af0 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
17b00 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
17b10 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
17b20 5f 76 61 6c 75 65 20 2a 70 52 68 73 20 3d 20 30  _value *pRhs = 0
17b30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f 6e 20 72  ;  /* VALUE on r
17b40 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
17b50 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20 75 38 20  f pTerm */.  u8 
17b60 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
17b70 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
17b80 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69   affinity */.  i
17b90 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
17ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66           /* Subf
17bb0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
17bc0 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
17bd0 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20   a[2];          
17be0 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73     /* Statistics
17bf0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
17c00 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
17c10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61    assert( p->nSa
17c20 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 66 66 20  mple>0 );.  aff 
17c30 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  = p->pTable->aCo
17c40 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  l[p->aiColumn[0]
17c50 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
17c60 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 72  ( pExpr ){.    r
17c70 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  c = valueFromExp
17c80 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
17c90 20 61 66 66 2c 20 26 70 52 68 73 29 3b 0a 20 20   aff, &pRhs);.  
17ca0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
17cb0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
17cc0 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73  t_cancel;.  }els
17cd0 65 7b 0a 20 20 20 20 70 52 68 73 20 3d 20 73 71  e{.    pRhs = sq
17ce0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 70 50  lite3ValueNew(pP
17cf0 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  arse->db);.  }. 
17d00 20 69 66 28 20 70 52 68 73 3d 3d 30 20 29 20 72   if( pRhs==0 ) r
17d10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
17d20 46 4f 55 4e 44 3b 0a 20 20 72 63 20 3d 20 77 68  FOUND;.  rc = wh
17d30 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
17d40 73 65 2c 20 70 2c 20 70 52 68 73 2c 20 30 2c 20  se, p, pRhs, 0, 
17d50 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  a);.  if( rc==SQ
17d60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 57  LITE_OK ){.    W
17d70 48 45 52 45 54 52 41 43 45 28 28 22 65 71 75 61  HERETRACE(("equa
17d80 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
17d90 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61  s: %d\n", (int)a
17da0 5b 31 5d 29 29 3b 0a 20 20 20 20 2a 70 6e 52 6f  [1]));.    *pnRo
17db0 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68  w = a[1];.  }.wh
17dc0 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f  ereEqualScanEst_
17dd0 63 61 6e 63 65 6c 3a 0a 20 20 73 71 6c 69 74 65  cancel:.  sqlite
17de0 33 56 61 6c 75 65 46 72 65 65 28 70 52 68 73 29  3ValueFree(pRhs)
17df0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17e00 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
17e10 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
17e20 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 23 69 66 64  _STAT3) */..#ifd
17e30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17e40 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT3./*.** Est
17e50 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
17e60 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
17e70 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
17e80 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e  ased on.** an IN
17e90 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72   constraint wher
17ea0 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
17eb0 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
17ec0 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61  operator.** is a
17ed0 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e   list of values.
17ee0 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
17ef0 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20          WHERE x 
17f00 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a  IN (1,2,3,4).**.
17f10 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
17f20 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
17f30 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
17f40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17f50 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
17f60 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
17f70 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
17f80 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
17f90 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
17fa0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
17fb0 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
17fc0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
17fd0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
17fe0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
17ff0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
18000 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
18010 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
18020 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
18030 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
18040 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
18050 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
18060 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
18070 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
18080 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
18090 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
180a0 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
180b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
180c0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
180d0 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
180e0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
180f0 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20    Index *p,     
18100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
18110 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d  dex whose left-m
18120 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54  ost column is pT
18130 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  erm */.  ExprLis
18140 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
18150 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20   The value list 
18160 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78  on the RHS of "x
18170 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e   IN (v1,v2,v3,..
18180 2e 29 22 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  .)" */.  double 
18190 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a  *pnRow        /*
181a0 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
181b0 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
181c0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
181d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
181e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66           /* Subf
181f0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
18200 6f 64 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ode */.  double 
18210 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  nEst;           
18220 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18230 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e  f rows for a sin
18240 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 64 6f  gle term */.  do
18250 75 62 6c 65 20 6e 52 6f 77 45 73 74 20 3d 20 28  uble nRowEst = (
18260 64 6f 75 62 6c 65 29 30 3b 20 2f 2a 20 4e 65 77  double)0; /* New
18270 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
18280 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
18290 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
182c0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
182d0 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
182e0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
182f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
18300 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
18310 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e  {.    nEst = p->
18320 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
18330 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
18340 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
18350 70 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  p, pList->a[i].p
18360 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20  Expr, &nEst);.  
18370 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73    nRowEst += nEs
18380 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  t;.  }.  if( rc=
18390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
183a0 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20    if( nRowEst > 
183b0 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29  p->aiRowEst[0] )
183c0 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69   nRowEst = p->ai
183d0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a  RowEst[0];.    *
183e0 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
183f0 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
18400 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74  ("IN row estimat
18410 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52  e: est=%g\n", nR
18420 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 72  owEst));.  }.  r
18430 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
18440 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
18450 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
18460 33 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  3) */../*.** Che
18470 63 6b 20 74 6f 20 73 65 65 20 69 66 20 63 6f 6c  ck to see if col
18480 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 74 68 65 20  umn iCol of the 
18490 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
184a0 72 20 69 54 61 62 20 77 69 6c 6c 20 61 70 70 65  r iTab will appe
184b0 61 72 0a 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20  ar.** in sorted 
184c0 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
184d0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 71  to the current q
184e0 75 65 72 79 20 70 6c 61 6e 2e 20 20 52 65 74 75  uery plan.  Retu
184f0 72 6e 20 74 72 75 65 20 69 66 0a 2a 2a 20 69 74  rn true if.** it
18500 20 77 69 6c 6c 20 61 6e 64 20 66 61 6c 73 65 20   will and false 
18510 69 66 20 6e 6f 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  if not.  .**.** 
18520 49 66 20 2a 70 62 52 65 76 20 69 73 20 69 6e 69  If *pbRev is ini
18530 74 69 61 6c 6c 79 20 32 20 28 6d 65 61 6e 69 6e  tially 2 (meanin
18540 67 20 22 75 6e 6b 6e 6f 77 6e 22 29 20 74 68 65  g "unknown") the
18550 6e 20 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20  n set *pbRev to 
18560 74 68 65 0a 2a 2a 20 73 6f 72 74 20 6f 72 64 65  the.** sort orde
18570 72 20 6f 66 20 69 54 61 62 2e 69 43 6f 6c 2e 20  r of iTab.iCol. 
18580 20 49 66 20 2a 70 62 52 65 76 20 69 73 20 30 20   If *pbRev is 0 
18590 6f 72 20 31 20 62 75 74 20 64 6f 65 73 20 6e 6f  or 1 but does no
185a0 74 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 73  t match.** the s
185b0 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 69 54 61  ort order of iTa
185c0 62 2e 69 43 6f 6c 2c 20 74 68 65 6e 20 63 6f 6e  b.iCol, then con
185d0 73 69 64 65 72 20 74 68 65 20 63 6f 6c 75 6d 6e  sider the column
185e0 20 74 6f 20 62 65 20 75 6e 6f 72 64 65 72 65 64   to be unordered
185f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18600 69 73 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28  isOrderedColumn(
18610 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 2c  WhereBestIdx *p,
18620 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69   int iTab, int i
18630 43 6f 6c 2c 20 69 6e 74 20 2a 70 62 52 65 76 29  Col, int *pbRev)
18640 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
18650 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
18660 65 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b  el = &p->aLevel[
18670 70 2d 3e 69 2d 31 5d 3b 0a 20 20 49 6e 64 65 78  p->i-1];.  Index
18680 20 2a 70 49 64 78 3b 0a 20 20 75 38 20 73 6f 72   *pIdx;.  u8 sor
18690 74 4f 72 64 65 72 3b 0a 20 20 66 6f 72 28 69 3d  tOrder;.  for(i=
186a0 70 2d 3e 69 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  p->i-1; i>=0; i-
186b0 2d 2c 20 70 4c 65 76 65 6c 2d 2d 29 7b 0a 20 20  -, pLevel--){.  
186c0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 54    if( pLevel->iT
186d0 61 62 43 75 72 21 3d 69 54 61 62 20 29 20 63 6f  abCur!=iTab ) co
186e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
186f0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
18700 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c  Flags & WHERE_AL
18710 4c 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a  L_UNIQUE)!=0 ){.
18720 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
18730 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
18740 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
18750 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
18760 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  XED)!=0 ){.     
18770 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
18780 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20  plan.u.pIdx;.   
18790 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
187a0 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 72 64  .        sortOrd
187b0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
187c0 74 65 73 74 63 61 73 65 28 20 28 70 4c 65 76 65  testcase( (pLeve
187d0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
187e0 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
187f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  !=0 );.      }el
18800 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
18810 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
18820 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
18830 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d        if( iCol==
18840 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
18850 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
18860 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
18870 20 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   j>=pIdx->nColum
18880 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
18890 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
188a0 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
188b0 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 74  er[j];.        t
188c0 65 73 74 63 61 73 65 28 20 28 70 4c 65 76 65 6c  estcase( (pLevel
188d0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
188e0 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21   WHERE_REVERSE)!
188f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
18900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
18910 66 28 20 69 43 6f 6c 21 3d 28 2d 31 29 20 29 20  f( iCol!=(-1) ) 
18920 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
18930 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  sortOrder = 0;. 
18940 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
18950 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
18960 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56  lags & WHERE_REV
18970 45 52 53 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  ERSE)!=0 );.    
18980 7d 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  }.    if( (pLeve
18990 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
189a0 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
189b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
189c0 65 72 74 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d  ert( sortOrder==
189d0 30 20 7c 7c 20 73 6f 72 74 4f 72 64 65 72 3d 3d  0 || sortOrder==
189e0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
189f0 61 73 65 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d  ase( sortOrder==
18a00 31 20 29 3b 0a 20 20 20 20 20 20 73 6f 72 74 4f  1 );.      sortO
18a10 72 64 65 72 20 3d 20 31 20 2d 20 73 6f 72 74 4f  rder = 1 - sortO
18a20 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rder;.    }.    
18a30 69 66 28 20 2a 70 62 52 65 76 3d 3d 32 20 29 7b  if( *pbRev==2 ){
18a40 0a 20 20 20 20 20 20 2a 70 62 52 65 76 20 3d 20  .      *pbRev = 
18a50 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
18a60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
18a70 0a 20 20 20 20 72 65 74 75 72 6e 20 28 2a 70 62  .    return (*pb
18a80 52 65 76 3d 3d 73 6f 72 74 4f 72 64 65 72 29 3b  Rev==sortOrder);
18a90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
18aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 54 65 72 6d 20  .}../*.** pTerm 
18ab0 69 73 20 61 6e 20 3d 3d 20 63 6f 6e 73 74 72 61  is an == constra
18ac0 69 6e 74 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  int.  Check to s
18ad0 65 65 20 69 66 20 74 68 65 20 6f 74 68 65 72 20  ee if the other 
18ae0 73 69 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 3d  side of.** the =
18af0 3d 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  = is a constant 
18b00 6f 72 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  or a value that 
18b10 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
18b20 20 62 65 20 6f 72 64 65 72 65 64 0a 2a 2a 20 62   be ordered.** b
18b30 79 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 20 20  y outer loops.  
18b40 52 65 74 75 72 6e 20 31 20 69 66 20 70 54 65 72  Return 1 if pTer
18b50 6d 20 69 73 20 6f 72 64 65 72 65 64 2c 20 61 6e  m is ordered, an
18b60 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  d 0 if not..*/.s
18b70 74 61 74 69 63 20 69 6e 74 20 69 73 4f 72 64 65  tatic int isOrde
18b80 72 65 64 54 65 72 6d 28 57 68 65 72 65 42 65 73  redTerm(WhereBes
18b90 74 49 64 78 20 2a 70 2c 20 57 68 65 72 65 54 65  tIdx *p, WhereTe
18ba0 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 2a  rm *pTerm, int *
18bb0 70 62 52 65 76 29 7b 0a 20 20 45 78 70 72 20 2a  pbRev){.  Expr *
18bc0 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
18bd0 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
18be0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
18bf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
18c00 78 70 72 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26  xpr->pLeft!=0 &&
18c10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f   pExpr->pLeft->o
18c20 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
18c30 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
18c40 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
18c50 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
18c60 71 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20  qRight==0 ){.   
18c70 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 52   return 1;  /* R
18c80 48 53 20 6f 66 20 74 68 65 20 3d 3d 20 69 73 20  HS of the == is 
18c90 61 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  a constant */.  
18ca0 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  }.  if( pExpr->p
18cb0 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
18cc0 4c 55 4d 4e 20 0a 20 20 20 26 26 20 69 73 4f 72  LUMN .   && isOr
18cd0 64 65 72 65 64 43 6f 6c 75 6d 6e 28 70 2c 20 70  deredColumn(p, p
18ce0 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 69 54  Expr->pRight->iT
18cf0 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  able, pExpr->pRi
18d00 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 62  ght->iColumn, pb
18d10 52 65 76 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  Rev).  ){.    re
18d20 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
18d30 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70  * If we cannot p
18d40 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f  rove that the co
18d50 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 72 64 65  nstraint is orde
18d60 72 65 64 2c 20 61 73 73 75 6d 65 20 69 74 20 69  red, assume it i
18d70 73 20 6e 6f 74 20 2a 2f 0a 20 20 72 65 74 75 72  s not */.  retur
18d80 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
18d90 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64  is routine decid
18da0 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62  es if pIdx can b
18db0 65 20 75 73 65 64 20 74 6f 20 73 61 74 69 73 66  e used to satisf
18dc0 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  y the ORDER BY.*
18dd0 2a 20 63 6c 61 75 73 65 2c 20 65 69 74 68 65 72  * clause, either
18de0 20 69 6e 20 77 68 6f 6c 65 20 6f 72 20 69 6e 20   in whole or in 
18df0 70 61 72 74 2e 20 20 54 68 65 20 72 65 74 75 72  part.  The retur
18e00 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 0a  n value is the .
18e10 2a 2a 20 63 75 6d 75 6c 61 74 69 76 65 20 6e 75  ** cumulative nu
18e20 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18e30 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18e40 61 75 73 65 20 74 68 61 74 20 61 72 65 20 73 61  ause that are sa
18e50 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 74 68  tisfied.** by th
18e60 65 20 69 6e 64 65 78 20 70 49 64 78 20 61 6e 64  e index pIdx and
18e70 20 6f 74 68 65 72 20 69 6e 64 69 63 65 73 20 69   other indices i
18e80 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 0a 2a  n outer loops..*
18e90 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62  *.** The table b
18ea0 65 69 6e 67 20 71 75 65 72 69 65 64 20 68 61 73  eing queried has
18eb0 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72   a cursor number
18ec0 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49 64   of "base".  pId
18ed0 78 20 69 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  x is the.** inde
18ee0 78 20 74 68 61 74 20 69 73 20 70 6f 73 74 75 6c  x that is postul
18ef0 61 74 65 64 20 66 6f 72 20 75 73 65 20 74 6f 20  ated for use to 
18f00 61 63 63 65 73 73 20 74 68 65 20 74 61 62 6c 65  access the table
18f10 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69  ..**.** nEqCol i
18f20 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
18f30 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20  columns of pIdx 
18f40 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73  that are used as
18f50 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e   equality.** con
18f60 73 74 72 61 69 6e 74 73 20 61 6e 64 20 77 68 65  straints and whe
18f70 72 65 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  re the other sid
18f80 65 20 6f 66 20 74 68 65 20 3d 3d 20 69 73 20 61  e of the == is a
18f90 6e 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e  n ordered column
18fa0 0a 2a 2a 20 6f 72 20 63 6f 6e 73 74 61 6e 74 2e  .** or constant.
18fb0 20 20 41 6e 20 22 6f 72 64 65 72 20 63 6f 6c 75    An "order colu
18fc0 6d 6e 22 20 69 6e 20 74 68 65 20 70 72 65 76 69  mn" in the previ
18fd0 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 6d 65 61  ous sentence mea
18fe0 6e 73 20 61 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69  ns a column.** i
18ff0 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 61 6e 20  n table from an 
19000 6f 75 74 65 72 20 6c 6f 6f 70 20 77 68 6f 73 65  outer loop whose
19010 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 61 6c 77   values will alw
19020 61 79 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ays appear in th
19030 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 20 6f 72  e .** correct or
19040 64 65 72 20 64 75 65 20 74 6f 20 6f 74 68 72 65  der due to othre
19050 20 69 6e 64 65 78 2c 20 6f 72 20 62 65 63 61 75   index, or becau
19060 73 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  se the outer loo
19070 70 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61  p generates.** a
19080 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 2e 20   unique result. 
19090 20 41 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73   Any of the firs
190a0 74 20 6e 45 71 43 6f 6c 20 63 6f 6c 75 6d 6e 73  t nEqCol columns
190b0 20 6f 66 20 70 49 64 78 20 6d 61 79 20 62 65 20   of pIdx may be 
190c0 6d 69 73 73 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20  missing.** from 
190d0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
190e0 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61 74 63  use and the matc
190f0 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 61  h can still be a
19100 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
19110 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c 75 65  The *pbRev value
19120 20 69 73 20 73 65 74 20 74 6f 20 30 20 6f 72 64   is set to 0 ord
19130 65 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f  er 1 depending o
19140 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
19150 0a 2a 2a 20 70 49 64 78 20 73 68 6f 75 6c 64 20  .** pIdx should 
19160 62 65 20 72 75 6e 20 69 6e 20 74 68 65 20 66 6f  be run in the fo
19170 72 77 61 72 64 20 6f 72 64 65 72 20 6f 72 20 69  rward order or i
19180 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  n reverse order.
19190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
191a0 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20  sSortingIndex(. 
191b0 20 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70   WhereBestIdx *p
191c0 2c 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64  ,    /* Best ind
191d0 65 78 20 73 65 61 72 63 68 20 63 6f 6e 74 65 78  ex search contex
191e0 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  t */.  Index *pI
191f0 64 78 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  dx,        /* Th
19200 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74  e index we are t
19210 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  esting */.  int 
19220 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
19230 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
19240 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74   for the table t
19250 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20  o be sorted */. 
19260 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20   int nEqCol,    
19270 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19280 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
19290 77 69 74 68 20 6f 72 64 65 72 65 64 20 3d 3d 20  with ordered == 
192a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
192b0 20 69 6e 74 20 77 73 46 6c 61 67 73 2c 20 20 20   int wsFlags,   
192c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
192d0 61 67 65 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20  ages flags */.  
192e0 69 6e 74 20 62 4f 75 74 65 72 52 65 76 2c 20 20  int bOuterRev,  
192f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
19300 75 74 65 72 20 6c 6f 6f 70 73 20 73 63 61 6e 20  uter loops scan 
19310 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
19320 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
19330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
19340 20 74 6f 20 31 20 66 6f 72 20 72 65 76 65 72 73   to 1 for revers
19350 65 2d 6f 72 64 65 72 20 73 63 61 6e 20 6f 66 20  e-order scan of 
19360 70 49 64 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pIdx */.){.  int
19370 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
19380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19390 6d 62 65 72 20 6f 66 20 70 49 64 78 20 74 65 72  mber of pIdx ter
193a0 6d 73 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ms used */.  int
193b0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
193c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
193d0 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
193e0 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64   terms satisfied
193f0 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
19400 64 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  der = 0;        
19410 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e      /* XOR of in
19420 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59  dex and ORDER BY
19430 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f 6e 20   sort direction 
19440 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19470 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
19480 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
19490 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b  ist_item *pTerm;
194a0 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74    /* A term of t
194b0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
194c0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
194d0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
194e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
194f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
19500 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
19510 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  = p->pParse;    
19520 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
19530 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
19540 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
19550 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
19560 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
19570 20 69 6e 74 20 6e 50 72 69 6f 72 53 61 74 3b 20   int nPriorSat; 
19580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19590 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  * ORDER BY terms
195a0 20 73 61 74 69 73 66 69 65 64 20 62 79 20 6f 75   satisfied by ou
195b0 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 69  ter loops */.  i
195c0 6e 74 20 73 65 65 6e 52 6f 77 69 64 20 3d 20 30  nt seenRowid = 0
195d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
195e0 54 72 75 65 20 69 66 20 61 6e 20 4f 52 44 45 52  True if an ORDER
195f0 20 42 59 20 72 6f 77 69 64 20 74 65 72 6d 20 69   BY rowid term i
19600 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
19610 6e 45 71 4f 6e 65 52 6f 77 3b 20 20 20 20 20 20  nEqOneRow;      
19620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 78            /* Idx
19630 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 72 65   columns that re
19640 66 20 75 6e 69 71 75 65 20 76 61 6c 75 65 73 20  f unique values 
19650 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 69 3d 3d  */..  if( p->i==
19660 30 20 29 7b 0a 20 20 20 20 6e 50 72 69 6f 72 53  0 ){.    nPriorS
19670 61 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  at = 0;.  }else{
19680 0a 20 20 20 20 6e 50 72 69 6f 72 53 61 74 20 3d  .    nPriorSat =
19690 20 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d   p->aLevel[p->i-
196a0 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a  1].plan.nOBSat;.
196b0 20 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61      if( Optimiza
196c0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
196d0 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49   SQLITE_OrderByI
196e0 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  dxJoin) ) return
196f0 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 7d 0a   nPriorSat;.  }.
19700 20 20 69 66 28 20 70 2d 3e 69 3d 3d 30 20 7c 7c    if( p->i==0 ||
19710 20 28 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69   (p->aLevel[p->i
19720 2d 31 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  -1].plan.wsFlags
19730 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49   & WHERE_ALL_UNI
19740 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  QUE)!=0 ){.    n
19750 45 71 4f 6e 65 52 6f 77 20 3d 20 6e 45 71 43 6f  EqOneRow = nEqCo
19760 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
19770 69 66 28 20 6e 45 71 43 6f 6c 3d 3d 30 20 29 20  if( nEqCol==0 ) 
19780 72 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74  return nPriorSat
19790 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20  ;.    sortOrder 
197a0 3d 20 62 4f 75 74 65 72 52 65 76 3b 0a 20 20 20  = bOuterRev;.   
197b0 20 6e 45 71 4f 6e 65 52 6f 77 20 3d 20 30 3b 0a   nEqOneRow = 0;.
197c0 20 20 7d 0a 20 20 70 4f 72 64 65 72 42 79 20 3d    }.  pOrderBy =
197d0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
197e0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
197f0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 77 73 46  !=0 );.  if( wsF
19800 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
19810 55 4d 4e 5f 49 4e 20 29 20 72 65 74 75 72 6e 20  UMN_IN ) return 
19820 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 69 66 28  nPriorSat;.  if(
19830 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
19840 64 20 29 20 72 65 74 75 72 6e 20 6e 50 72 69 6f  d ) return nPrio
19850 72 53 61 74 3b 0a 20 20 6e 54 65 72 6d 20 3d 20  rSat;.  nTerm = 
19860 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
19870 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 72 6d  .  assert( nTerm
19880 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 72 67 75  >0 );..  /* Argu
19890 6d 65 6e 74 20 70 49 64 78 20 6d 75 73 74 20 65  ment pIdx must e
198a0 69 74 68 65 72 20 70 6f 69 6e 74 20 74 6f 20 61  ither point to a
198b0 20 27 72 65 61 6c 27 20 6e 61 6d 65 64 20 69 6e   'real' named in
198c0 64 65 78 20 73 74 72 75 63 74 75 72 65 2c 20 0a  dex structure, .
198d0 20 20 2a 2a 20 6f 72 20 61 6e 20 69 6e 64 65 78    ** or an index
198e0 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63   structure alloc
198f0 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63  ated on the stac
19900 6b 20 62 79 20 62 65 73 74 42 74 72 65 65 49 6e  k by bestBtreeIn
19910 64 65 78 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65  dex() to.  ** re
19920 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69  present the rowi
19930 64 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  d index that is 
19940 70 61 72 74 20 6f 66 20 65 76 65 72 79 20 74 61  part of every ta
19950 62 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ble.  */.  asser
19960 74 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 7c  t( pIdx->zName |
19970 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  | (pIdx->nColumn
19980 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 61 69 43  ==1 && pIdx->aiC
19990 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d 31 29 20 29 3b  olumn[0]==-1) );
199a0 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65 72  ..  /* Match ter
199b0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
199c0 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e 73  BY clause agains
199d0 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a  t columns of.  *
199e0 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  * the index..  *
199f0 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
19a00 20 69 6e 64 69 63 65 73 20 68 61 76 65 20 70 49   indices have pI
19a10 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67 75  dx->nColumn regu
19a20 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73  lar columns plus
19a30 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74 69  .  ** one additi
19a40 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74  onal column cont
19a50 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64  aining the rowid
19a60 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63 6f 6c  .  The rowid col
19a70 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  umn.  ** of the 
19a80 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20 61 6c  index is also al
19a90 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20 61  lowed to match a
19aa0 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44 45 52  gainst the ORDER
19ab0 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e   BY.  ** clause.
19ac0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
19ad0 6a 3d 6e 50 72 69 6f 72 53 61 74 2c 70 54 65 72  j=nPriorSat,pTer
19ae0 6d 3d 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a  m=&pOrderBy->a[j
19af0 5d 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c  ]; j<nTerm && i<
19b00 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  =pIdx->nColumn; 
19b10 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
19b20 70 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20  pExpr;       /* 
19b30 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
19b40 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70  f the ORDER BY p
19b50 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  Term */.    Coll
19b60 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f  Seq *pColl;    /
19b70 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
19b80 73 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70  sequence of pExp
19b90 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72  r */.    int ter
19ba0 6d 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53  mSortOrder; /* S
19bb0 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68  ort order for th
19bc0 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69  is term */.    i
19bd0 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
19be0 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 6f    /* The i-th co
19bf0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
19c00 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77 69 64  x.  -1 for rowid
19c10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 6f 72   */.    int iSor
19c20 74 4f 72 64 65 72 3b 20 20 20 20 2f 2a 20 31 20  tOrder;    /* 1 
19c30 66 6f 72 20 44 45 53 43 2c 20 30 20 66 6f 72 20  for DESC, 0 for 
19c40 41 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  ASC on the i-th 
19c50 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20  index term */.  
19c60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
19c70 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  oll; /* Name of 
19c80 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
19c90 71 75 65 6e 63 65 20 66 6f 72 20 69 2d 74 68 20  quence for i-th 
19ca0 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20  index term */.. 
19cb0 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d     pExpr = pTerm
19cc0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
19cd0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
19ce0 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
19cf0 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a  iTable!=base ){.
19d00 20 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74        /* Can not
19d10 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 73 6f   use an index so
19d20 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74  rt on anything t
19d30 68 61 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c  hat is not a col
19d40 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20  umn in the.     
19d50 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61   ** left-most ta
19d60 62 6c 65 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ble of the FROM 
19d70 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
19d80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19d90 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
19da0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
19db0 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
19dc0 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
19dd0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
19de0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d  pDfltColl;.    }
19df0 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 7a  .    if( pIdx->z
19e00 4e 61 6d 65 20 26 26 20 69 3c 70 49 64 78 2d 3e  Name && i<pIdx->
19e10 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
19e20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d   iColumn = pIdx-
19e30 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
19e40 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
19e50 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  =pIdx->pTable->i
19e60 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  PKey ){.        
19e70 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
19e80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72      }.      iSor
19e90 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61  tOrder = pIdx->a
19ea0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
19eb0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78      zColl = pIdx
19ec0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
19ed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 43   }else{.      iC
19ee0 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
19ef0 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 30    iSortOrder = 0
19f00 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
19f10 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
19f20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 78 70    }.    if( pExp
19f30 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
19f40 75 6d 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  umn || sqlite3St
19f50 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
19f60 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
19f70 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66      /* Term j of
19f80 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19f90 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ause does not ma
19fa0 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20  tch column i of 
19fb0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
19fc0 20 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20     if( i<nEqCol 
19fd0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
19fe0 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
19ff0 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
1a000 69 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73  ined by == fails
1a010 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20   to match an.   
1a020 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
1a030 20 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f   term, that is O
1a040 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20  K.  Just ignore 
1a050 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  that column of t
1a060 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
1a070 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
1a080 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
1a090 65 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  e if( i==pIdx->n
1a0a0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
1a0b0 20 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d    /* Index colum
1a0c0 6e 20 69 20 69 73 20 74 68 65 20 72 6f 77 69 64  n i is the rowid
1a0d0 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 74 65 72  .  All other ter
1a0e0 6d 73 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20  ms match. */.   
1a0f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a110 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20   /* If an index 
1a120 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20  column fails to 
1a130 6d 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74  match and is not
1a140 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
1a150 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ==.        ** th
1a160 65 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  en the index can
1a170 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20  not satisfy the 
1a180 4f 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61  ORDER BY constra
1a190 69 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  int..        */.
1a1a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
1a1b0 50 72 69 6f 72 53 61 74 3b 0a 20 20 20 20 20 20  PriorSat;.      
1a1c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1a1d0 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  rt( pIdx->aSortO
1a1e0 72 64 65 72 21 3d 30 20 7c 7c 20 69 43 6f 6c 75  rder!=0 || iColu
1a1f0 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61 73  mn==-1 );.    as
1a200 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72  sert( pTerm->sor
1a210 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65  tOrder==0 || pTe
1a220 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31  rm->sortOrder==1
1a230 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a240 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  iSortOrder==0 ||
1a250 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29   iSortOrder==1 )
1a260 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72  ;.    termSortOr
1a270 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72  der = iSortOrder
1a280 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72   ^ pTerm->sortOr
1a290 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e  der;.    if( i>n
1a2a0 45 71 4f 6e 65 52 6f 77 20 29 7b 0a 20 20 20 20  EqOneRow ){.    
1a2b0 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72    if( termSortOr
1a2c0 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29  der!=sortOrder )
1a2d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  {.        /* Ind
1a2e0 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65  ices can only be
1a2f0 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44   used if all ORD
1a300 45 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74  ER BY terms past
1a310 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1a320 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1a330 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74  ints are all eit
1a340 68 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e  her DESC or ASC.
1a350 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
1a360 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1a370 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74  else{.      sort
1a380 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74  Order = termSort
1a390 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Order;.    }.   
1a3a0 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b   j++;.    pTerm+
1a3b0 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75  +;.    if( iColu
1a3c0 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 65  mn<0 ){.      se
1a3d0 65 6e 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20  enRowid = 1;.   
1a3e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a3f0 20 20 7d 0a 20 20 2a 70 62 52 65 76 20 3d 20 73    }.  *pbRev = s
1a400 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 2f 2a 20  ortOrder;..  /* 
1a410 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  If there was an 
1a420 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22  "ORDER BY rowid"
1a430 20 74 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68   term that match
1a440 65 64 2c 20 6f 72 20 69 74 20 69 73 20 6f 6e 6c  ed, or it is onl
1a450 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20  y.  ** possible 
1a460 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  for a single row
1a470 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
1a480 20 74 6f 20 6d 61 74 63 68 2c 20 74 68 65 6e 20   to match, then 
1a490 73 6b 69 70 20 6f 76 65 72 0a 20 20 2a 2a 20 61  skip over.  ** a
1a4a0 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 4f 52  ny additional OR
1a4b0 44 45 52 20 42 59 20 74 65 72 6d 73 20 64 65 61  DER BY terms dea
1a4c0 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 20 74  ling with this t
1a4d0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
1a4e0 20 73 65 65 6e 52 6f 77 69 64 20 7c 7c 0a 20 20   seenRowid ||.  
1a4f0 20 20 20 28 20 20 20 28 77 73 46 6c 61 67 73 20     (   (wsFlags 
1a500 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  & WHERE_COLUMN_N
1a510 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  ULL)==0.      &&
1a520 20 69 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i>=pIdx->nColum
1a530 6e 0a 20 20 20 20 20 20 26 26 20 69 6e 64 65 78  n.      && index
1a540 49 73 55 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 28  IsUniqueNotNull(
1a550 70 49 64 78 2c 20 6e 45 71 43 6f 6c 29 0a 20 20  pIdx, nEqCol).  
1a560 20 20 20 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a     ).  ){.    /*
1a570 20 41 64 76 61 6e 63 65 20 6a 20 6f 76 65 72 20   Advance j over 
1a580 61 64 64 69 74 69 6f 6e 61 6c 20 4f 52 44 45 52  additional ORDER
1a590 20 42 59 20 74 65 72 6d 73 20 61 73 73 6f 63 69   BY terms associ
1a5a0 61 74 65 64 20 77 69 74 68 20 62 61 73 65 20 2a  ated with base *
1a5b0 2f 0a 20 20 20 20 57 68 65 72 65 4d 61 73 6b 53  /.    WhereMaskS
1a5c0 65 74 20 2a 70 4d 53 20 3d 20 70 2d 3e 70 57 43  et *pMS = p->pWC
1a5d0 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20  ->pMaskSet;.    
1a5e0 42 69 74 6d 61 73 6b 20 6d 20 3d 20 7e 67 65 74  Bitmask m = ~get
1a5f0 4d 61 73 6b 28 70 4d 53 2c 20 62 61 73 65 29 3b  Mask(pMS, base);
1a600 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 6e 54  .    while( j<nT
1a610 65 72 6d 20 26 26 20 28 65 78 70 72 54 61 62 6c  erm && (exprTabl
1a620 65 55 73 61 67 65 28 70 4d 53 2c 20 70 4f 72 64  eUsage(pMS, pOrd
1a630 65 72 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  erBy->a[j].pExpr
1a640 29 26 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  )&m)==0 ){.     
1a650 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1a660 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
1a670 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65  *.** Find the be
1a680 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f  st query plan fo
1a690 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70 61  r accessing a pa
1a6a0 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20  rticular table. 
1a6b0 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65   Write the.** be
1a6c0 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e  st query plan an
1a6d0 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20  d its cost into 
1a6e0 74 68 65 20 70 2d 3e 63 6f 73 74 2e 0a 2a 2a 0a  the p->cost..**.
1a6f0 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f  ** The lowest co
1a700 73 74 20 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54  st plan wins.  T
1a710 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73  he cost is an es
1a720 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d  timate of the am
1a730 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61  ount of.** CPU a
1a740 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64  nd disk I/O need
1a750 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
1a760 65 20 72 65 71 75 65 73 74 65 64 20 72 65 73 75  e requested resu
1a770 6c 74 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74  lt..** Factors t
1a780 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f  hat influence co
1a790 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a  st include:.**.*
1a7a0 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69  *    *  The esti
1a7b0 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
1a7c0 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
1a7d0 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54  e retrieved.  (T
1a7e0 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65  he.**       fewe
1a7f0 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a  r the better.).*
1a800 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
1a810 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e  er or not sortin
1a820 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a  g must occur..**
1a830 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
1a840 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d  r or not there m
1a850 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20  ust be separate 
1a860 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a  lookups in the.*
1a870 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e  *       index an
1a880 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  d in the main ta
1a890 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
1a8a0 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
1a8b0 45 44 20 42 59 20 63 6c 61 75 73 65 20 28 70 53  ED BY clause (pS
1a8c0 72 63 2d 3e 70 49 6e 64 65 78 29 20 61 74 74 61  rc->pIndex) atta
1a8d0 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  ched to the tabl
1a8e0 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  e in.** the SQL 
1a8f0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
1a900 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  this function on
1a910 6c 79 20 63 6f 6e 73 69 64 65 72 73 20 70 6c 61  ly considers pla
1a920 6e 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ns using the .**
1a930 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66   named index. If
1a940 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20 69 73   no such plan is
1a950 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
1a960 20 72 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69   returned cost i
1a970 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f  s.** SQLITE_BIG_
1a980 44 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20 69  DBL. If a plan i
1a990 73 20 66 6f 75 6e 64 20 74 68 61 74 20 75 73 65  s found that use
1a9a0 73 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  s the named inde
1a9b0 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  x, .** then the 
1a9c0 63 6f 73 74 20 69 73 20 63 61 6c 63 75 6c 61 74  cost is calculat
1a9d0 65 64 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20  ed in the usual 
1a9e0 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  way..**.** If a 
1a9f0 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
1aa00 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  se (pSrc->notInd
1aa10 65 78 65 64 21 3d 30 29 20 77 61 73 20 61 74 74  exed!=0) was att
1aa20 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62  ached to the tab
1aa30 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53 45  le .** in the SE
1aa40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
1aa50 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73 20  then no indexes 
1aa60 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20  are considered. 
1aa70 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 2a 2a  However, the .**
1aa80 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 20 6d   selected plan m
1aa90 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61 64  ay still take ad
1aaa0 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 62  vantage of the b
1aab0 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20 70 72  uilt-in rowid pr
1aac0 69 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69 6e 64  imary key.** ind
1aad0 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
1aae0 69 64 20 62 65 73 74 42 74 72 65 65 49 6e 64 65  id bestBtreeInde
1aaf0 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20 2a  x(WhereBestIdx *
1ab00 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
1ab10 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
1ab20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1ab30 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
1ab40 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
1ab50 20 70 2d 3e 70 57 43 3b 20 20 2f 2a 20 54 68 65   p->pWC;  /* The
1ab60 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1ab70 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1ab80 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70  t_item *pSrc = p
1ab90 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65 20 46  ->pSrc; /* The F
1aba0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
1abb0 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
1abc0 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e  nt iCur = pSrc->
1abd0 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68  iCursor;   /* Th
1abe0 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
1abf0 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65  table to be acce
1ac00 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ssed */.  Index 
1ac10 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20  *pProbe;        
1ac20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
1ac30 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  x we are evaluat
1ac40 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ing */.  Index *
1ac50 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
1ac60 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
1ac70 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72 6f 20  pProbe, or zero 
1ac80 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20 2a 2f  for IPK index */
1ac90 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73  .  int eqTermMas
1aca0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
1acb0 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b 20 6f  * Current mask o
1acc0 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79  f valid equality
1acd0 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
1ace0 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d 61 73  int idxEqTermMas
1acf0 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  k;          /* I
1ad00 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76 61 6c  ndex mask of val
1ad10 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  id equality oper
1ad20 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64 65 78  ators */.  Index
1ad30 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
1ad40 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
1ad50 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
1ad60 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
1ad70 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  y */.  tRowcnt a
1ad80 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
1ad90 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45     /* The aiRowE
1ada0 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  st[] value for t
1adb0 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
1adc0 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b    int aiColumnPk
1add0 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a   = -1;        /*
1ade0 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76   The aColumn[] v
1adf0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
1ae00 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
1ae10 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20 20 20  wsFlagMask;     
1ae20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77          /* Allow
1ae30 65 64 20 66 6c 61 67 73 20 69 6e 20 70 2d 3e 63  ed flags in p->c
1ae40 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 20  ost.plan.wsFlag 
1ae50 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  */..  /* Initial
1ae60 69 7a 65 20 74 68 65 20 63 6f 73 74 20 74 6f 20  ize the cost to 
1ae70 61 20 77 6f 72 73 74 2d 63 61 73 65 20 76 61 6c  a worst-case val
1ae80 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ue */.  memset(&
1ae90 70 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69 7a 65  p->cost, 0, size
1aea0 6f 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a 20 20  of(p->cost));.  
1aeb0 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20  p->cost.rCost = 
1aec0 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a  SQLITE_BIG_DBL;.
1aed0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72  .  /* If the pSr
1aee0 63 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72  c table is the r
1aef0 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
1af00 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77  LEFT JOIN then w
1af10 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75  e may not.  ** u
1af20 73 65 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73  se an index to s
1af30 61 74 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63  atisfy IS NULL c
1af40 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68  onstraints on th
1af50 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  at table.  This 
1af60 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  is.  ** because 
1af70 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e  columns might en
1af80 64 20 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20  d up being NULL 
1af90 69 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65  if the table doe
1afa0 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20  s not match -.  
1afb0 2a 2a 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63  ** a circumstanc
1afc0 65 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65  e which the inde
1afd0 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73  x cannot help us
1afe0 20 64 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b   discover.  Tick
1aff0 65 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20  et #2177..  */. 
1b000 20 69 66 28 20 70 53 72 63 2d 3e 6a 6f 69 6e 74   if( pSrc->joint
1b010 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b  ype & JT_LEFT ){
1b020 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61  .    idxEqTermMa
1b030 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
1b040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1b050 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57  dxEqTermMask = W
1b060 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
1b070 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NULL;.  }..  if(
1b080 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b   pSrc->pIndex ){
1b090 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58  .    /* An INDEX
1b0a0 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65  ED BY clause spe
1b0b0 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75  cifies a particu
1b0c0 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65  lar index to use
1b0d0 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70   */.    pIdx = p
1b0e0 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
1b0f0 6e 64 65 78 3b 0a 20 20 20 20 77 73 46 6c 61 67  ndex;.    wsFlag
1b100 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52  Mask = ~(WHERE_R
1b110 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
1b120 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20  WID_RANGE);.    
1b130 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78  eqTermMask = idx
1b140 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 65  EqTermMask;.  }e
1b150 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
1b160 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20  e is no INDEXED 
1b170 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61  BY clause.  Crea
1b180 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20  te a fake Index 
1b190 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a  object in local.
1b1a0 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
1b1b0 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sPk to represent
1b1c0 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61   the rowid prima
1b1d0 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d  ry key index.  M
1b1e0 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ake this.    ** 
1b1f0 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66  fake index the f
1b200 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20  irst in a chain 
1b210 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73  of Index objects
1b220 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65   with all of the
1b230 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64   real.    ** ind
1b240 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a  ices to follow *
1b250 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69  /.    Index *pFi
1b260 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
1b270 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f        /* First o
1b280 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  f real indices o
1b290 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
1b2a0 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20     memset(&sPk, 
1b2b0 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  0, sizeof(Index)
1b2c0 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75  );.    sPk.nColu
1b2d0 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  mn = 1;.    sPk.
1b2e0 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f  aiColumn = &aiCo
1b2f0 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  lumnPk;.    sPk.
1b300 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52 6f 77  aiRowEst = aiRow
1b310 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
1b320 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
1b330 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
1b340 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
1b350 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
1b360 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  [0] = pSrc->pTab
1b370 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 61  ->nRowEst;.    a
1b380 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31  iRowEstPk[1] = 1
1b390 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20 70  ;.    pFirst = p
1b3a0 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  Src->pTab->pInde
1b3b0 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  x;.    if( pSrc-
1b3c0 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  >notIndexed==0 )
1b3d0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
1b3e0 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74  eal indices of t
1b3f0 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c  he table are onl
1b400 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20  y considered if 
1b410 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54  the.      ** NOT
1b420 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69   INDEXED qualifi
1b430 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  er is omitted fr
1b440 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  om the FROM clau
1b450 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e  se */.      sPk.
1b460 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a  pNext = pFirst;.
1b470 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65      }.    pProbe
1b480 20 3d 20 26 73 50 6b 3b 0a 20 20 20 20 77 73 46   = &sPk;.    wsF
1b490 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 0a 20 20 20  lagMask = ~(.   
1b4a0 20 20 20 20 20 57 48 45 52 45 5f 43 4f 4c 55 4d       WHERE_COLUM
1b4b0 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_IN|WHERE_COLUM
1b4c0 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_EQ|WHERE_COLUM
1b4d0 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c  N_NULL|WHERE_COL
1b4e0 55 4d 4e 5f 52 41 4e 47 45 0a 20 20 20 20 29 3b  UMN_RANGE.    );
1b4f0 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20  .    eqTermMask 
1b500 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20  = WO_EQ|WO_IN;. 
1b510 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d     pIdx = 0;.  }
1b520 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
1b530 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f   all indices loo
1b540 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73  king for the bes
1b550 74 20 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a  t one to use.  *
1b560 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65  /.  for(; pProbe
1b570 3b 20 70 49 64 78 3d 70 50 72 6f 62 65 3d 70 50  ; pIdx=pProbe=pP
1b580 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  robe->pNext){.  
1b590 20 20 63 6f 6e 73 74 20 74 52 6f 77 63 6e 74 20    const tRowcnt 
1b5a0 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45 73 74  * const aiRowEst
1b5b0 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
1b5c0 45 73 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  Est;.    double 
1b5d0 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  cost;           
1b5e0 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
1b5f0 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a  using pProbe */.
1b600 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 3b      double nRow;
1b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b620 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
1b630 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 72  ber of rows in r
1b640 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
1b650 20 64 6f 75 62 6c 65 20 6c 6f 67 31 30 4e 20 3d   double log10N =
1b660 20 28 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a 20   (double)1;  /* 
1b670 62 61 73 65 2d 31 30 20 6c 6f 67 61 72 69 74 68  base-10 logarith
1b680 6d 20 6f 66 20 6e 52 6f 77 20 28 69 6e 65 78 61  m of nRow (inexa
1b690 63 74 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ct) */.    int b
1b6a0 52 65 76 20 3d 20 32 3b 20 20 20 20 20 20 20 20  Rev = 2;        
1b6b0 20 20 20 20 20 20 20 2f 2a 20 30 3d 66 6f 72 77         /* 0=forw
1b6c0 61 72 64 20 73 63 61 6e 2e 20 20 31 3d 72 65 76  ard scan.  1=rev
1b6d0 65 72 73 65 2e 20 20 32 3d 75 6e 64 65 63 69 64  erse.  2=undecid
1b6e0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77 73  ed */.    int ws
1b6f0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 42  Flags = 0;.    B
1b700 69 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b  itmask used = 0;
1b710 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
1b720 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
1b730 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 62   are populated b
1b740 61 73 65 64 20 6f 6e 20 74 68 65 20 70 72 6f 70  ased on the prop
1b750 65 72 74 69 65 73 20 6f 66 0a 20 20 20 20 2a 2a  erties of.    **
1b760 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61   index being eva
1b770 6c 75 61 74 65 64 2e 20 54 68 65 79 20 61 72 65  luated. They are
1b780 20 74 68 65 6e 20 75 73 65 64 20 74 6f 20 64 65   then used to de
1b790 74 65 72 6d 69 6e 65 20 74 68 65 20 65 78 70 65  termine the expe
1b7a0 63 74 65 64 0a 20 20 20 20 2a 2a 20 63 6f 73 74  cted.    ** cost
1b7b0 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
1b7c0 6f 77 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  ows returned..  
1b7d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 45 71    **.    **  nEq
1b7e0 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75 6d  : .    **    Num
1b7f0 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20  ber of equality 
1b800 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20 62  terms that can b
1b810 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  e implemented us
1b820 69 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  ing the index.. 
1b830 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68 65     **    In othe
1b840 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6e 75 6d  r words, the num
1b850 62 65 72 20 6f 66 20 69 6e 69 74 69 61 6c 20 66  ber of initial f
1b860 69 65 6c 64 73 20 69 6e 20 74 68 65 20 69 6e 64  ields in the ind
1b870 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 20  ex that.    **  
1b880 20 20 61 72 65 20 75 73 65 64 20 69 6e 20 3d 3d    are used in ==
1b890 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e 55   or IN or NOT NU
1b8a0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
1b8b0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1b8c0 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
1b8d0 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20 20  *  nInMul:  .   
1b8e0 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d 6d   **    The "in-m
1b8f0 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69 73  ultiplier". This
1b900 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1b910 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65 6b  of how many seek
1b920 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20 20   operations .   
1b930 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75   **    SQLite mu
1b940 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74 68  st perform on th
1b950 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73 74  e index in quest
1b960 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ion. For example
1b970 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
1b980 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65      WHERE clause
1b990 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   is:.    **.    
1b9a0 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
1b9b0 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e 44  IN (1, 2, 3) AND
1b9c0 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29 0a   b IN (4, 5, 6).
1b9d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1b9e0 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72   SQLite must per
1b9f0 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20 6f  form 9 lookups o
1ba00 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  n an index on (a
1ba10 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c 20  , b), so nInMul 
1ba20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73 65  is .    **    se
1ba30 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74 68  t to 9. Given th
1ba40 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61 6e  e same schema an
1ba50 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  d either of the 
1ba60 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45 20  following WHERE 
1ba70 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75 73  .    **    claus
1ba80 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es:.    **.    *
1ba90 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20 3d  *      WHERE a =
1baa0 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20    1.    **      
1bab0 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20 20  WHERE a >= 2.   
1bac0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e 49   **.    **    nI
1bad0 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20 31  nMul is set to 1
1bae0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1baf0 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73     If there exis
1bb00 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d 20  ts a WHERE term 
1bb10 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 49  of the form "x I
1bb20 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2c  N (SELECT ...)",
1bb30 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20 20   then .    **   
1bb40 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
1bb50 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72 65  is assumed to re
1bb60 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f 72  turn 25 rows for
1bb70 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
1bb80 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74 65   .    **    dete
1bb90 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e 0a  rmining nInMul..
1bba0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e      **.    **  n
1bbb0 4f 72 64 65 72 65 64 3a 0a 20 20 20 20 2a 2a 20  Ordered:.    ** 
1bbc0 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66     The number of
1bbd0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20   equality terms 
1bbe0 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 72 61  that are constra
1bbf0 69 6e 74 65 64 20 62 79 20 6f 75 74 65 72 20 6c  inted by outer l
1bc00 6f 6f 70 0a 20 20 20 20 2a 2a 20 20 20 20 76 61  oop.    **    va
1bc10 72 69 61 62 6c 65 73 20 74 68 61 74 20 61 72 65  riables that are
1bc20 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 2e 0a 20   well-ordered.. 
1bc30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 49     **.    **  bI
1bc40 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a 20 20  nEst:  .    **  
1bc50 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66    Set to true if
1bc60 20 74 68 65 72 65 20 77 61 73 20 61 74 20 6c 65   there was at le
1bc70 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20 28 53  ast one "x IN (S
1bc80 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65 72 6d  ELECT ...)" term
1bc90 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20 20 20   used .    **   
1bca0 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20   in determining 
1bcb0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 49 6e  the value of nIn
1bcc0 4d 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  Mul.  Note that 
1bcd0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 20  the RHS of the. 
1bce0 20 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70 65 72     **    IN oper
1bcf0 61 74 6f 72 20 6d 75 73 74 20 62 65 20 61 20 53  ator must be a S
1bd00 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76 61 6c  ELECT, not a val
1bd10 75 65 20 6c 69 73 74 2c 20 66 6f 72 20 74 68 69  ue list, for thi
1bd20 73 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  s variable.    *
1bd30 2a 20 20 20 20 74 6f 20 62 65 20 74 72 75 65 2e  *    to be true.
1bd40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1bd50 72 61 6e 67 65 44 69 76 3a 0a 20 20 20 20 2a 2a  rangeDiv:.    **
1bd60 20 20 20 20 41 6e 20 65 73 74 69 6d 61 74 65 20      An estimate 
1bd70 6f 66 20 61 20 64 69 76 69 73 6f 72 20 62 79 20  of a divisor by 
1bd80 77 68 69 63 68 20 74 6f 20 72 65 64 75 63 65 20  which to reduce 
1bd90 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
1bda0 20 64 75 65 0a 20 20 20 20 2a 2a 20 20 20 20 74   due.    **    t
1bdb0 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
1bdc0 73 74 72 61 69 6e 74 73 2e 20 20 49 6e 20 74 68  straints.  In th
1bdd0 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c  e absence of sql
1bde0 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a  ite_stat3 ANALYZ
1bdf0 45 0a 20 20 20 20 2a 2a 20 20 20 20 64 61 74 61  E.    **    data
1be00 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65 71 75  , a single inequ
1be10 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68  ality reduces th
1be20 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 74  e search space t
1be30 6f 20 31 2f 34 72 64 20 69 74 73 0a 20 20 20 20  o 1/4rd its.    
1be40 2a 2a 20 20 20 20 6f 72 69 67 69 6e 61 6c 20 73  **    original s
1be50 69 7a 65 20 28 72 61 6e 67 65 44 69 76 3d 3d 34  ize (rangeDiv==4
1be60 29 2e 20 20 54 77 6f 20 69 6e 65 71 75 61 6c 69  ).  Two inequali
1be70 74 69 65 73 20 72 65 64 75 63 65 20 74 68 65 20  ties reduce the 
1be80 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20 20 20  search.    **   
1be90 20 73 70 61 63 65 20 74 6f 20 31 2f 31 36 74 68   space to 1/16th
1bea0 20 6f 66 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   of its original
1beb0 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69 76 3d   size (rangeDiv=
1bec0 3d 31 36 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  =16)..    **.   
1bed0 20 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20 0a 20   **  bSort:   . 
1bee0 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e     **    Boolean
1bef0 2e 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  . True if there 
1bf00 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1bf10 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c 6c 20  lause that will 
1bf20 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20 20 20  require an .    
1bf30 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c 20 73  **    external s
1bf40 6f 72 74 20 28 69 2e 65 2e 20 73 63 61 6e 6e 69  ort (i.e. scanni
1bf50 6e 67 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  ng the index bei
1bf60 6e 67 20 65 76 61 6c 75 61 74 65 64 20 77 69 6c  ng evaluated wil
1bf70 6c 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 20 20  l not .    **   
1bf80 20 63 6f 72 72 65 63 74 6c 79 20 6f 72 64 65 72   correctly order
1bf90 20 72 65 63 6f 72 64 73 29 2e 0a 20 20 20 20 2a   records)..    *
1bfa0 2a 0a 20 20 20 20 2a 2a 20 20 62 44 69 73 74 3a  *.    **  bDist:
1bfb0 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65  .    **    Boole
1bfc0 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68 65 72  an. True if ther
1bfd0 65 20 69 73 20 61 20 44 49 53 54 49 4e 43 54 20  e is a DISTINCT 
1bfe0 63 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c 6c  clause that will
1bff0 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20 20   require an .   
1c000 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c 20   **    external 
1c010 62 74 72 65 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  btree..    **.  
1c020 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a    **  bLookup: .
1c030 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61      **    Boolea
1c040 6e 2e 20 54 72 75 65 20 69 66 20 61 20 74 61 62  n. True if a tab
1c050 6c 65 20 6c 6f 6f 6b 75 70 20 69 73 20 72 65 71  le lookup is req
1c060 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 69  uired for each i
1c070 6e 64 65 78 20 65 6e 74 72 79 0a 20 20 20 20 2a  ndex entry.    *
1c080 2a 20 20 20 20 76 69 73 69 74 65 64 2e 20 20 49  *    visited.  I
1c090 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1c0a0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6e  rue if this is n
1c0b0 6f 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ot a covering in
1c0c0 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20 20 20 54  dex..    **    T
1c0d0 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 66 61  his is always fa
1c0e0 6c 73 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69  lse for the rowi
1c0f0 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  d primary key in
1c100 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  dex of a table..
1c110 20 20 20 20 2a 2a 20 20 20 20 46 6f 72 20 6f 74      **    For ot
1c120 68 65 72 20 69 6e 64 65 78 65 73 2c 20 69 74 20  her indexes, it 
1c130 69 73 20 74 72 75 65 20 75 6e 6c 65 73 73 20 61  is true unless a
1c140 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ll the columns o
1c150 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  f the table.    
1c160 2a 2a 20 20 20 20 75 73 65 64 20 62 79 20 74 68  **    used by th
1c170 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1c180 6e 74 20 61 72 65 20 70 72 65 73 65 6e 74 20 69  nt are present i
1c190 6e 20 74 68 65 20 69 6e 64 65 78 20 28 73 75 63  n the index (suc
1c1a0 68 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 69  h an.    **    i
1c1b0 6e 64 65 78 20 69 73 20 73 6f 6d 65 74 69 6d 65  ndex is sometime
1c1c0 73 20 64 65 73 63 72 69 62 65 64 20 61 73 20 61  s described as a
1c1d0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 29   covering index)
1c1e0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f 72 20  ..    **    For 
1c1f0 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e 20 74  example, given t
1c200 68 65 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20  he index on (a, 
1c210 62 29 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  b), the second o
1c220 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1c230 0a 20 20 20 20 2a 2a 20 20 20 20 74 77 6f 20 71  .    **    two q
1c240 75 65 72 69 65 73 20 72 65 71 75 69 72 65 73 20  ueries requires 
1c250 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6c 6f 6f  table b-tree loo
1c260 6b 75 70 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  kups in order to
1c270 20 66 69 6e 64 20 74 68 65 20 76 61 6c 75 65 0a   find the value.
1c280 20 20 20 20 2a 2a 20 20 20 20 6f 66 20 63 6f 6c      **    of col
1c290 75 6d 6e 20 63 2c 20 62 75 74 20 74 68 65 20 66  umn c, but the f
1c2a0 69 72 73 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  irst does not be
1c2b0 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 61 20  cause columns a 
1c2c0 61 6e 64 20 62 20 61 72 65 0a 20 20 20 20 2a 2a  and b are.    **
1c2d0 20 20 20 20 62 6f 74 68 20 61 76 61 69 6c 61 62      both availab
1c2e0 6c 65 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  le in the index.
1c2f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1c300 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43             SELEC
1c310 54 20 61 2c 20 62 20 20 20 20 46 52 4f 4d 20 74  T a, b    FROM t
1c320 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  bl WHERE a = 1;.
1c330 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1c340 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 2c 20     SELECT a, b, 
1c350 63 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45  c FROM tbl WHERE
1c360 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2f 0a 20   a = 1;.    */. 
1c370 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20     int nEq;     
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c390 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
1c3a0 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 6d 61 74   or IN terms mat
1c3b0 63 68 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ching index */. 
1c3c0 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 65 64 3b     int nOrdered;
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 72   /* Number of or
1c3f0 64 65 72 65 64 20 74 65 72 6d 73 20 6d 61 74 63  dered terms matc
1c400 68 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  hing index */.  
1c410 20 20 69 6e 74 20 62 49 6e 45 73 74 20 3d 20 30    int bInEst = 0
1c420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c430 2f 2a 20 54 72 75 65 20 69 66 20 22 78 20 49 4e  /* True if "x IN
1c440 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22 20 73 65   (SELECT...)" se
1c450 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  en */.    int nI
1c460 6e 4d 75 6c 20 3d 20 31 3b 20 20 20 20 20 20 20  nMul = 1;       
1c470 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c480 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 65 71  r of distinct eq
1c490 75 61 6c 69 74 69 65 73 20 74 6f 20 6c 6f 6f 6b  ualities to look
1c4a0 75 70 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  up */.    double
1c4b0 20 72 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75   rangeDiv = (dou
1c4c0 62 6c 65 29 31 3b 20 20 2f 2a 20 45 73 74 69 6d  ble)1;  /* Estim
1c4d0 61 74 65 64 20 72 65 64 75 63 74 69 6f 6e 20 69  ated reduction i
1c4e0 6e 20 73 65 61 72 63 68 20 73 70 61 63 65 20 2a  n search space *
1c4f0 2f 0a 20 20 20 20 69 6e 74 20 6e 42 6f 75 6e 64  /.    int nBound
1c500 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c510 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c520 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1c530 74 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69  ts seen */.    i
1c540 6e 74 20 62 53 6f 72 74 3b 20 20 20 20 20 20 20  nt bSort;       
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c560 54 72 75 65 20 69 66 20 65 78 74 65 72 6e 61 6c  True if external
1c570 20 73 6f 72 74 20 72 65 71 75 69 72 65 64 20 2a   sort required *
1c580 2f 0a 20 20 20 20 69 6e 74 20 62 44 69 73 74 3b  /.    int bDist;
1c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5a0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
1c5b0 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70  ndex cannot help
1c5c0 20 77 69 74 68 20 44 49 53 54 49 4e 43 54 20 2a   with DISTINCT *
1c5d0 2f 0a 20 20 20 20 69 6e 74 20 62 4c 6f 6f 6b 75  /.    int bLooku
1c5e0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
1c5f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
1c600 6f 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ot a covering in
1c610 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
1c620 4f 42 53 61 74 20 3d 20 30 3b 20 20 20 20 20 20  OBSat = 0;      
1c630 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c640 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  er of ORDER BY t
1c650 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 2a  erms satisfied *
1c660 2f 0a 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72  /.    int nOrder
1c670 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  By;             
1c680 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c690 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1c6a0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1c6b0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
1c6c0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1c6d0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1c6e0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66  RE clause */.#if
1c6f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1c700 45 5f 53 54 41 54 33 0a 20 20 20 20 57 68 65 72  E_STAT3.    Wher
1c710 65 54 65 72 6d 20 2a 70 46 69 72 73 74 54 65 72  eTerm *pFirstTer
1c720 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20 46 69 72  m = 0;    /* Fir
1c730 73 74 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67  st term matching
1c740 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65   the index */.#e
1c750 6e 64 69 66 0a 0a 20 20 20 20 6e 4f 72 64 65 72  ndif..    nOrder
1c760 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1c770 20 3f 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   ? p->pOrderBy->
1c780 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 62  nExpr : 0;.    b
1c790 53 6f 72 74 20 3d 20 6e 4f 72 64 65 72 42 79 3e  Sort = nOrderBy>
1c7a0 30 20 26 26 20 28 70 2d 3e 69 3d 3d 30 20 7c 7c  0 && (p->i==0 ||
1c7b0 20 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d   p->aLevel[p->i-
1c7c0 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3c 6e  1].plan.nOBSat<n
1c7d0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 62 44  OrderBy);.    bD
1c7e0 69 73 74 20 3d 20 70 2d 3e 69 3d 3d 30 20 26 26  ist = p->i==0 &&
1c7f0 20 70 2d 3e 70 44 69 73 74 69 6e 63 74 21 3d 30   p->pDistinct!=0
1c800 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  ;..    /* Determ
1c810 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ine the values o
1c820 66 20 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75 6c  f nEq and nInMul
1c830 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 45 71 3d   */.    for(nEq=
1c840 6e 4f 72 64 65 72 65 64 3d 30 3b 20 6e 45 71 3c  nOrdered=0; nEq<
1c850 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pProbe->nColumn;
1c860 20 6e 45 71 2b 2b 29 7b 0a 20 20 20 20 20 20 69   nEq++){.      i
1c870 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
1c880 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20  iColumn[nEq];.  
1c890 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
1c8a0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
1c8b0 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20  j, p->notReady, 
1c8c0 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78  eqTermMask, pIdx
1c8d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
1c8e0 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rm==0 ) break;. 
1c8f0 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1c900 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  (WHERE_COLUMN_EQ
1c910 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29  |WHERE_ROWID_EQ)
1c920 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c930 28 20 70 54 65 72 6d 2d 3e 70 57 43 21 3d 70 57  ( pTerm->pWC!=pW
1c940 43 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  C );.      if( p
1c950 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1c960 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
1c970 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
1c980 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
1c990 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
1c9a0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  = WHERE_COLUMN_I
1c9b0 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  N;.        if( E
1c9c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c9d0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1c9e0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ct) ){.         
1c9f0 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43   /* "x IN (SELEC
1ca00 54 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d 65  T ...)":  Assume
1ca10 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
1ca20 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
1ca30 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20           nInMul 
1ca40 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 20  *= 25;.         
1ca50 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20 20   bInEst = 1;.   
1ca60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
1ca70 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
1ca80 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
1ca90 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
1caa0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22  {.          /* "
1cab0 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
1cac0 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20  ue, ...)" */.   
1cad0 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d         nInMul *=
1cae0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1caf0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
1cb00 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
1cb10 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1cb20 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
1cb30 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  {.        wsFlag
1cb40 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
1cb50 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  N_NULL;.        
1cb60 69 66 28 20 6e 45 71 3d 3d 6e 4f 72 64 65 72 65  if( nEq==nOrdere
1cb70 64 20 29 20 6e 4f 72 64 65 72 65 64 2b 2b 3b 0a  d ) nOrdered++;.
1cb80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1cb90 62 53 6f 72 74 20 26 26 20 6e 45 71 3d 3d 6e 4f  bSort && nEq==nO
1cba0 72 64 65 72 65 64 20 26 26 20 69 73 4f 72 64 65  rdered && isOrde
1cbb0 72 65 64 54 65 72 6d 28 70 2c 20 70 54 65 72 6d  redTerm(p, pTerm
1cbc0 2c 20 26 62 52 65 76 29 20 29 7b 0a 20 20 20 20  , &bRev) ){.    
1cbd0 20 20 20 20 6e 4f 72 64 65 72 65 64 2b 2b 3b 0a      nOrdered++;.
1cbe0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
1cbf0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1cc00 54 33 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71  T3.      if( nEq
1cc10 3d 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61  ==0 && pProbe->a
1cc20 53 61 6d 70 6c 65 20 29 20 70 46 69 72 73 74 54  Sample ) pFirstT
1cc30 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 23 65 6e  erm = pTerm;.#en
1cc40 64 69 66 0a 20 20 20 20 20 20 75 73 65 64 20 7c  dif.      used |
1cc50 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  = pTerm->prereqR
1cc60 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  ight;.    }. .  
1cc70 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
1cc80 78 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  x being consider
1cc90 65 64 20 69 73 20 55 4e 49 51 55 45 2c 20 61 6e  ed is UNIQUE, an
1cca0 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 71  d there is an eq
1ccb0 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 63  uality .    ** c
1ccc0 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 61 6c  onstraint for al
1ccd0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  l columns in the
1cce0 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 74 68 69   index, then thi
1ccf0 73 20 73 65 61 72 63 68 20 77 69 6c 6c 20 66 69  s search will fi
1cd00 6e 64 0a 20 20 20 20 2a 2a 20 61 74 20 6d 6f 73  nd.    ** at mos
1cd10 74 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 20  t a single row. 
1cd20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 65 74  In this case set
1cd30 20 74 68 65 20 57 48 45 52 45 5f 55 4e 49 51 55   the WHERE_UNIQU
1cd40 45 20 66 6c 61 67 20 74 6f 20 0a 20 20 20 20 2a  E flag to .    *
1cd50 2a 20 69 6e 64 69 63 61 74 65 20 74 68 69 73 20  * indicate this 
1cd60 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
1cd70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68     **.    ** Oth
1cd80 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 73  erwise, if the s
1cd90 65 61 72 63 68 20 6d 61 79 20 66 69 6e 64 20 6d  earch may find m
1cda0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
1cdb0 2c 20 74 65 73 74 20 74 6f 20 73 65 65 20 69 66  , test to see if
1cdc0 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73  .    ** there is
1cdd0 20 61 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61   a range constra
1cde0 69 6e 74 20 6f 6e 20 69 6e 64 65 78 65 64 20 63  int on indexed c
1cdf0 6f 6c 75 6d 6e 20 28 6e 45 71 2b 31 29 20 74 68  olumn (nEq+1) th
1ce00 61 74 20 63 61 6e 20 62 65 20 0a 20 20 20 20 2a  at can be .    *
1ce10 2a 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  * optimized usin
1ce20 67 20 74 68 65 20 69 6e 64 65 78 2e 20 0a 20 20  g the index. .  
1ce30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71    */.    if( nEq
1ce40 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  ==pProbe->nColum
1ce50 6e 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45  n && pProbe->onE
1ce60 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
1ce70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ce80 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45   wsFlags & WHERE
1ce90 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20  _COLUMN_IN );.  
1cea0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73      testcase( ws
1ceb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
1cec0 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20  LUMN_NULL );.   
1ced0 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20     if( (wsFlags 
1cee0 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
1cef0 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
1cf00 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20 20  NULL))==0 ){.   
1cf10 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1cf20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20  WHERE_UNIQUE;.  
1cf30 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 3d 3d        if( p->i==
1cf40 30 20 7c 7c 20 28 70 2d 3e 61 4c 65 76 65 6c 5b  0 || (p->aLevel[
1cf50 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 77 73 46  p->i-1].plan.wsF
1cf60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c 4c  lags & WHERE_ALL
1cf70 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20  _UNIQUE)!=0 ){. 
1cf80 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73           wsFlags
1cf90 20 7c 3d 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e   |= WHERE_ALL_UN
1cfa0 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  IQUE;.        }.
1cfb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1cfc0 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55  e if( pProbe->bU
1cfd0 6e 6f 72 64 65 72 65 64 3d 3d 30 20 29 7b 0a 20  nordered==0 ){. 
1cfe0 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 6e 45       int j = (nE
1cff0 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q==pProbe->nColu
1d000 6d 6e 20 3f 20 2d 31 20 3a 20 70 50 72 6f 62 65  mn ? -1 : pProbe
1d010 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29  ->aiColumn[nEq])
1d020 3b 0a 20 20 20 20 20 20 69 66 28 20 66 69 6e 64  ;.      if( find
1d030 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
1d040 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20  j, p->notReady, 
1d050 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
1d060 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 20 29  T|WO_GE, pIdx) )
1d070 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  {.        WhereT
1d080 65 72 6d 20 2a 70 54 6f 70 2c 20 2a 70 42 74 6d  erm *pTop, *pBtm
1d090 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d  ;.        pTop =
1d0a0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
1d0b0 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52 65  Cur, j, p->notRe
1d0c0 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
1d0d0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
1d0e0 20 70 42 74 6d 20 3d 20 66 69 6e 64 54 65 72 6d   pBtm = findTerm
1d0f0 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70  (pWC, iCur, j, p
1d100 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47  ->notReady, WO_G
1d110 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a  T|WO_GE, pIdx);.
1d120 20 20 20 20 20 20 20 20 77 68 65 72 65 52 61 6e          whereRan
1d130 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  geScanEst(pParse
1d140 2c 20 70 50 72 6f 62 65 2c 20 6e 45 71 2c 20 70  , pProbe, nEq, p
1d150 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72 61 6e 67  Btm, pTop, &rang
1d160 65 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69  eDiv);.        i
1d170 66 28 20 70 54 6f 70 20 29 7b 0a 20 20 20 20 20  f( pTop ){.     
1d180 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d 20 31 3b       nBound = 1;
1d190 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61  .          wsFla
1d1a0 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f  gs |= WHERE_TOP_
1d1b0 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20  LIMIT;.         
1d1c0 20 75 73 65 64 20 7c 3d 20 70 54 6f 70 2d 3e 70   used |= pTop->p
1d1d0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
1d1e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d1f0 70 54 6f 70 2d 3e 70 57 43 21 3d 70 57 43 20 29  pTop->pWC!=pWC )
1d200 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d210 20 20 20 20 69 66 28 20 70 42 74 6d 20 29 7b 0a      if( pBtm ){.
1d220 20 20 20 20 20 20 20 20 20 20 6e 42 6f 75 6e 64            nBound
1d230 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 77 73  ++;.          ws
1d240 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42  Flags |= WHERE_B
1d250 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
1d260 20 20 20 20 75 73 65 64 20 7c 3d 20 70 42 74 6d      used |= pBtm
1d270 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
1d280 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1d290 65 28 20 70 42 74 6d 2d 3e 70 57 43 21 3d 70 57  e( pBtm->pWC!=pW
1d2a0 43 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  C );.        }. 
1d2b0 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
1d2c0 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  = (WHERE_COLUMN_
1d2d0 52 41 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57 49  RANGE|WHERE_ROWI
1d2e0 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 20 20  D_RANGE);.      
1d2f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1d300 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1d310 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1d320 6e 64 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  nd the index bei
1d330 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 77 69  ng considered wi
1d340 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72 61  ll.    ** natura
1d350 6c 6c 79 20 73 63 61 6e 20 72 6f 77 73 20 69 6e  lly scan rows in
1d360 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6f 72   the required or
1d370 64 65 72 2c 20 73 65 74 20 74 68 65 20 61 70 70  der, set the app
1d380 72 6f 70 72 69 61 74 65 20 66 6c 61 67 73 0a 20  ropriate flags. 
1d390 20 20 20 2a 2a 20 69 6e 20 77 73 46 6c 61 67 73     ** in wsFlags
1d3a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1d3b0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1d3c0 52 20 42 59 20 63 6c 61 75 73 65 20 62 75 74 20  R BY clause but 
1d3d0 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
1d3e0 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20   will scan rows 
1d3f0 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  in a different o
1d400 72 64 65 72 2c 20 73 65 74 20 74 68 65 20 62 53  rder, set the bS
1d410 6f 72 74 20 76 61 72 69 61 62 6c 65 2e 20 20 2a  ort variable.  *
1d420 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 52  /.    assert( bR
1d430 65 76 3e 3d 30 20 26 26 20 62 52 65 76 3c 3d 32  ev>=0 && bRev<=2
1d440 20 29 3b 0a 20 20 20 20 69 66 28 20 62 53 6f 72   );.    if( bSor
1d450 74 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  t ){.      testc
1d460 61 73 65 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a  ase( bRev==0 );.
1d470 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d480 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 20  bRev==1 );.     
1d490 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76 3d   testcase( bRev=
1d4a0 3d 32 20 29 3b 0a 20 20 20 20 20 20 6e 4f 42 53  =2 );.      nOBS
1d4b0 61 74 20 3d 20 69 73 53 6f 72 74 69 6e 67 49 6e  at = isSortingIn
1d4c0 64 65 78 28 70 2c 20 70 50 72 6f 62 65 2c 20 69  dex(p, pProbe, i
1d4d0 43 75 72 2c 20 6e 4f 72 64 65 72 65 64 2c 0a 20  Cur, nOrdered,. 
1d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 73 46               wsF
1d500 6c 61 67 73 2c 20 62 52 65 76 26 31 2c 20 26 62  lags, bRev&1, &b
1d510 52 65 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Rev);.      if( 
1d520 6e 4f 72 64 65 72 42 79 3d 3d 6e 4f 42 53 61 74  nOrderBy==nOBSat
1d530 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72   ){.        bSor
1d540 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  t = 0;.        w
1d550 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
1d560 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48 45 52  ROWID_RANGE|WHER
1d570 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
1d580 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20  HERE_ORDERBY;.  
1d590 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1d5a0 62 52 65 76 20 26 20 31 20 29 20 77 73 46 6c 61  bRev & 1 ) wsFla
1d5b0 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
1d5c0 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  RSE;.    }..    
1d5d0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1d5e0 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
1d5f0 69 65 72 20 61 6e 64 20 74 68 69 73 20 69 6e 64  ier and this ind
1d600 65 78 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77  ex will scan row
1d610 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 72 64 65  s in.    ** orde
1d620 72 20 6f 66 20 74 68 65 20 44 49 53 54 49 4e 43  r of the DISTINC
1d630 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 63  T expressions, c
1d640 6c 65 61 72 20 62 44 69 73 74 20 61 6e 64 20 73  lear bDist and s
1d650 65 74 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  et the appropria
1d660 74 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 73 20  te.    ** flags 
1d670 69 6e 20 77 73 46 6c 61 67 73 2e 20 2a 2f 0a 20  in wsFlags. */. 
1d680 20 20 20 69 66 28 20 62 44 69 73 74 0a 20 20 20     if( bDist.   
1d690 20 20 26 26 20 69 73 44 69 73 74 69 6e 63 74 49    && isDistinctI
1d6a0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
1d6b0 2c 20 70 50 72 6f 62 65 2c 20 69 43 75 72 2c 20  , pProbe, iCur, 
1d6c0 70 2d 3e 70 44 69 73 74 69 6e 63 74 2c 20 6e 45  p->pDistinct, nE
1d6d0 71 29 0a 20 20 20 20 20 26 26 20 28 77 73 46 6c  q).     && (wsFl
1d6e0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
1d6f0 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 29 7b  MN_IN)==0.    ){
1d700 0a 20 20 20 20 20 20 62 44 69 73 74 20 3d 20 30  .      bDist = 0
1d710 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20  ;.      wsFlags 
1d720 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  |= WHERE_ROWID_R
1d730 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  ANGE|WHERE_COLUM
1d740 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 44 49  N_RANGE|WHERE_DI
1d750 53 54 49 4e 43 54 3b 0a 20 20 20 20 7d 0a 0a 20  STINCT;.    }.. 
1d760 20 20 20 2f 2a 20 49 66 20 63 75 72 72 65 6e 74     /* If current
1d770 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 74  ly calculating t
1d780 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67  he cost of using
1d790 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74 20 74   an index (not t
1d7a0 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20 69 6e  he IPK.    ** in
1d7b0 64 65 78 29 2c 20 64 65 74 65 72 6d 69 6e 65 20  dex), determine 
1d7c0 69 66 20 61 6c 6c 20 72 65 71 75 69 72 65 64 20  if all required 
1d7d0 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61 79 20  column data may 
1d7e0 62 65 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68  be obtained with
1d7f0 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75 73 69 6e  out .    ** usin
1d800 67 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  g the main table
1d810 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 69 6e   (i.e. if the in
1d820 64 65 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e  dex is a coverin
1d830 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 66  g.    ** index f
1d840 6f 72 20 74 68 69 73 20 71 75 65 72 79 29 2e 20  or this query). 
1d850 49 66 20 69 74 20 69 73 2c 20 73 65 74 20 74 68  If it is, set th
1d860 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  e WHERE_IDX_ONLY
1d870 20 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a 2a 20   flag in.    ** 
1d880 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69  wsFlags. Otherwi
1d890 73 65 2c 20 73 65 74 20 74 68 65 20 62 4c 6f 6f  se, set the bLoo
1d8a0 6b 75 70 20 76 61 72 69 61 62 6c 65 20 74 6f 20  kup variable to 
1d8b0 74 72 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  true.  */.    if
1d8c0 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
1d8d0 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63  Bitmask m = pSrc
1d8e0 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
1d8f0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
1d900 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
1d910 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
1d920 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49        int x = pI
1d930 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
1d940 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 42  .        if( x<B
1d950 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  MS-1 ){.        
1d960 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61    m &= ~(((Bitma
1d970 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20  sk)1)<<x);.     
1d980 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d990 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20     if( m==0 ){. 
1d9a0 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
1d9b0 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
1d9c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d9d0 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70 20 3d         bLookup =
1d9e0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1d9f0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1da00 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
1da10 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20  mber of rows of 
1da20 6f 75 74 70 75 74 2e 20 20 46 6f 72 20 61 6e 20  output.  For an 
1da30 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e  "x IN (SELECT...
1da40 29 22 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  )".    ** constr
1da50 61 69 6e 74 2c 20 64 6f 20 6e 6f 74 20 6c 65 74  aint, do not let
1da60 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 65 78   the estimate ex
1da70 63 65 65 64 20 68 61 6c 66 20 74 68 65 20 72 6f  ceed half the ro
1da80 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
1da90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77  .    */.    nRow
1daa0 20 3d 20 28 64 6f 75 62 6c 65 29 28 61 69 52 6f   = (double)(aiRo
1dab0 77 45 73 74 5b 6e 45 71 5d 20 2a 20 6e 49 6e 4d  wEst[nEq] * nInM
1dac0 75 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e  ul);.    if( bIn
1dad0 45 73 74 20 26 26 20 6e 52 6f 77 2a 32 3e 61 69  Est && nRow*2>ai
1dae0 52 6f 77 45 73 74 5b 30 5d 20 29 7b 0a 20 20 20  RowEst[0] ){.   
1daf0 20 20 20 6e 52 6f 77 20 3d 20 61 69 52 6f 77 45     nRow = aiRowE
1db00 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20 20 20 6e  st[0]/2;.      n
1db10 49 6e 4d 75 6c 20 3d 20 28 69 6e 74 29 28 6e 52  InMul = (int)(nR
1db20 6f 77 20 2f 20 61 69 52 6f 77 45 73 74 5b 6e 45  ow / aiRowEst[nE
1db30 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  q]);.    }..#ifd
1db40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1db50 5f 53 54 41 54 33 0a 20 20 20 20 2f 2a 20 49 66  _STAT3.    /* If
1db60 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
1db70 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 78  is of the form x
1db80 3d 56 41 4c 55 45 20 6f 72 20 78 20 49 4e 20 28  =VALUE or x IN (
1db90 45 31 2c 45 32 2c 2e 2e 2e 29 0a 20 20 20 20 2a  E1,E2,...).    *
1dba0 2a 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20  * and we do not 
1dbb0 74 68 69 6e 6b 20 74 68 61 74 20 76 61 6c 75 65  think that value
1dbc0 73 20 6f 66 20 78 20 61 72 65 20 75 6e 69 71 75  s of x are uniqu
1dbd0 65 20 61 6e 64 20 69 66 20 68 69 73 74 6f 67 72  e and if histogr
1dbe0 61 6d 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69  am.    ** data i
1dbf0 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  s available for 
1dc00 63 6f 6c 75 6d 6e 20 78 2c 20 74 68 65 6e 20 69  column x, then i
1dc10 74 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69  t might be possi
1dc20 62 6c 65 0a 20 20 20 20 2a 2a 20 74 6f 20 67 65  ble.    ** to ge
1dc30 74 20 61 20 62 65 74 74 65 72 20 65 73 74 69 6d  t a better estim
1dc40 61 74 65 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  ate on the numbe
1dc50 72 20 6f 66 20 72 6f 77 73 20 62 61 73 65 64 20  r of rows based 
1dc60 6f 6e 0a 20 20 20 20 2a 2a 20 56 41 4c 55 45 20  on.    ** VALUE 
1dc70 61 6e 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74  and how common t
1dc80 68 61 74 20 76 61 6c 75 65 20 69 73 20 61 63 63  hat value is acc
1dc90 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 68 69  ording to the hi
1dca0 73 74 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a  stogram..    */.
1dcb0 20 20 20 20 69 66 28 20 6e 52 6f 77 3e 28 64 6f      if( nRow>(do
1dcc0 75 62 6c 65 29 31 20 26 26 20 6e 45 71 3d 3d 31  uble)1 && nEq==1
1dcd0 20 26 26 20 70 46 69 72 73 74 54 65 72 6d 21 3d   && pFirstTerm!=
1dce0 30 20 26 26 20 61 69 52 6f 77 45 73 74 5b 31 5d  0 && aiRowEst[1]
1dcf0 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  >1 ){.      asse
1dd00 72 74 28 20 28 70 46 69 72 73 74 54 65 72 6d 2d  rt( (pFirstTerm-
1dd10 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1dd20 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _EQ|WO_ISNULL|WO
1dd30 5f 49 4e 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _IN))!=0 );.    
1dd40 20 20 69 66 28 20 70 46 69 72 73 74 54 65 72 6d    if( pFirstTerm
1dd50 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1dd60 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_EQ|WO_ISNULL) 
1dd70 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
1dd80 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d  ase( pFirstTerm-
1dd90 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45  >eOperator==WO_E
1dda0 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  Q );.        tes
1ddb0 74 63 61 73 65 28 20 70 46 69 72 73 74 54 65 72  tcase( pFirstTer
1ddc0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
1ddd0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
1dde0 20 20 20 77 68 65 72 65 45 71 75 61 6c 53 63 61     whereEqualSca
1ddf0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72  nEst(pParse, pPr
1de00 6f 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d  obe, pFirstTerm-
1de10 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
1de20 26 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 65  &nRow);.      }e
1de30 6c 73 65 20 69 66 28 20 62 49 6e 45 73 74 3d 3d  lse if( bInEst==
1de40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1de50 65 72 74 28 20 70 46 69 72 73 74 54 65 72 6d 2d  ert( pFirstTerm-
1de60 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
1de70 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  N );.        whe
1de80 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72  reInScanEst(pPar
1de90 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72  se, pProbe, pFir
1dea0 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78  stTerm->pExpr->x
1deb0 2e 70 4c 69 73 74 2c 20 26 6e 52 6f 77 29 3b 0a  .pList, &nRow);.
1dec0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
1ded0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1dee0 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a  NABLE_STAT3 */..
1def0 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 74 68      /* Adjust th
1df00 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
1df10 75 74 20 72 6f 77 73 20 61 6e 64 20 64 6f 77 6e  ut rows and down
1df20 77 61 72 64 20 74 6f 20 72 65 66 6c 65 63 74 20  ward to reflect 
1df30 72 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  rows.    ** that
1df40 20 61 72 65 20 65 78 63 6c 75 64 65 64 20 62 79   are excluded by
1df50 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1df60 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ts..    */.    n
1df70 52 6f 77 20 3d 20 6e 52 6f 77 2f 72 61 6e 67 65  Row = nRow/range
1df80 44 69 76 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f  Div;.    if( nRo
1df90 77 3c 31 20 29 20 6e 52 6f 77 20 3d 20 31 3b 0a  w<1 ) nRow = 1;.
1dfa0 0a 20 20 20 20 2f 2a 20 45 78 70 65 72 69 6d 65  .    /* Experime
1dfb0 6e 74 73 20 72 75 6e 20 6f 6e 20 72 65 61 6c 20  nts run on real 
1dfc0 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 73  SQLite databases
1dfd0 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 74   show that the t
1dfe0 69 6d 65 20 6e 65 65 64 65 64 0a 20 20 20 20 2a  ime needed.    *
1dff0 2a 20 74 6f 20 64 6f 20 61 20 62 69 6e 61 72 79  * to do a binary
1e000 20 73 65 61 72 63 68 20 74 6f 20 6c 6f 63 61 74   search to locat
1e010 65 20 61 20 72 6f 77 20 69 6e 20 61 20 74 61 62  e a row in a tab
1e020 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 72  le or index is r
1e030 6f 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20 6c 6f  oughly.    ** lo
1e040 67 31 30 28 4e 29 20 74 69 6d 65 73 20 74 68 65  g10(N) times the
1e050 20 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20 66 72   time to move fr
1e060 6f 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20 74 68  om one row to th
1e070 65 20 6e 65 78 74 20 72 6f 77 20 77 69 74 68 69  e next row withi
1e080 6e 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65  n.    ** a table
1e090 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68 65 20   or index.  The 
1e0a0 61 63 74 75 61 6c 20 74 69 6d 65 73 20 63 61 6e  actual times can
1e0b0 20 76 61 72 79 2c 20 77 69 74 68 20 74 68 65 20   vary, with the 
1e0c0 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 72  size of.    ** r
1e0d0 65 63 6f 72 64 73 20 62 65 69 6e 67 20 61 6e 20  ecords being an 
1e0e0 69 6d 70 6f 72 74 61 6e 74 20 66 61 63 74 6f 72  important factor
1e0f0 2e 20 20 42 6f 74 68 20 6d 6f 76 65 73 20 61 6e  .  Both moves an
1e100 64 20 73 65 61 72 63 68 65 73 20 61 72 65 0a 20  d searches are. 
1e110 20 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77 69 74     ** slower wit
1e120 68 20 6c 61 72 67 65 72 20 72 65 63 6f 72 64 73  h larger records
1e130 2c 20 70 72 65 73 75 6d 61 62 6c 79 20 62 65 63  , presumably bec
1e140 61 75 73 65 20 66 65 77 65 72 20 72 65 63 6f 72  ause fewer recor
1e150 64 73 20 66 69 74 0a 20 20 20 20 2a 2a 20 6f 6e  ds fit.    ** on
1e160 20 6f 6e 65 20 70 61 67 65 20 61 6e 64 20 68 65   one page and he
1e170 6e 63 65 20 6d 6f 72 65 20 70 61 67 65 73 20 68  nce more pages h
1e180 61 76 65 20 74 6f 20 62 65 20 66 65 74 63 68 65  ave to be fetche
1e190 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1e1a0 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   The ANALYZE com
1e1b0 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 73 71 6c  mand and the sql
1e1c0 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73 71  ite_stat1 and sq
1e1d0 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62 6c 65  lite_stat3 table
1e1e0 73 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  s do.    ** not 
1e1f0 67 69 76 65 20 75 73 20 64 61 74 61 20 6f 6e 20  give us data on 
1e200 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a  the relative siz
1e210 65 73 20 6f 66 20 74 61 62 6c 65 20 61 6e 64 20  es of table and 
1e220 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 0a 20  index records.. 
1e230 20 20 20 2a 2a 20 53 6f 20 74 68 69 73 20 63 6f     ** So this co
1e240 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 75 6d 65  mputation assume
1e250 73 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 20  s table records 
1e260 61 72 65 20 61 62 6f 75 74 20 74 77 69 63 65 20  are about twice 
1e270 61 73 20 62 69 67 0a 20 20 20 20 2a 2a 20 61 73  as big.    ** as
1e280 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 20   index records. 
1e290 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1e2a0 73 46 6c 61 67 73 26 7e 57 48 45 52 45 5f 52 45  sFlags&~WHERE_RE
1e2b0 56 45 52 53 45 29 3d 3d 57 48 45 52 45 5f 49 44  VERSE)==WHERE_ID
1e2c0 58 5f 4f 4e 4c 59 0a 20 20 20 20 20 26 26 20 28  X_ONLY.     && (
1e2d0 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  pWC->wctrlFlags 
1e2e0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
1e2f0 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
1e300 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
1e310 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a  lConfig.bUseCis.
1e320 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
1e330 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
1e340 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
1e350 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
1e360 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1e370 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75  s index is not u
1e380 73 65 66 75 6c 20 66 6f 72 20 69 6e 64 65 78 69  seful for indexi
1e390 6e 67 2c 20 62 75 74 20 69 74 20 69 73 20 61 20  ng, but it is a 
1e3a0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
1e3b0 20 20 20 20 20 20 2a 2a 20 41 20 66 75 6c 6c 2d        ** A full-
1e3c0 73 63 61 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  scan of the inde
1e3d0 78 20 6d 69 67 68 74 20 62 65 20 61 20 6c 69 74  x might be a lit
1e3e0 74 6c 65 20 66 61 73 74 65 72 20 74 68 61 6e 20  tle faster than 
1e3f0 61 20 66 75 6c 6c 2d 73 63 61 6e 0a 20 20 20 20  a full-scan.    
1e400 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
1e410 65 2c 20 73 6f 20 67 69 76 65 20 74 68 69 73 20  e, so give this 
1e420 63 61 73 65 20 61 20 63 6f 73 74 20 73 6c 69 67  case a cost slig
1e430 68 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 61  htly less than a
1e440 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
1e450 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 63  scan. */.      c
1e460 6f 73 74 20 3d 20 61 69 52 6f 77 45 73 74 5b 30  ost = aiRowEst[0
1e470 5d 2a 33 20 2b 20 70 50 72 6f 62 65 2d 3e 6e 43  ]*3 + pProbe->nC
1e480 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 77 73 46  olumn;.      wsF
1e490 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
1e4a0 56 45 52 5f 53 43 41 4e 7c 57 48 45 52 45 5f 43  VER_SCAN|WHERE_C
1e4b0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20  OLUMN_RANGE;.   
1e4c0 20 7d 65 6c 73 65 20 69 66 28 20 28 77 73 46 6c   }else if( (wsFl
1e4d0 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f  ags & WHERE_NOT_
1e4e0 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a  FULLSCAN)==0 ){.
1e4f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
1e500 74 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c  t of a full tabl
1e510 65 20 73 63 61 6e 20 69 73 20 61 20 6e 75 6d 62  e scan is a numb
1e520 65 72 20 6f 66 20 6d 6f 76 65 20 6f 70 65 72 61  er of move opera
1e530 74 69 6f 6e 73 20 65 71 75 61 6c 0a 20 20 20 20  tions equal.    
1e540 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62    ** to the numb
1e550 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1e560 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  e table..      *
1e570 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 61 64  *.      ** We ad
1e580 64 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  d an additional 
1e590 34 78 20 70 65 6e 61 6c 74 79 20 74 6f 20 66 75  4x penalty to fu
1e5a0 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 20  ll table scans. 
1e5b0 20 54 68 69 73 20 63 61 75 73 65 73 0a 20 20 20   This causes.   
1e5c0 20 20 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 66     ** the cost f
1e5d0 75 6e 63 74 69 6f 6e 20 74 6f 20 65 72 72 20 6f  unction to err o
1e5e0 6e 20 74 68 65 20 73 69 64 65 20 6f 66 20 63 68  n the side of ch
1e5f0 6f 6f 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  oosing an index 
1e600 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 68  over.      ** ch
1e610 6f 6f 73 69 6e 67 20 61 20 66 75 6c 6c 20 73 63  oosing a full sc
1e620 61 6e 2e 20 20 54 68 69 73 20 34 78 20 66 75 6c  an.  This 4x ful
1e630 6c 2d 73 63 61 6e 20 70 65 6e 61 6c 74 79 20 69  l-scan penalty i
1e640 73 20 61 6e 20 61 72 67 75 61 62 6c 65 0a 20 20  s an arguable.  
1e650 20 20 20 20 2a 2a 20 64 65 63 69 73 69 6f 6e 20      ** decision 
1e660 61 6e 64 20 6f 6e 65 20 77 68 69 63 68 20 77 65  and one which we
1e670 20 65 78 70 65 63 74 20 74 6f 20 72 65 76 69 73   expect to revis
1e680 69 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  it in the future
1e690 2e 20 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20  .  But.      ** 
1e6a0 69 74 20 73 65 65 6d 73 20 74 6f 20 62 65 20 77  it seems to be w
1e6b0 6f 72 6b 69 6e 67 20 77 65 6c 6c 20 65 6e 6f 75  orking well enou
1e6c0 67 68 20 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74  gh at the moment
1e6d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e6e0 20 63 6f 73 74 20 3d 20 61 69 52 6f 77 45 73 74   cost = aiRowEst
1e6f0 5b 30 5d 2a 34 3b 0a 20 20 20 20 20 20 77 73 46  [0]*4;.      wsF
1e700 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49  lags &= ~WHERE_I
1e710 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 65 6c  DX_ONLY;.    }el
1e720 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 31 30 4e  se{.      log10N
1e730 20 3d 20 65 73 74 4c 6f 67 28 61 69 52 6f 77 45   = estLog(aiRowE
1e740 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 63 6f  st[0]);.      co
1e750 73 74 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20  st = nRow;.     
1e760 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
1e770 20 20 20 20 20 69 66 28 20 62 4c 6f 6f 6b 75 70       if( bLookup
1e780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1e790 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 6c 6f   For an index lo
1e7a0 6f 6b 75 70 20 66 6f 6c 6c 6f 77 65 64 20 62 79  okup followed by
1e7b0 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 3a   a table lookup:
1e7c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
1e7d0 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65   nInMul index se
1e7e0 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74  arches to find t
1e7f0 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
1e800 20 69 6e 64 65 78 20 72 61 6e 67 65 0a 20 20 20   index range.   
1e810 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f         **  + nRo
1e820 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20  w steps through 
1e830 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20  the index.      
1e840 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74      **  + nRow t
1e850 61 62 6c 65 20 73 65 61 72 63 68 65 73 20 74 6f  able searches to
1e860 20 6c 6f 6f 6b 75 70 20 74 68 65 20 74 61 62 6c   lookup the tabl
1e870 65 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68  e entry using th
1e880 65 20 72 6f 77 69 64 0a 20 20 20 20 20 20 20 20  e rowid.        
1e890 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
1e8a0 6f 73 74 20 2b 3d 20 28 6e 49 6e 4d 75 6c 20 2b  ost += (nInMul +
1e8b0 20 6e 52 6f 77 29 2a 6c 6f 67 31 30 4e 3b 0a 20   nRow)*log10N;. 
1e8c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e8d0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61          /* For a
1e8e0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 3a   covering index:
1e8f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
1e900 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73    nInMul index s
1e910 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20  earches to find 
1e920 74 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74 72  the initial entr
1e930 79 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  y .          ** 
1e940 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20 74    + nRow steps t
1e950 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65 78  hrough the index
1e960 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1e970 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20          cost += 
1e980 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20  nInMul*log10N;. 
1e990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e9a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1e9b0 20 46 6f 72 20 61 20 72 6f 77 69 64 20 70 72 69   For a rowid pri
1e9c0 6d 61 72 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a  mary key lookup:
1e9d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e  .        **    n
1e9e0 49 6e 4d 75 6c 74 20 74 61 62 6c 65 20 73 65 61  InMult table sea
1e9f0 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68  rches to find th
1ea00 65 20 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20  e initial entry 
1ea10 66 6f 72 20 65 61 63 68 20 72 61 6e 67 65 0a 20  for each range. 
1ea20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f         **  + nRo
1ea30 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20  w steps through 
1ea40 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20  the table.      
1ea50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 73    */.        cos
1ea60 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31  t += nInMul*log1
1ea70 30 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0N;.      }.    
1ea80 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 69 6e  }..    /* Add in
1ea90 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 63   the estimated c
1eaa0 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74  ost of sorting t
1eab0 68 65 20 72 65 73 75 6c 74 2e 20 20 41 63 74 75  he result.  Actu
1eac0 61 6c 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a  al experimental.
1ead0 20 20 20 20 2a 2a 20 6d 65 61 73 75 72 65 6d 65      ** measureme
1eae0 6e 74 73 20 6f 66 20 73 6f 72 74 69 6e 67 20 70  nts of sorting p
1eaf0 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e 20 53 51  erformance in SQ
1eb00 4c 69 74 65 20 73 68 6f 77 20 74 68 61 74 20 73  Lite show that s
1eb10 6f 72 74 69 6e 67 20 74 69 6d 65 0a 20 20 20 20  orting time.    
1eb20 2a 2a 20 61 64 64 73 20 43 2a 4e 2a 6c 6f 67 31  ** adds C*N*log1
1eb30 30 28 4e 29 20 74 6f 20 74 68 65 20 63 6f 73 74  0(N) to the cost
1eb40 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  , where N is the
1eb50 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1eb60 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 6f  to be .    ** so
1eb70 72 74 65 64 20 61 6e 64 20 43 20 69 73 20 61 20  rted and C is a 
1eb80 66 61 63 74 6f 72 20 62 65 74 77 65 65 6e 20 31  factor between 1
1eb90 2e 39 35 20 61 6e 64 20 34 2e 33 2e 20 20 57 65  .95 and 4.3.  We
1eba0 20 77 69 6c 6c 20 73 70 6c 69 74 20 74 68 65 0a   will split the.
1ebb0 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 63      ** differenc
1ebc0 65 20 61 6e 64 20 73 65 6c 65 63 74 20 43 20 6f  e and select C o
1ebd0 66 20 33 2e 30 2e 0a 20 20 20 20 2a 2f 0a 20 20  f 3.0..    */.  
1ebe0 20 20 69 66 28 20 62 53 6f 72 74 20 29 7b 0a 20    if( bSort ){. 
1ebf0 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e 52 6f       cost += nRo
1ec00 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 2a 28 6e  w*estLog(nRow*(n
1ec10 4f 72 64 65 72 42 79 20 2d 20 6e 4f 42 53 61 74  OrderBy - nOBSat
1ec20 29 2f 6e 4f 72 64 65 72 42 79 29 2a 33 3b 0a 20  )/nOrderBy)*3;. 
1ec30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 44 69     }.    if( bDi
1ec40 73 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 73 74  st ){.      cost
1ec50 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28   += nRow*estLog(
1ec60 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d 0a 0a  nRow)*3;.    }..
1ec70 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f      /**** Cost o
1ec80 66 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64  f using this ind
1ec90 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  ex has now been 
1eca0 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a  computed ****/..
1ecb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1ecc0 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  are additional c
1ecd0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68  onstraints on th
1ece0 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 63 61  is table that ca
1ecf0 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20 75  nnot.    ** be u
1ed00 73 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72  sed with the cur
1ed10 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75 74 20  rent index, but 
1ed20 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f 77 65  which might lowe
1ed30 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20  r the number.   
1ed40 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f   ** of output ro
1ed50 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65 20 6e  ws, adjust the n
1ed60 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f 72 64  Row value accord
1ed70 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e 6c  ingly.  This onl
1ed80 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65 72  y .    ** matter
1ed90 73 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  s if the current
1eda0 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 6c 65   index is the le
1edb0 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20 64  ast costly, so d
1edc0 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20 20  o not bother.   
1edd0 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20 73 74   ** with this st
1ede0 65 70 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  ep if we already
1edf0 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64 65 78   know this index
1ee00 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 6f   will not be cho
1ee10 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f  sen..    ** Also
1ee20 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  , never reduce t
1ee30 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f  he output row co
1ee40 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73 69 6e  unt below 2 usin
1ee50 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20 20 20  g this step..   
1ee60 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69 73   **.    ** It is
1ee70 20 63 72 69 74 69 63 61 6c 20 74 68 61 74 20 74   critical that t
1ee80 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b  he notValid mask
1ee90 20 62 65 20 75 73 65 64 20 68 65 72 65 20 69 6e   be used here in
1eea0 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
1eeb0 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d 61 73  the notReady mas
1eec0 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75 74 69  k.  When computi
1eed0 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20  ng an "optimal" 
1eee0 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74 52 65  index, the notRe
1eef0 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b 20  ady.    ** mask 
1ef00 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20 6f  will only have o
1ef10 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74 68 65  ne bit set - the
1ef20 20 62 69 74 20 66 6f 72 20 74 68 65 20 63 75 72   bit for the cur
1ef30 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20  rent table..    
1ef40 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69 64 20  ** The notValid 
1ef50 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68  mask, on the oth
1ef60 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79 73 20  er hand, always 
1ef70 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73 65 74  has all bits set
1ef80 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c   for.    ** tabl
1ef90 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  es that are not 
1efa0 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 20  in outer loops. 
1efb0 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69 73 20   If notReady is 
1efc0 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61  used here instea
1efd0 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 56  d.    ** of notV
1efe0 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f 70 74  alid, then a opt
1eff0 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  imal index that 
1f000 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65 72  depends on inner
1f010 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20 20   joins loops.   
1f020 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 65 6c   ** might be sel
1f030 65 63 74 65 64 20 65 76 65 6e 20 77 68 65 6e 20  ected even when 
1f040 74 68 65 72 65 20 65 78 69 73 74 73 20 61 6e 20  there exists an 
1f050 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68  optimal index th
1f060 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f  at has.    ** no
1f070 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e 63 79   such dependency
1f080 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1f090 20 6e 52 6f 77 3e 32 20 26 26 20 63 6f 73 74 3c   nRow>2 && cost<
1f0a0 3d 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29  =p->cost.rCost )
1f0b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20  {.      int k;  
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1f0e0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  nter */.      in
1f0f0 74 20 6e 53 6b 69 70 45 71 20 3d 20 6e 45 71 3b  t nSkipEq = nEq;
1f100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f110 6d 62 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74  mber of == const
1f120 72 61 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a  raints to skip *
1f130 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69  /.      int nSki
1f140 70 52 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b  pRange = nBound;
1f150 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f160 66 20 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  f < constraints 
1f170 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20  to skip */.     
1f180 20 42 69 74 6d 61 73 6b 20 74 68 69 73 54 61 62   Bitmask thisTab
1f190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1f1a0 20 42 69 74 6d 61 70 20 66 6f 72 20 70 53 72 63   Bitmap for pSrc
1f1b0 20 2a 2f 0a 0a 20 20 20 20 20 20 74 68 69 73 54   */..      thisT
1f1c0 61 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43  ab = getMask(pWC
1f1d0 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->pMaskSet, iCur
1f1e0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  );.      for(pTe
1f1f0 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43  rm=pWC->a, k=pWC
1f200 2d 3e 6e 54 65 72 6d 3b 20 6e 52 6f 77 3e 32 20  ->nTerm; nRow>2 
1f210 26 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d  && k; k--, pTerm
1f220 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1f230 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1f240 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1f250 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f260 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
1f270 72 65 72 65 71 41 6c 6c 20 26 20 70 2d 3e 6e 6f  rereqAll & p->no
1f280 74 56 61 6c 69 64 29 21 3d 74 68 69 73 54 61 62  tValid)!=thisTab
1f290 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f2a0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1f2b0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1f2c0 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
1f2d0 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LL) ){.         
1f2e0 20 69 66 28 20 6e 53 6b 69 70 45 71 20 29 7b 0a   if( nSkipEq ){.
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1f300 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  gnore the first 
1f310 6e 45 71 20 65 71 75 61 6c 69 74 79 20 6d 61 74  nEq equality mat
1f320 63 68 65 73 20 73 69 6e 63 65 20 74 68 65 20 69  ches since the i
1f330 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20  ndex.           
1f340 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
1f350 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68  accounted for th
1f360 65 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ese */.         
1f370 20 20 20 6e 53 6b 69 70 45 71 2d 2d 3b 0a 20 20     nSkipEq--;.  
1f380 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
1f3a0 73 75 6d 65 20 65 61 63 68 20 61 64 64 69 74 69  sume each additi
1f3b0 6f 6e 61 6c 20 65 71 75 61 6c 69 74 79 20 6d 61  onal equality ma
1f3c0 74 63 68 20 72 65 64 75 63 65 73 20 74 68 65 20  tch reduces the 
1f3d0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20  result.         
1f3e0 20 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62     ** set size b
1f3f0 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31 30  y a factor of 10
1f400 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1f410 6e 52 6f 77 20 2f 3d 20 31 30 3b 0a 20 20 20 20  nRow /= 10;.    
1f420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f430 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
1f440 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1f450 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
1f460 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20  WO_GE) ){.      
1f470 20 20 20 20 69 66 28 20 6e 53 6b 69 70 52 61 6e      if( nSkipRan
1f480 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
1f490 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
1f4a0 66 69 72 73 74 20 6e 53 6b 69 70 52 61 6e 67 65  first nSkipRange
1f4b0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1f4c0 74 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64  ts since the ind
1f4d0 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ex.            *
1f4e0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63  * has already ac
1f4f0 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73  counted for thes
1f500 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1f510 20 6e 53 6b 69 70 52 61 6e 67 65 2d 2d 3b 0a 20   nSkipRange--;. 
1f520 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1f530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1f540 73 73 75 6d 65 20 65 61 63 68 20 61 64 64 69 74  ssume each addit
1f550 69 6f 6e 61 6c 20 72 61 6e 67 65 20 63 6f 6e 73  ional range cons
1f560 74 72 61 69 6e 74 20 72 65 64 75 63 65 73 20 74  traint reduces t
1f570 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
1f580 20 20 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a        ** set siz
1f590 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
1f5a0 20 33 2e 20 20 49 6e 64 65 78 65 64 20 72 61 6e   3.  Indexed ran
1f5b0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  ge constraints r
1f5c0 65 64 75 63 65 0a 20 20 20 20 20 20 20 20 20 20  educe.          
1f5d0 20 20 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20    ** the search 
1f5e0 73 70 61 63 65 20 62 79 20 61 20 6c 61 72 67 65  space by a large
1f5f0 72 20 66 61 63 74 6f 72 3a 20 34 2e 20 20 57 65  r factor: 4.  We
1f600 20 6d 61 6b 65 20 69 6e 64 65 78 65 64 20 72 61   make indexed ra
1f610 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  nge.            
1f620 2a 2a 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76  ** more selectiv
1f630 65 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 6c 79 20  e intentionally 
1f640 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 73  because of the s
1f650 75 62 6a 65 63 74 69 76 65 20 0a 20 20 20 20 20  ubjective .     
1f660 20 20 20 20 20 20 20 2a 2a 20 6f 62 73 65 72 76         ** observ
1f670 61 74 69 6f 6e 20 74 68 61 74 20 69 6e 64 65 78  ation that index
1f680 65 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ed range constra
1f690 69 6e 74 73 20 72 65 61 6c 6c 79 20 61 72 65 20  ints really are 
1f6a0 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  more.           
1f6b0 20 2a 2a 20 73 65 6c 65 63 74 69 76 65 20 69 6e   ** selective in
1f6c0 20 70 72 61 63 74 69 63 65 2c 20 6f 6e 20 61 76   practice, on av
1f6d0 65 72 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20  erage. */.      
1f6e0 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 33 3b        nRow /= 3;
1f6f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f700 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1f710 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
1f720 3d 57 4f 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20  =WO_NOOP ){.    
1f730 20 20 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68        /* Any oth
1f740 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  er expression lo
1f750 77 65 72 73 20 74 68 65 20 6f 75 74 70 75 74 20  wers the output 
1f760 72 6f 77 20 63 6f 75 6e 74 20 62 79 20 68 61 6c  row count by hal
1f770 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e  f */.          n
1f780 52 6f 77 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20  Row /= 2;.      
1f790 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f7a0 20 20 69 66 28 20 6e 52 6f 77 3c 32 20 29 20 6e    if( nRow<2 ) n
1f7b0 52 6f 77 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a  Row = 2;.    }..
1f7c0 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
1f7d0 28 0a 20 20 20 20 20 20 22 25 73 28 25 73 29 3a  (.      "%s(%s):
1f7e0 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20 6e  \n".      "    n
1f7f0 45 71 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25 64 20  Eq=%d nInMul=%d 
1f800 72 61 6e 67 65 44 69 76 3d 25 64 20 62 53 6f 72  rangeDiv=%d bSor
1f810 74 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d 25 64 20  t=%d bLookup=%d 
1f820 77 73 46 6c 61 67 73 3d 30 78 25 30 38 78 5c 6e  wsFlags=0x%08x\n
1f830 22 0a 20 20 20 20 20 20 22 20 20 20 20 6e 6f 74  ".      "    not
1f840 52 65 61 64 79 3d 30 78 25 6c 6c 78 20 6c 6f 67  Ready=0x%llx log
1f850 31 30 4e 3d 25 2e 31 66 20 6e 52 6f 77 3d 25 2e  10N=%.1f nRow=%.
1f860 31 66 20 63 6f 73 74 3d 25 2e 31 66 5c 6e 22 0a  1f cost=%.1f\n".
1f870 20 20 20 20 20 20 22 20 20 20 20 75 73 65 64 3d        "    used=
1f880 30 78 25 6c 6c 78 20 6e 4f 72 64 65 72 65 64 3d  0x%llx nOrdered=
1f890 25 64 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c  %d nOBSat=%d\n",
1f8a0 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 70 54 61  .      pSrc->pTa
1f8b0 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49 64 78 20  b->zName, (pIdx 
1f8c0 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
1f8d0 22 69 70 6b 22 29 2c 20 0a 20 20 20 20 20 20 6e  "ipk"), .      n
1f8e0 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20 28 69 6e 74  Eq, nInMul, (int
1f8f0 29 72 61 6e 67 65 44 69 76 2c 20 62 53 6f 72 74  )rangeDiv, bSort
1f900 2c 20 62 4c 6f 6f 6b 75 70 2c 20 77 73 46 6c 61  , bLookup, wsFla
1f910 67 73 2c 0a 20 20 20 20 20 20 70 2d 3e 6e 6f 74  gs,.      p->not
1f920 52 65 61 64 79 2c 20 6c 6f 67 31 30 4e 2c 20 6e  Ready, log10N, n
1f930 52 6f 77 2c 20 63 6f 73 74 2c 20 75 73 65 64 2c  Row, cost, used,
1f940 20 6e 4f 72 64 65 72 65 64 2c 20 6e 4f 42 53 61   nOrdered, nOBSa
1f950 74 0a 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f  t.    ));..    /
1f960 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20  * If this index 
1f970 69 73 20 74 68 65 20 62 65 73 74 20 77 65 20 68  is the best we h
1f980 61 76 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c  ave seen so far,
1f990 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69   then record thi
1f9a0 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61  s.    ** index a
1f9b0 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74  nd its cost in t
1f9c0 68 65 20 70 43 6f 73 74 20 73 74 72 75 63 74 75  he pCost structu
1f9d0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
1f9e0 66 28 20 28 21 70 49 64 78 20 7c 7c 20 77 73 46  f( (!pIdx || wsF
1f9f0 6c 61 67 73 29 0a 20 20 20 20 20 26 26 20 28 63  lags).     && (c
1fa00 6f 73 74 3c 70 2d 3e 63 6f 73 74 2e 72 43 6f 73  ost<p->cost.rCos
1fa10 74 20 7c 7c 20 28 63 6f 73 74 3c 3d 70 2d 3e 63  t || (cost<=p->c
1fa20 6f 73 74 2e 72 43 6f 73 74 20 26 26 20 6e 52 6f  ost.rCost && nRo
1fa30 77 3c 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e  w<p->cost.plan.n
1fa40 52 6f 77 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  Row)).    ){.   
1fa50 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74     p->cost.rCost
1fa60 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70   = cost;.      p
1fa70 2d 3e 63 6f 73 74 2e 75 73 65 64 20 3d 20 75 73  ->cost.used = us
1fa80 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73  ed;.      p->cos
1fa90 74 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52  t.plan.nRow = nR
1faa0 6f 77 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73  ow;.      p->cos
1fab0 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  t.plan.wsFlags =
1fac0 20 28 77 73 46 6c 61 67 73 26 77 73 46 6c 61 67   (wsFlags&wsFlag
1fad0 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Mask);.      p->
1fae0 63 6f 73 74 2e 70 6c 61 6e 2e 6e 45 71 20 3d 20  cost.plan.nEq = 
1faf0 6e 45 71 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f  nEq;.      p->co
1fb00 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d  st.plan.nOBSat =
1fb10 20 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 70   nOBSat;.      p
1fb20 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49  ->cost.plan.u.pI
1fb30 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d  dx = pIdx;.    }
1fb40 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1fb50 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44  e was an INDEXED
1fb60 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1fb70 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69   only that one i
1fb80 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63  ndex is.    ** c
1fb90 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20  onsidered. */.  
1fba0 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
1fbb0 65 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  ex ) break;..   
1fbc0 20 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b 73 20   /* Reset masks 
1fbd0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e 64  for the next ind
1fbe0 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a  ex in the loop *
1fbf0 2f 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b  /.    wsFlagMask
1fc00 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44   = ~(WHERE_ROWID
1fc10 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
1fc20 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65  RANGE);.    eqTe
1fc30 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65  rmMask = idxEqTe
1fc40 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  rmMask;.  }..  /
1fc50 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
1fc60 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1fc70 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f   and the SQLITE_
1fc80 52 65 76 65 72 73 65 4f 72 64 65 72 20 66 6c 61  ReverseOrder fla
1fc90 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c 20 74  g.  ** is set, t
1fca0 68 65 6e 20 72 65 76 65 72 73 65 20 74 68 65 20  hen reverse the 
1fcb0 6f 72 64 65 72 20 74 68 61 74 20 74 68 65 20 69  order that the i
1fcc0 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 73 63 61  ndex will be sca
1fcd0 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54 68  nned.  ** in. Th
1fce0 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 61  is is used for a
1fcf0 70 70 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69  pplication testi
1fd00 6e 67 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e 64  ng, to help find
1fd10 20 63 61 73 65 73 0a 20 20 2a 2a 20 77 68 65 72   cases.  ** wher
1fd20 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 62 65  e application be
1fd30 68 61 76 69 6f 75 72 20 64 65 70 65 6e 64 73 20  haviour depends 
1fd40 6f 6e 20 74 68 65 20 28 75 6e 64 65 66 69 6e 65  on the (undefine
1fd50 64 29 20 6f 72 64 65 72 20 74 68 61 74 0a 20 20  d) order that.  
1fd60 2a 2a 20 53 51 4c 69 74 65 20 6f 75 74 70 75 74  ** SQLite output
1fd70 73 20 72 6f 77 73 20 69 6e 20 69 6e 20 74 68 65  s rows in in the
1fd80 20 61 62 73 65 6e 63 65 20 6f 66 20 61 6e 20 4f   absence of an O
1fd90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
1fda0 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 70 4f   */.  if( !p->pO
1fdb0 72 64 65 72 42 79 20 26 26 20 70 50 61 72 73 65  rderBy && pParse
1fdc0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1fdd0 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
1fde0 72 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74  r ){.    p->cost
1fdf0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
1fe00 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a   WHERE_REVERSE;.
1fe10 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
1fe20 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70  ->pOrderBy || (p
1fe30 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  ->cost.plan.wsFl
1fe40 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
1fe50 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
1fe60 74 28 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e  t( p->cost.plan.
1fe70 75 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70 2d  u.pIdx==0 || (p-
1fe80 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
1fe90 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  gs&WHERE_ROWID_E
1fea0 51 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Q)==0 );.  asser
1feb0 74 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d  t( pSrc->pIndex=
1fec0 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  =0 .       || p-
1fed0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64  >cost.plan.u.pId
1fee0 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  x==0 .       || 
1fef0 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70  p->cost.plan.u.p
1ff00 49 64 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65  Idx==pSrc->pInde
1ff10 78 20 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45  x .  );..  WHERE
1ff20 54 52 41 43 45 28 28 22 62 65 73 74 20 69 6e 64  TRACE(("best ind
1ff30 65 78 20 69 73 3a 20 25 73 5c 6e 22 2c 20 0a 20  ex is: %s\n", . 
1ff40 20 20 20 28 28 70 2d 3e 63 6f 73 74 2e 70 6c 61     ((p->cost.pla
1ff50 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1ff60 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d  E_NOT_FULLSCAN)=
1ff70 3d 30 20 3f 20 22 6e 6f 6e 65 22 20 3a 20 0a 20  =0 ? "none" : . 
1ff80 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e          p->cost.
1ff90 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70 2d  plan.u.pIdx ? p-
1ffa0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64  >cost.plan.u.pId
1ffb0 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22  x->zName : "ipk"
1ffc0 29 0a 20 20 29 29 3b 0a 20 20 0a 20 20 62 65 73  ).  ));.  .  bes
1ffd0 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70  tOrClauseIndex(p
1ffe0 29 3b 0a 20 20 62 65 73 74 41 75 74 6f 6d 61 74  );.  bestAutomat
1fff0 69 63 49 6e 64 65 78 28 70 29 3b 0a 20 20 70 2d  icIndex(p);.  p-
20000 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
20010 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b  gs |= eqTermMask
20020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
20030 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66  the query plan f
20040 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 61 62  or accessing tab
20050 6c 65 20 70 53 72 63 2d 3e 70 54 61 62 2e 20 57  le pSrc->pTab. W
20060 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74  rite the.** best
20070 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20   query plan and 
20080 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68  its cost into th
20090 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65  e WhereCost obje
200a0 63 74 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ct supplied .** 
200b0 61 73 20 74 68 65 20 6c 61 73 74 20 70 61 72 61  as the last para
200c0 6d 65 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  meter. This func
200d0 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61  tion may calcula
200e0 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a  te the cost of.*
200f0 2a 20 62 6f 74 68 20 72 65 61 6c 20 61 6e 64 20  * both real and 
20100 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63  virtual table sc
20110 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ans..**.** This 
20120 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
20130 74 20 74 61 6b 65 20 4f 52 44 45 52 20 42 59 20  t take ORDER BY 
20140 6f 72 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f  or DISTINCT into
20150 20 61 63 63 6f 75 6e 74 2e 20 20 4e 6f 72 0a 2a   account.  Nor.*
20160 2a 20 64 6f 65 73 20 69 74 20 72 65 6d 65 6d 62  * does it rememb
20170 65 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  er the virtual t
20180 61 62 6c 65 20 71 75 65 72 79 20 70 6c 61 6e 2e  able query plan.
20190 20 20 41 6c 6c 20 69 74 20 64 6f 65 73 20 69 73    All it does is
201a0 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
201b0 63 6f 73 74 20 77 68 69 6c 65 20 64 65 74 65 72  cost while deter
201c0 6d 69 6e 69 6e 67 20 69 66 20 61 6e 20 4f 52 20  mining if an OR 
201d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
201e0 61 70 70 6c 69 63 61 62 6c 65 2e 20 20 54 68 65  applicable.  The
201f0 0a 2a 2a 20 64 65 74 61 69 6c 73 20 77 69 6c 6c  .** details will
20200 20 62 65 20 72 65 63 6f 6e 73 69 64 65 72 65 64   be reconsidered
20210 20 6c 61 74 65 72 20 69 66 20 74 68 65 20 6f 70   later if the op
20220 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 66 6f  timization is fo
20230 75 6e 64 20 74 6f 20 62 65 0a 2a 2a 20 61 70 70  und to be.** app
20240 6c 69 63 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  licable..*/.stat
20250 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65  ic void bestInde
20260 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20 2a  x(WhereBestIdx *
20270 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p){.#ifndef SQLI
20280 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
20290 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
202a0 74 75 61 6c 28 70 2d 3e 70 53 72 63 2d 3e 70 54  tual(p->pSrc->pT
202b0 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
202c0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
202d0 49 64 78 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20  IdxInfo = 0;.   
202e0 20 70 2d 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20   p->ppIdxInfo = 
202f0 26 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 62  &pIdxInfo;.    b
20300 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
20310 70 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  p);.    if( pIdx
20320 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
20330 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20  IdxStr ){.      
20340 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
20350 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
20360 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20370 33 44 62 46 72 65 65 28 70 2d 3e 70 50 61 72 73  3DbFree(p->pPars
20380 65 2d 3e 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  e->db, pIdxInfo)
20390 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
203a0 0a 20 20 7b 0a 20 20 20 20 62 65 73 74 42 74 72  .  {.    bestBtr
203b0 65 65 49 6e 64 65 78 28 70 29 3b 0a 20 20 7d 0a  eeIndex(p);.  }.
203c0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65  }../*.** Disable
203d0 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
203e0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78  HERE clause.  Ex
203f0 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73  cept, do not dis
20400 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a  able the term.**
20410 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20   if it controls 
20420 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
20430 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74  N and it did not
20440 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
20450 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47  e ON.** or USING
20460 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20   clause of that 
20470 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  join..**.** Cons
20480 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32  ider the term t2
20490 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66  .z='ok' in the f
204a0 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73  ollowing queries
204b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53  :.**.**   (1)  S
204c0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
204d0 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
204e0 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20  t1.a=t2.x WHERE 
204f0 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
20500 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2)  SELECT * FRO
20510 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
20520 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41  2 ON t1.a=t2.x A
20530 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  ND t2.z='ok'.** 
20540 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20    (3)  SELECT * 
20550 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52  FROM t1, t2 WHER
20560 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  E t1.a=t2.x AND 
20570 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20  t2.z='ok'.**.** 
20580 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73  The t2.z='ok' is
20590 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65   disabled in the
205a0 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20   in (2) because 
205b0 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a  it originates.**
205c0 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
205d0 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20  e.  The term is 
205e0 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20  disabled in (3) 
205f0 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f  because it is no
20600 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c  t part.** of a L
20610 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20  EFT OUTER JOIN. 
20620 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72   In (1), the ter
20630 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65  m is not disable
20640 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45  d..**.** IMPLEME
20650 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34  NTATION-OF: R-24
20660 35 39 37 2d 35 38 36 35 35 20 4e 6f 20 74 65 73  597-58655 No tes
20670 74 73 20 61 72 65 20 64 6f 6e 65 20 66 6f 72 20  ts are done for 
20680 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 0a 2a  terms that are.*
20690 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74  * completely sat
206a0 69 73 66 69 65 64 20 62 79 20 69 6e 64 69 63 65  isfied by indice
206b0 73 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69  s..**.** Disabli
206c0 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73  ng a term causes
206d0 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f   that term to no
206e0 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74  t be tested in t
206f0 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
20700 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44   of the join.  D
20710 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f  isabling is an o
20720 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68  ptimization.  Wh
20730 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74  en terms are sat
20740 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64  isfied.** by ind
20750 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65  ices, we disable
20760 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74   them to prevent
20770 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73   redundant tests
20780 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a   in the inner.**
20790 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64   loop.  We would
207a0 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   get the correct
207b0 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68   results if noth
207c0 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69  ing were ever di
207d0 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a  sabled,.** but j
207e0 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61  oins might run a
207f0 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20   little slower. 
20800 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f   The trick is to
20810 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68   disable as much
20820 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69  .** as we can wi
20830 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20  thout disabling 
20840 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65  too much.  If we
20850 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29   disabled in (1)
20860 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68  , we'd get.** th
20870 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20  e wrong answer. 
20880 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33   See ticket #813
20890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
208a0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65   disableTerm(Whe
208b0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
208c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
208d0 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a  m){.  if( pTerm.
208e0 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
208f0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
20900 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  CODED)==0.      
20910 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
20920 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
20930 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
20940 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
20950 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20  mJoin)).  ){.   
20960 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
20970 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
20980 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
20990 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20  arent>=0 ){.    
209a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
209b0 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57  her = &pTerm->pW
209c0 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72  C->a[pTerm->iPar
209d0 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ent];.      if( 
209e0 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c  (--pOther->nChil
209f0 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
20a00 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
20a10 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20  vel, pOther);.  
20a20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
20a30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
20a40 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
20a50 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65  ode to apply the
20a60 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
20a70 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20   string zAff.** 
20a80 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65  to the n registe
20a90 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  rs starting at b
20aa0 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61  ase. .**.** As a
20ab0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
20ac0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
20ad0 65 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61  entries (which a
20ae0 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68  re no-ops) at th
20af0 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61  e.** beginning a
20b00 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61  nd end of zAff a
20b10 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20  re ignored.  If 
20b20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a  all entries in z
20b30 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54  Aff are.** SQLIT
20b40 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e  E_AFF_NONE, then
20b50 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65   no code gets ge
20b60 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nerated..**.** T
20b70 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
20b80 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  s its own copy o
20b90 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74  f zAff so that t
20ba0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65  he caller is fre
20bb0 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a  e.** to modify z
20bc0 41 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72  Aff after this r
20bd0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
20be0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
20bf0 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
20c00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20c10 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c  int base, int n,
20c20 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20   char *zAff){.  
20c30 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
20c40 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a  ->pVdbe;.  if( z
20c50 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Aff==0 ){.    as
20c60 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
20c70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20c80 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
20c90 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  }.  assert( v!=0
20ca0 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74   );..  /* Adjust
20cb0 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73   base and n to s
20cc0 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f  kip over SQLITE_
20cd0 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73  AFF_NONE entries
20ce0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
20cf0 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f  g.  ** and end o
20d00 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  f the affinity s
20d10 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68  tring..  */.  wh
20d20 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66  ile( n>0 && zAff
20d30 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  [0]==SQLITE_AFF_
20d40 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b  NONE ){.    n--;
20d50 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20  .    base++;.   
20d60 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77   zAff++;.  }.  w
20d70 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66  hile( n>1 && zAf
20d80 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41  f[n-1]==SQLITE_A
20d90 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
20da0 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  --;.  }..  /* Co
20db0 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  de the OP_Affini
20dc0 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65  ty opcode if the
20dd0 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c  re is anything l
20de0 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20  eft to do. */.  
20df0 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73  if( n>0 ){.    s
20e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20e10 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
20e20 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73   base, n);.    s
20e30 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
20e40 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20  P4(v, -1, zAff, 
20e50 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  n);.    sqlite3E
20e60 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
20e70 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62  Change(pParse, b
20e80 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  ase, n);.  }.}..
20e90 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
20ea0 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
20eb0 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
20ec0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
20ed0 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74  use.  An equalit
20ee0 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65  y.** term can be
20ef0 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f   either X=expr o
20f00 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20  r X IN (...).   
20f10 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72  pTerm is the ter
20f20 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65  m to be .** code
20f30 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72  d..**.** The cur
20f40 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rent value for t
20f50 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
20f60 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
20f70 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f  r iReg..**.** Fo
20f80 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  r a constraint o
20f90 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70  f the form X=exp
20fa0 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  r, the expressio
20fb0 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
20fc0 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74  nd its.** result
20fd0 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
20fe0 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73  stack.  For cons
20ff0 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66  traints of the f
21000 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a  orm X IN (...).*
21010 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
21020 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68  ets up a loop th
21030 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20  at will iterate 
21040 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
21050 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of X..*/.static 
21060 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79  int codeEquality
21070 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
21080 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
21090 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
210a0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
210b0 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54  m *pTerm,   /* T
210c0 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  he term of the W
210d0 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
210e0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
210f0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
21100 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f   /* When level o
21110 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
21120 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  e we are working
21130 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61   on */.  int iTa
21140 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
21150 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
21160 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
21170 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
21180 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
21190 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
211a0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
211b0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
211c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
211d0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
211e0 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
211f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  /..  assert( iTa
21200 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
21210 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
21220 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
21230 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
21240 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
21250 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
21260 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
21270 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
21280 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
21290 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
212a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
212b0 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
212c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
212d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
212e0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
212f0 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
21300 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
21310 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20  nLoop *pIn;..   
21320 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
21330 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52  =TK_IN );.    iR
21340 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
21350 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
21360 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
21370 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20  rse, pX, 0);.   
21380 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
21390 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
213a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
213b0 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
213c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
213d0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
213e0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
213f0 4c 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  LE );.    if( pL
21400 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d  evel->u.in.nIn==
21410 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
21420 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c  l->addrNxt = sql
21430 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
21440 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  l(v);.    }.    
21450 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
21460 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ++;.    pLevel->
21470 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20  u.in.aInLoop =. 
21480 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
21490 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61  eallocOrFree(pPa
214a0 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d  rse->db, pLevel-
214b0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20  >u.in.aInLoop,. 
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
214e0 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  eof(pLevel->u.in
214f0 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65  .aInLoop[0])*pLe
21500 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a  vel->u.in.nIn);.
21510 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c      pIn = pLevel
21520 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a  ->u.in.aInLoop;.
21530 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20      if( pIn ){. 
21540 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76       pIn += pLev
21550 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31  el->u.in.nIn - 1
21560 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75  ;.      pIn->iCu
21570 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  r = iTab;.      
21580 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
21590 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
215a0 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
215b0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
215c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
215d0 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29  wid, iTab, iReg)
215e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
215f0 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72         pIn->addr
21600 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  InTop = sqlite3V
21610 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
21620 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c  Column, iTab, 0,
21630 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a   iReg);.      }.
21640 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21650 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
21660 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20  Null, iReg);.   
21670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
21680 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d  evel->u.in.nIn =
21690 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
216a0 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
216b0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
216c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
216d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
216e0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
216f0 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
21700 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
21710 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
21720 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  index..**.** For
21730 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64   example, consid
21740 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c  er table t1(a,b,
21750 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e  c,d,e,f) with in
21760 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a  dex i1(a,b,c)..*
21770 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48  * Suppose the WH
21780 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68  ERE clause is th
21790 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20  is:  a==5 AND b 
217a0 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63  IN (1,2,3) AND c
217b0 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54  >5 AND c<10.** T
217c0 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20  he index has as 
217d0 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71  many as three eq
217e0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
217f0 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a  ts, but in this.
21800 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  ** example, the 
21810 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20  third "c" value 
21820 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  is an inequality
21830 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a  .  So only two .
21840 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ** constraints a
21850 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20  re coded.  This 
21860 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e  routine will gen
21870 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
21880 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61  aluate.** a==5 a
21890 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e  nd b IN (1,2,3).
218a0 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61    The current va
218b0 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62  lues for a and b
218c0 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a   will be stored.
218d0 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76  ** in consecutiv
218e0 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  e registers and 
218f0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
21900 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
21910 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
21920 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
21930 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20  e above nEq==2. 
21940 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75   But this subrou
21950 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
21960 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e  ny value.** of n
21970 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20  Eq including 0. 
21980 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73   If nEq==0, this
21990 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72   routine is near
219a0 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54  ly a no-op..** T
219b0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74  he only thing it
219c0 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74   does is allocat
219d0 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d  e the pLevel->iM
219e0 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  em memory cell a
219f0 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68  nd.** compute th
21a00 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
21a10 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
21a20 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c  utine always all
21a30 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73 74 20  ocates at least 
21a40 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  one memory cell 
21a50 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  and returns.** t
21a60 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
21a70 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68   memory cell. Th
21a80 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63  e code that.** c
21a90 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
21aa0 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20  e will use that 
21ab0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73  memory cell to s
21ac0 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61  tore the termina
21ad0 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75  tion.** key valu
21ae0 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
21af0 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49  If one or more I
21b00 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65  N operators appe
21b10 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  ar, then.** this
21b20 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
21b30 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  es an additional
21b40 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   nEq memory cell
21b50 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a  s for internal.*
21b60 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  * use..**.** Bef
21b70 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
21b80 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20  pzAff is set to 
21b90 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
21ba0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  r containing a.*
21bb0 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  * copy of the co
21bc0 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
21bd0 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65  ring of the inde
21be0 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  x allocated usin
21bf0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61  g.** sqlite3DbMa
21c00 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20  lloc(). Except, 
21c10 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63  entries in the c
21c20 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  opy of the strin
21c30 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  g associated.** 
21c40 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f  with equality co
21c50 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75  nstraints that u
21c60 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79  se NONE affinity
21c70 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53   are set to.** S
21c80 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
21c90 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20  This is to deal 
21ca0 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73  with SQL such as
21cb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
21cc0 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
21cd0 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50  ABLE t1(a TEXT P
21ce0 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
21cf0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  **   SELECT ... 
21d00 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74  FROM t1 AS t2, t
21d10 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74  1 WHERE t1.a = t
21d20 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  2.b;.**.** In th
21d30 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c  e example above,
21d40 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31   the index on t1
21d50 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66  (a) has TEXT aff
21d60 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65  inity. But since
21d70 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61  .** the right ha
21d80 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65  nd side of the e
21d90 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
21da0 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f  nt (t2.b) has NO
21db0 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20  NE affinity,.** 
21dc0 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68  no conversion sh
21dd0 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65  ould be attempte
21de0 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61  d before using a
21df0 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70   t2.b value as p
21e00 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20  art of.** a key 
21e10 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e  to search the in
21e20 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66  dex. Hence the f
21e30 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65  irst byte in the
21e40 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69   returned affini
21e50 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20  ty.** string in 
21e60 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75  this example wou
21e70 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ld be set to SQL
21e80 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f  ITE_AFF_NONE..*/
21e90 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
21ea0 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
21eb0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
21ec0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
21ed0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
21ee0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
21ef0 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
21f00 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
21f10 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20  the FROM we are 
21f20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72  coding */.  Wher
21f30 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
21f40 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
21f50 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61  lause */.  Bitma
21f60 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
21f70 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20   /* Which parts 
21f80 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74  of FROM have not
21f90 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20   yet been coded 
21fa0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52  */.  int nExtraR
21fb0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  eg,        /* Nu
21fc0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
21fd0 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
21fe0 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
21ff0 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f  pzAff          /
22000 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f  * OUT: Set to po
22010 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20  int to affinity 
22020 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
22030 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
22040 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20  >plan.nEq;   /* 
22050 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
22060 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
22070 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
22080 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
22090 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
220a0 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
220b0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
220c0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
220e0 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
220f0 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
22100 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  oop */.  int iCu
22110 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
22120 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  Cur;   /* The cu
22130 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
22140 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
22150 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
22160 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
22170 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
22180 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
22190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
221b0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
221c0 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
221d0 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
221e0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
221f0 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
22200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22210 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
22220 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
22230 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20  .  char *zAff;  
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72   /* Affinity str
22260 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ing to return */
22270 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75  ..  /* This modu
22280 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  le is only calle
22290 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73  d on query plans
222a0 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64   that use an ind
222b0 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ex. */.  assert(
222c0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
222d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
222e0 44 45 58 45 44 20 29 3b 0a 20 20 70 49 64 78 20  DEXED );.  pIdx 
222f0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
22300 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67  .pIdx;..  /* Fig
22310 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
22320 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65   memory cells we
22330 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20   will need then 
22340 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20  allocate them.. 
22350 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20   */.  regBase = 
22360 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
22370 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 65 76 65  ;.  nReg = pLeve
22380 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45  l->plan.nEq + nE
22390 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
223a0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
223b0 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
223c0 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
223d0 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
223e0 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
223f0 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
22400 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
22410 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
22420 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
22430 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
22440 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
22450 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  raints.  */.  as
22460 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
22470 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  umn>=nEq );.  fo
22480 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
22490 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a  +){.    int r1;.
224a0 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78      int k = pIdx
224b0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
224c0 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
224d0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b  erm(pWC, iCur, k
224e0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
224f0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
22500 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , pIdx);.    if(
22510 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
22520 6b 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  k;.    /* The fo
22530 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72  llowing true for
22540 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72 65   indices with re
22550 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e  dundant columns.
22560 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45   .    ** Ex: CRE
22570 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
22580 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43  t1(a,b,a); SELEC
22590 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
225a0 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a  E a=0 AND b=0; *
225b0 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  /.    testcase( 
225c0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
225d0 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30  & TERM_CODED)!=0
225e0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
225f0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
22600 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
22610 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
22620 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 72  5-11662 */.    r
22630 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  1 = codeEquality
22640 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
22650 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67 42  rm, pLevel, regB
22660 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20  ase+j);.    if( 
22670 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b  r1!=regBase+j ){
22680 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d  .      if( nReg=
22690 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
226a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
226b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42  Reg(pParse, regB
226c0 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
226d0 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20  gBase = r1;.    
226e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
226f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22700 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
22710 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a  r1, regBase+j);.
22720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22730 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
22740 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
22750 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
22760 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
22770 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
22780 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  IN );.    if( (p
22790 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
227a0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  & (WO_ISNULL|WO_
227b0 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  IN))==0 ){.     
227c0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
227d0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
227e0 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
227f0 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
22800 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
22810 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76   regBase+j, pLev
22820 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
22830 20 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a      if( zAff ){.
22840 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
22850 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
22860 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ty(pRight, zAff[
22870 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  j])==SQLITE_AFF_
22880 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
22890 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49    zAff[j] = SQLI
228a0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
228b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
228c0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
228d0 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
228e0 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66  nge(pRight, zAff
228f0 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
22900 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49    zAff[j] = SQLI
22910 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
22920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22930 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66     }.  }.  *pzAf
22940 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75  f = zAff;.  retu
22950 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23  rn regBase;.}..#
22960 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22970 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
22980 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
22990 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78   a helper for ex
229a0 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
229b0 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53  ) below.**.** pS
229c0 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78  tr holds the tex
229d0 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
229e0 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65 20 62  on that we are b
229f0 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74  uilding up one t
22a00 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65  erm.** at a time
22a10 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
22a20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20  adds a new term 
22a30 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
22a40 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  e expression..**
22a50 20 54 65 72 6d 73 20 61 72 65 20 73 65 70 61 72   Terms are separ
22a60 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61  ated by AND so a
22a70 64 64 20 74 68 65 20 22 41 4e 44 22 20 74 65 78  dd the "AND" tex
22a80 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64  t for second and
22a90 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74   subsequent.** t
22aa0 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  erms only..*/.st
22ab0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
22ac0 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53  nAppendTerm(.  S
22ad0 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20  trAccum *pStr,  
22ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22af0 65 20 74 65 78 74 20 65 78 70 72 65 73 73 69 6f  e text expressio
22b00 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f  n being built */
22b10 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20  .  int iTerm,   
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b30 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20  * Index of this 
22b40 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20  term.  First is 
22b50 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  zero */.  const 
22b60 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20  char *zColumn,  
22b70 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
22b80 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
22b90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
22ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22bb0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72  Name of the oper
22bc0 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ator */.){.  if(
22bd0 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33   iTerm ) sqlite3
22be0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
22bf0 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29  Str, " AND ", 5)
22c00 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
22c10 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
22c20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20  zColumn, -1);.  
22c30 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
22c40 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c  ppend(pStr, zOp,
22c50 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   1);.  sqlite3St
22c60 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
22c70 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f  r, "?", 1);.}../
22c80 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c  *.** Argument pL
22c90 65 76 65 6c 20 64 65 73 63 72 69 62 65 73 20 61  evel describes a
22ca0 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73 63   strategy for sc
22cb0 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61  anning table pTa
22cc0 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  b. This .** func
22cd0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
22ce0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
22cf0 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  ng buffer contai
22d00 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ning a descripti
22d10 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  on.** of the sub
22d20 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77  set of table row
22d30 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65  s scanned by the
22d40 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68 65   strategy in the
22d50 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53   form of an.** S
22d60 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f  QL expression. O
22d70 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61  r, if all rows a
22d80 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c  re scanned, NULL
22d90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
22da0 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
22db0 20 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a   if the query:.*
22dc0 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
22dd0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
22de0 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a  1 AND b>2;.**.**
22df0 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72   is run and ther
22e00 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e is an index on
22e10 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68   (a, b), then th
22e20 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
22e30 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20  rns a.** string 
22e40 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a  similar to:.**.*
22e50 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f  *   "a=? AND b>?
22e60 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ".**.** The retu
22e70 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69  rned pointer poi
22e80 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  nts to memory ob
22e90 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
22ea0 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a  te3DbMalloc()..*
22eb0 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
22ec0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
22ed0 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65  e caller to free
22ee0 20 74 68 65 20 62 75 66 66 65 72 20 77 68 65 6e   the buffer when
22ef0 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e   it is.** no lon
22f00 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f  ger required..*/
22f10 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78  .static char *ex
22f20 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
22f30 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
22f40 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
22f50 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
22f60 20 57 68 65 72 65 50 6c 61 6e 20 2a 70 50 6c 61   WherePlan *pPla
22f70 6e 20 3d 20 26 70 4c 65 76 65 6c 2d 3e 70 6c 61  n = &pLevel->pla
22f80 6e 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  n;.  Index *pInd
22f90 65 78 20 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70 49  ex = pPlan->u.pI
22fa0 64 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  dx;.  int nEq = 
22fb0 70 50 6c 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e  pPlan->nEq;.  in
22fc0 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e  t i, j;.  Column
22fd0 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61   *aCol = pTab->a
22fe0 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f  Col;.  int *aiCo
22ff0 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
23000 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63  iColumn;.  StrAc
23010 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20  cum txt;..  if( 
23020 6e 45 71 3d 3d 30 20 26 26 20 28 70 50 6c 61 6e  nEq==0 && (pPlan
23030 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
23040 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
23050 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d  RE_TOP_LIMIT))==
23060 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
23070 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
23080 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78  StrAccumInit(&tx
23090 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f  t, 0, 0, SQLITE_
230a0 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74  MAX_LENGTH);.  t
230b0 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71  xt.db = db;.  sq
230c0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
230d0 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20  end(&txt, " (", 
230e0 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  2);.  for(i=0; i
230f0 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nEq; i++){.    
23100 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
23110 6d 28 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b  m(&txt, i, aCol[
23120 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61  aiColumn[i]].zNa
23130 6d 65 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20  me, "=");.  }.. 
23140 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 50   j = i;.  if( pP
23150 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  lan->wsFlags&WHE
23160 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
23170 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a      char *z = (j
23180 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  ==pIndex->nColum
23190 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n ) ? "rowid" : 
231a0 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  aCol[aiColumn[j]
231b0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70  ].zName;.    exp
231c0 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
231d0 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22  txt, i++, z, ">"
231e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 6c  );.  }.  if( pPl
231f0 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  an->wsFlags&WHER
23200 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_TOP_LIMIT ){. 
23210 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d     char *z = (j=
23220 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
23230 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   ) ? "rowid" : a
23240 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Col[aiColumn[j]]
23250 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c  .zName;.    expl
23260 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
23270 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a  xt, i, z, "<");.
23280 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
23290 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
232a0 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74  , ")", 1);.  ret
232b0 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63  urn sqlite3StrAc
232c0 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b  cumFinish(&txt);
232d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
232e0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
232f0 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e  op unless curren
23300 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61  tly processing a
23310 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
23320 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  PLAN.** command.
23330 20 49 66 20 74 68 65 20 71 75 65 72 79 20 62 65   If the query be
23340 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20  ing compiled is 
23350 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
23360 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a   PLAN, a single.
23370 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64 64  ** record is add
23380 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ed to the output
23390 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
233a0 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61   table scan stra
233b0 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76  tegy in .** pLev
233c0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  el..*/.static vo
233d0 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61  id explainOneSca
233e0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
233f0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
23400 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
23410 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
23420 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
23430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
23440 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f  ble list this lo
23450 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a  op refers to */.
23460 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
23470 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
23480 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69    /* Scan to wri
23490 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70  te OP_Explain op
234a0 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  code for */.  in
234b0 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
234d0 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65   Value for "leve
234e0 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  l" column of out
234f0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  put */.  int iFr
23500 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  om,             
23510 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
23520 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c  e for "from" col
23530 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
23540 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
23550 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
23560 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
23570 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
23580 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a  reBegin() */.){.
23590 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
235a0 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
235b0 75 33 32 20 66 6c 61 67 73 20 3d 20 70 4c 65 76  u32 flags = pLev
235c0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
235d0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
235e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
235f0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
23600 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
23610 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
23620 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
23630 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
23640 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
23650 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23660 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
23670 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
23680 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
23690 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Msg;            
236a0 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
236b0 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74  o add to EQP out
236c0 70 75 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  put */.    sqlit
236d0 65 33 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20  e3_int64 nRow;  
236e0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
236f0 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  cted number of r
23700 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 73  ows visited by s
23710 63 61 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  can */.    int i
23720 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
23730 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65  lectId;  /* Sele
23740 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74  ct id (left-most
23750 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20   output column) 
23760 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61  */.    int isSea
23770 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  rch;            
23780 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
23790 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65   a SEARCH. False
237a0 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20   for SCAN. */.. 
237b0 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48     if( (flags&WH
237c0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
237d0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
237e0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
237f0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ) ) return;..   
23800 20 69 73 53 65 61 72 63 68 20 3d 20 28 70 4c 65   isSearch = (pLe
23810 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29  vel->plan.nEq>0)
23820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
23830 20 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42   (flags&(WHERE_B
23840 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
23850 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20  OP_LIMIT))!=0.  
23860 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77             || (w
23870 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45  ctrlFlags&(WHERE
23880 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45  _ORDERBY_MIN|WHE
23890 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29  RE_ORDERBY_MAX))
238a0 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  ;..    zMsg = sq
238b0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
238c0 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f   "%s", isSearch?
238d0 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29  "SEARCH":"SCAN")
238e0 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
238f0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
23900 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
23910 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
23920 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59 20  g, "%s SUBQUERY 
23930 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d  %d", zMsg,pItem-
23940 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
23950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d   }else{.      zM
23960 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
23970 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
23980 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d  %s TABLE %s", zM
23990 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  sg, pItem->zName
239a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
239b0 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
239c0 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
239d0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
239e0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53  db, zMsg, "%s AS
239f0 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
23a00 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
23a10 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
23a20 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
23a30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
23a40 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70  ar *zWhere = exp
23a50 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64  lainIndexRange(d
23a60 62 2c 20 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d  b, pLevel, pItem
23a70 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a  ->pTab);.      z
23a80 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
23a90 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
23aa0 22 25 73 20 55 53 49 4e 47 20 25 73 25 73 49 4e  "%s USING %s%sIN
23ab0 44 45 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67  DEX%s%s%s", zMsg
23ac0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 28 66  , .          ((f
23ad0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
23ae0 50 5f 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41  P_INDEX)?"AUTOMA
23af0 54 49 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20  TIC ":""),.     
23b00 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
23b10 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22  HERE_IDX_ONLY)?"
23b20 43 4f 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a  COVERING ":""),.
23b30 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
23b40 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
23b50 4e 44 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20  NDEX)?"":" "),. 
23b60 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
23b70 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
23b80 44 45 58 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d  DEX)?"": pLevel-
23b90 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  >plan.u.pIdx->zN
23ba0 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
23bb0 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a  zWhere.      );.
23bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
23bd0 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b  ree(db, zWhere);
23be0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66  .    }else if( f
23bf0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f  lags & (WHERE_RO
23c00 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
23c10 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20  ID_RANGE) ){.   
23c20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
23c30 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
23c40 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e  sg, "%s USING IN
23c50 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
23c60 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20  Y", zMsg);..    
23c70 20 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52    if( flags&WHER
23c80 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20  E_ROWID_EQ ){.  
23c90 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
23ca0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
23cb0 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
23cc0 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d=?)", zMsg);.  
23cd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
23ce0 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f  lags&WHERE_BOTH_
23cf0 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f  LIMIT)==WHERE_BO
23d00 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TH_LIMIT ){.    
23d10 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
23d20 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
23d30 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
23d40 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c  ? AND rowid<?)",
23d50 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
23d60 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48  lse if( flags&WH
23d70 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
23d80 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
23d90 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
23da0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
23db0 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid>?)", zMsg);
23dc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
23dd0 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50   flags&WHERE_TOP
23de0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
23df0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
23e00 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
23e10 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29  g, "%s (rowid<?)
23e20 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
23e30 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
23e40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
23e50 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73  UALTABLE.    els
23e60 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57  e if( (flags & W
23e70 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
23e80 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  E)!=0 ){.      s
23e90 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
23ea0 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c  o *pVtabIdx = pL
23eb0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74  evel->plan.u.pVt
23ec0 61 62 49 64 78 3b 0a 20 20 20 20 20 20 7a 4d 73  abIdx;.      zMs
23ed0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
23ee0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
23ef0 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  s VIRTUAL TABLE 
23f00 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d  INDEX %d:%s", zM
23f10 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
23f20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
23f30 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78  idxNum, pVtabIdx
23f40 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d  ->idxStr);.    }
23f50 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
23f60 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52  wctrlFlags&(WHER
23f70 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48  E_ORDERBY_MIN|WH
23f80 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29  ERE_ORDERBY_MAX)
23f90 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
23fa0 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
23fb0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
23fc0 49 4e 20 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77  IN );.      nRow
23fd0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
23fe0 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 28 73  .      nRow = (s
23ff0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 4c 65  qlite3_int64)pLe
24000 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  vel->plan.nRow;.
24010 20 20 20 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d      }.    zMsg =
24020 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
24030 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
24040 7e 25 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d  ~%lld rows)", zM
24050 73 67 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73  sg, nRow);.    s
24060 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
24070 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
24080 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72  iId, iLevel, iFr
24090 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e  om, zMsg, P4_DYN
240a0 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
240b0 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
240c0 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77  ainOneScan(u,v,w
240d0 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  ,x,y,z).#endif /
240e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
240f0 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  PLAIN */.../*.**
24100 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
24110 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
24120 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f  the iLevel-th lo
24130 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  op in the WHERE 
24140 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d  clause.** implem
24150 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62  entation describ
24160 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f  ed by pWInfo..*/
24170 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
24180 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  codeOneLoopStart
24190 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
241a0 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70  WInfo,   /* Comp
241b0 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  lete information
241c0 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45   about the WHERE
241d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
241e0 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
241f0 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c    /* Which level
24200 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   of pWInfo->a[] 
24210 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20  should be coded 
24220 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
24230 61 67 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ags,      /* One
24240 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
24250 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
24260 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
24270 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
24280 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  dy     /* Which 
24290 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65  tables are curre
242a0 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a  ntly available *
242b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  /.){.  int j, k;
242c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
242d0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
242e0 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
242f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
24300 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
24310 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
24320 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20   addrNxt;       
24330 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75    /* Where to ju
24340 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  mp to continue w
24350 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
24360 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d  case */.  int om
24370 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f  itTable;       /
24380 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65  * True if we use
24390 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   the index only 
243a0 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20  */.  int bRev;  
243b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
243c0 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
243d0 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
243e0 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  order */.  Where
243f0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
24400 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76  /* The where lev
24410 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  el to be coded *
24420 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
24430 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f  *pWC;    /* Deco
24440 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65  mposition of the
24450 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c   entire WHERE cl
24460 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  ause */.  WhereT
24470 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
24480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
24490 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
244a0 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
244b0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
244c0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
244d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64   context */.  Vd
244e0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24500 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
24510 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
24520 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75  ctions */.  stru
24530 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24540 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
24550 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
24560 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
24570 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20   int addrBrk;   
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24590 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
245a0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
245b0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
245c0 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20  addrCont;       
245d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
245e0 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
245f0 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63  inue with next c
24600 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  ycle */.  int iR
24610 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20  owidReg = 0;    
24620 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20      /* Rowid is 
24630 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72  stored in this r
24640 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20  egister, if not 
24650 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52  zero */.  int iR
24660 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20  eleaseReg = 0;  
24670 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
24680 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66  ster to free bef
24690 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f  ore returning */
246a0 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
246b0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76  nfo->pParse;.  v
246c0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
246d0 3b 0a 20 20 70 57 43 20 3d 20 70 57 49 6e 66 6f  ;.  pWC = pWInfo
246e0 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20  ->pWC;.  pLevel 
246f0 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65  = &pWInfo->a[iLe
24700 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d  vel];.  pTabItem
24710 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
24720 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
24730 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d  iFrom];.  iCur =
24740 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
24750 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 4c  or;.  bRev = (pL
24760 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
24770 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52  gs & WHERE_REVER
24780 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61  SE)!=0;.  omitTa
24790 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70  ble = (pLevel->p
247a0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
247b0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
247c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
247d0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
247e0 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29  ERE_FORCE_TABLE)
247f0 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  ==0;..  /* Creat
24800 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65  e labels for the
24810 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f   "break" and "co
24820 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74  ntinue" instruct
24830 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ions.  ** for th
24840 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20  e current loop. 
24850 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b   Jump to addrBrk
24860 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
24870 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75   a loop..  ** Ju
24880 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f  mp to cont to go
24890 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
248a0 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
248b0 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c  on of the.  ** l
248c0 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  oop..  **.  ** W
248d0 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20  hen there is an 
248e0 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20  IN operator, we 
248f0 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64  also have a "add
24900 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74  rNxt" label that
24910 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63  .  ** means to c
24920 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
24930 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63   next IN value c
24940 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65  ombination.  Whe
24950 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65  n.  ** there are
24960 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   no IN operators
24970 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69   in the constrai
24980 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78  nts, the "addrNx
24990 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73  t" label.  ** is
249a0 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64   the same as "ad
249b0 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61  drBrk"..  */.  a
249c0 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
249d0 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65  >addrBrk = pLeve
249e0 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c  l->addrNxt = sql
249f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
24a00 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74  l(v);.  addrCont
24a10 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
24a20 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
24a30 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
24a40 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
24a50 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
24a60 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
24a70 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61  JOIN, allocate a
24a80 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  nd.  ** initiali
24a90 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ze a memory cell
24aa0 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66   that records if
24ab0 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63   this table matc
24ac0 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77  hes any.  ** row
24ad0 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62   of the left tab
24ae0 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  le of the join..
24af0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
24b00 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  l->iFrom>0 && (p
24b10 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74  TabItem[0].joint
24b20 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
24b30 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  0 ){.    pLevel-
24b40 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70  >iLeftJoin = ++p
24b50 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
24b60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24b70 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
24b80 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 0, pLevel->iLe
24b90 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62  ftJoin);.    Vdb
24ba0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
24bb0 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d  it LEFT JOIN no-
24bc0 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20  match flag"));. 
24bd0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
24be0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
24bf0 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 65  ABLE.  if(  (pLe
24c00 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
24c10 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
24c20 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
24c30 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68    /* Case 0:  Th
24c40 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72  e table is a vir
24c50 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65  tual-table.  Use
24c60 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64   the VFilter and
24c70 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20   VNext.    **   
24c80 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
24c90 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a   the data..    *
24ca0 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20  /.    int iReg; 
24cb0 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
24cc0 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
24cd0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
24ce0 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78  x_info *pVtabIdx
24cf0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
24d00 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20  u.pVtabIdx;.    
24d10 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  int nConstraint 
24d20 3d 20 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f 6e  = pVtabIdx->nCon
24d30 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 73 74 72  straint;.    str
24d40 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
24d50 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
24d60 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20  ge *aUsage =.   
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74               pVt
24da0 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69  abIdx->aConstrai
24db0 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 63 6f 6e  ntUsage;.    con
24dc0 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  st struct sqlite
24dd0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
24de0 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20  nt *aConstraint 
24df0 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e    pVtabIdx->aCon
24e30 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 73 71  straint;..    sq
24e40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
24e50 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
24e60 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  iReg = sqlite3Ge
24e70 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
24e80 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  e, nConstraint+2
24e90 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  );.    for(j=1; 
24ea0 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  j<=nConstraint; 
24eb0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  j++){.      for(
24ec0 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69  k=0; k<nConstrai
24ed0 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; k++){.      
24ee0 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e    if( aUsage[k].
24ef0 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a  argvIndex==j ){.
24f00 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 54            int iT
24f10 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e  erm = aConstrain
24f20 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[k].iTermOffset
24f30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
24f40 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
24f50 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d  se, pWC->a[iTerm
24f60 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ].pExpr->pRight,
24f70 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20   iReg+j+1);.    
24f80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24fa0 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e       if( k==nCon
24fb0 73 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b  straint ) break;
24fc0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
24fd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24fe0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 56 74 61  OP_Integer, pVta
24ff0 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52  bIdx->idxNum, iR
25000 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
25010 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
25020 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69  _Integer, j-1, i
25030 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  Reg+1);.    sqli
25040 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
25050 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75   OP_VFilter, iCu
25060 72 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 65 67  r, addrBrk, iReg
25070 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53  , pVtabIdx->idxS
25080 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tr,.            
25090 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49            pVtabI
250a0 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  dx->needToFreeId
250b0 78 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54  xStr ? P4_MPRINT
250c0 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  F : P4_STATIC);.
250d0 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65      pVtabIdx->ne
250e0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
250f0 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
25100 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   j<nConstraint; 
25110 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
25120 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29  aUsage[j].omit )
25130 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54  {.        int iT
25140 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e  erm = aConstrain
25150 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[j].iTermOffset
25160 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  ;.        disabl
25170 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70  eTerm(pLevel, &p
25180 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20  WC->a[iTerm]);. 
25190 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
251a0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
251b0 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  _VNext;.    pLev
251c0 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
251d0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
251e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
251f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
25200 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
25210 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  pRange(pParse, i
25220 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  Reg, nConstraint
25230 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
25240 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
25250 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  rse, 1);.  }else
25260 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
25270 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
25280 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c  BLE */..  if( pL
25290 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
252a0 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
252b0 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _EQ ){.    /* Ca
252c0 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69  se 1:  We can di
252d0 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65  rectly reference
252e0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73   a single row us
252f0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  ing an.    **   
25300 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
25310 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
25320 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
25330 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20  ld.  Or.    **  
25340 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
25350 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
25360 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
25370 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
25380 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
25390 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  truct..    */.  
253a0 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20    iReleaseReg = 
253b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
253c0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  g(pParse);.    p
253d0 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
253e0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
253f0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
25400 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61 73  O_IN, 0);.    as
25410 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
25420 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
25430 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b  erm->pExpr!=0 );
25440 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
25450 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
25460 69 43 75 72 20 29 3b 0a 20 20 20 20 61 73 73 65  iCur );.    asse
25470 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
25480 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
25490 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
254a0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
254b0 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
254c0 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 69  5-11662 */.    i
254d0 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45  RowidReg = codeE
254e0 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
254f0 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
25500 6c 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  l, iReleaseReg);
25510 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
25520 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
25530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25540 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
25550 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67  BeInt, iRowidReg
25560 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
25570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25580 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
25590 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74  s, iCur, addrNxt
255a0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
255b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
255c0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
255d0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
255e0 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
255f0 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
25600 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
25610 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65   = OP_Noop;.  }e
25620 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
25630 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
25640 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
25650 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
25660 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69  2:  We have an i
25670 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72  nequality compar
25680 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
25690 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20   ROWID field..  
256a0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73    */.    int tes
256b0 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  tOp = OP_Noop;. 
256c0 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20     int start;.  
256d0 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75    int memEndValu
256e0 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65  e = 0;.    Where
256f0 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70  Term *pStart, *p
25700 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  End;..    assert
25710 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
25720 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 66  ;.    pStart = f
25730 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
25740 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
25750 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29   WO_GT|WO_GE, 0)
25760 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e  ;.    pEnd = fin
25770 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
25780 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
25790 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a  O_LT|WO_LE, 0);.
257a0 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
257b0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53        pTerm = pS
257c0 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61  tart;.      pSta
257d0 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  rt = pEnd;.     
257e0 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20   pEnd = pTerm;. 
257f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
25800 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
25810 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
25820 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
25830 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65  sion that define
25840 73 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  s the start boun
25850 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  d */.      int r
25860 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20  1, rTemp;       
25870 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f   /* Registers fo
25880 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74  r holding the st
25890 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a  art boundary */.
258a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
258b0 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74  llowing constant
258c0 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65   maps TK_xx code
258d0 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e  s into correspon
258e0 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73  ding .      ** s
258f0 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74  eek opcodes.  It
25900 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61   depends on a pa
25910 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e  rticular orderin
25920 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20  g of TK_xx.     
25930 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
25940 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b  u8 aMoveOp[] = {
25950 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
25960 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GT */  OP_Seek
25970 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Gt,.           /
25980 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53  * TK_LE */  OP_S
25990 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20  eekLe,.         
259a0 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f    /* TK_LT */  O
259b0 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20  P_SeekLt,.      
259c0 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f       /* TK_GE */
259d0 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20    OP_SeekGe.    
259e0 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72    };.      asser
259f0 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b  t( TK_LE==TK_GT+
25a00 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b  1 );      /* Mak
25a10 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72  e sure the order
25a20 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ing.. */.      a
25a30 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
25a40 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+2 );      /*
25a50 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f    ... of the TK_
25a60 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a  xx values... */.
25a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
25a80 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20  _GE==TK_GT+3 ); 
25a90 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20       /*  ... is 
25aa0 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20  correcct. */..  
25ab0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
25ac0 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
25ad0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
25ae0 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
25af0 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 70 58  1662 */.      pX
25b00 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
25b10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25b20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pX!=0 );.      a
25b30 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c  ssert( pStart->l
25b40 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
25b50 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
25b60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
25b70 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
25b80 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20  ight, &rTemp);. 
25b90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25ba0 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f  AddOp3(v, aMoveO
25bb0 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c  p[pX->op-TK_GT],
25bc0 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
25bd0 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
25be0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
25bf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25c00 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
25c10 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
25c20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  r1, 1);.      sq
25c30 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
25c40 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d  Reg(pParse, rTem
25c50 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c  p);.      disabl
25c60 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53  eTerm(pLevel, pS
25c70 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tart);.    }else
25c80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
25c90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
25ca0 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
25cb0 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61  _Rewind, iCur, a
25cc0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  ddrBrk);.    }. 
25cd0 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
25ce0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
25cf0 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
25d00 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
25d10 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
25d20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
25d30 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
25d40 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ur );.      test
25d50 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
25d60 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
25d70 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
25d80 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
25d90 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20      memEndValue 
25da0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
25db0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25dc0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
25dd0 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45  pX->pRight, memE
25de0 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  ndValue);.      
25df0 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  if( pX->op==TK_L
25e00 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  T || pX->op==TK_
25e10 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  GT ){.        te
25e20 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
25e30 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
25e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25e50 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
25e60 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
25e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
25e80 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
25e90 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a  l, pEnd);.    }.
25ea0 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
25eb0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
25ec0 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65  dr(v);.    pLeve
25ed0 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
25ee0 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
25ef0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
25f00 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
25f10 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
25f20 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 3d  .    if( pStart=
25f30 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b  =0 && pEnd==0 ){
25f40 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
25f50 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
25f60 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
25f70 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
25f80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
25f90 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
25fa0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73     }.    if( tes
25fb0 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
25fc0 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20        iRowidReg 
25fd0 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  = iReleaseReg = 
25fe0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
25ff0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
26000 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26010 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
26020 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
26030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26040 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
26050 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
26060 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
26070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26080 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d  Op3(v, testOp, m
26090 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72  emEndValue, addr
260a0 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Brk, iRowidReg);
260b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
260c0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
260d0 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
260e0 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
260f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NULL);.    }.  }
26100 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
26110 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
26120 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
26130 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  NGE|WHERE_COLUMN
26140 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43  _EQ) ){.    /* C
26150 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75 73  ase 3: A scan us
26160 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ing an index..  
26170 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
26180 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63 6c      The WHERE cl
26190 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  ause may contain
261a0 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71   zero or more eq
261b0 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20  uality .    **  
261c0 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d         terms ("=
261d0 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61  =" or "IN" opera
261e0 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65 72  tors) that refer
261f0 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a   to the N.    **
26200 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f           left-mo
26210 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  st columns of th
26220 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20  e index. It may 
26230 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  also contain.   
26240 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71   **         ineq
26250 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
26260 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20  ts (>, <, >= or 
26270 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  <=) on the index
26280 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ed.    **       
26290 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d    column that im
262a0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
262b0 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69  s the N equaliti
262c0 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a  es. Only .    **
262d0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
262e0 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63  ht-most column c
262f0 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c  an be an inequal
26300 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d  ity - the rest m
26310 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ust.    **      
26320 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20     use the "==" 
26330 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f  and "IN" operato
26340 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  rs. For example,
26350 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   if the .    ** 
26360 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69 73          index is
26370 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65   on (x,y,z), the
26380 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
26390 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20  clauses are all 
263a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
263b0 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a  optimized:.    *
263c0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
263d0 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20      x=5.    **  
263e0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
263f0 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y=10.    **   
26400 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
26410 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
26420 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
26430 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  y>5 AND y<10.   
26440 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
26450 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a  =5 AND y=5 AND z
26460 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  <=10.    **.    
26470 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 7a  **         The z
26480 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20  <10 term of the 
26490 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74  following cannot
264a0 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20   be used, only. 
264b0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
264c0 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20  e x=5 term:.    
264d0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
264e0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31       x=5 AND z<1
264f0 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
26500 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65          N may be
26510 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
26520 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  re inequality co
26530 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a  nstraints..    *
26540 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65  *         If the
26550 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61  re are no inequa
26560 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
26570 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20  , then N is at. 
26580 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65     **         le
26590 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a  ast one..    **.
265a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
265b0 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
265c0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65   used when there
265d0 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
265e0 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  ause.    **     
265f0 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20      constraints 
26600 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20  but an index is 
26610 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c  selected anyway,
26620 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a   in order.    **
26630 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63           to forc
26640 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64  e the output ord
26650 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f  er to conform to
26660 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20   an ORDER BY..  
26670 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69    */  .    stati
26680 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
26690 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  tOp[] = {.      
266a0 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20  0,.      0,.    
266b0 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20    OP_Rewind,    
266c0 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73         /* 2: (!s
266d0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
266e0 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
266f0 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
26700 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20  OP_Last,        
26710 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61       /* 3: (!sta
26720 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
26730 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62  & startEq &&   b
26740 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
26750 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20  _SeekGt,        
26760 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f     /* 4: (start_
26770 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
26780 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65  !startEq && !bRe
26790 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
267a0 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20  eekLt,          
267b0 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f   /* 5: (start_co
267c0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
267d0 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
267e0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
267f0 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGe,           /
26800 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 6: (start_cons
26810 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
26820 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
26830 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
26840 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
26850 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  7: (start_constr
26860 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
26870 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
26880 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69      };.    stati
26890 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f  c const u8 aEndO
268a0 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50  p[] = {.      OP
268b0 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  _Noop,          
268c0 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63     /* 0: (!end_c
268d0 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20  onstraints) */. 
268e0 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20       OP_IdxGE,  
268f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20            /* 1: 
26900 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
26910 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
26920 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20      OP_IdxLT    
26930 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
26940 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
26950 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  && bRev) */.    
26960 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  };.    int nEq =
26970 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45   pLevel->plan.nE
26980 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  q;  /* Number of
26990 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20   == or IN terms 
269a0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e  */.    int isMin
269b0 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Query = 0;      
269c0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
269d0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53  s an optimized S
269e0 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a  ELECT min(x).. *
269f0 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73  /.    int regBas
26a00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
26a10 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73     /* Base regis
26a20 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73  ter holding cons
26a30 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f  traint values */
26a40 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20  .    int r1;    
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a60 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
26a70 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  er */.    WhereT
26a80 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74  erm *pRangeStart
26a90 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61   = 0;  /* Inequa
26aa0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
26ab0 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a  at range start *
26ac0 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
26ad0 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20  *pRangeEnd = 0; 
26ae0 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79     /* Inequality
26af0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
26b00 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  ange end */.    
26b10 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20  int startEq;    
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b30 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74  True if range st
26b40 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  art uses ==, >= 
26b50 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
26b60 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20   endEq;         
26b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
26b80 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75  e if range end u
26b90 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
26ba0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
26bb0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20  t_constraints;  
26bc0 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
26bd0 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72   range is constr
26be0 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ained */.    int
26bf0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20   nConstraint;   
26c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26c10 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  ber of constrain
26c20 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49  t terms */.    I
26c30 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
26c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26c50 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c  he index we will
26c60 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20   be using */.   
26c70 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20   int iIdxCur;   
26c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c90 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
26ca0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a   for the index *
26cb0 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61  /.    int nExtra
26cc0 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
26cd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26ce0 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
26cf0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e  needed */.    in
26d00 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
26d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26d20 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65  struction opcode
26d30 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
26d40 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20  tartAff;        
26d50 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
26d60 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61   for start of ra
26d70 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  nge constraint *
26d80 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64  /.    char *zEnd
26d90 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
26da0 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
26db0 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20  or end of range 
26dc0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20  constraint */.. 
26dd0 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
26de0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
26df0 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
26e00 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
26e10 20 20 6b 20 3d 20 28 6e 45 71 3d 3d 70 49 64 78    k = (nEq==pIdx
26e20 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a  ->nColumn ? -1 :
26e30 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
26e40 6e 45 71 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  nEq]);..    /* I
26e50 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69  f this loop sati
26e60 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64  sfies a sort ord
26e70 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65  er (pOrderBy) re
26e80 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20  quest that .    
26e90 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  ** was passed to
26ea0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
26eb0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53  o implement a "S
26ec0 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e  ELECT min(x) ...
26ed0 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c  " .    ** query,
26ee0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
26ef0 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77   will only allow
26f00 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e   the loop to run
26f10 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69   for.    ** a si
26f20 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20  ngle iteration. 
26f30 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
26f40 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65  the first row re
26f50 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68  turned.    ** sh
26f60 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20  ould not have a 
26f70 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65  NULL value store
26f80 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c  d in 'x'. If col
26f90 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a  umn 'x' is.    *
26fa0 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20  * the first one 
26fb0 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71  after the nEq eq
26fc0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
26fd0 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ts in the index,
26fe0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71  .    ** this req
26ff0 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69  uires some speci
27000 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
27010 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74   */.    if( (wct
27020 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
27030 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
27040 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70     && (pLevel->p
27050 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52  lan.wsFlags&WHER
27060 45 5f 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20  E_ORDERBY).     
27070 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  && (pIdx->nColum
27080 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  n>nEq).    ){.  
27090 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
270a0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
270b0 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  1 ); */.      /*
270c0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
270d0 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  y->a[0].pExpr->i
270e0 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
270f0 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a  Column[nEq] ); *
27100 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  /.      isMinQue
27110 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
27120 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
27130 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
27140 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
27150 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
27160 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
27170 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
27180 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
27190 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
271a0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
271b0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
271c0 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
271d0 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d  geEnd = findTerm
271e0 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
271f0 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c  otReady, (WO_LT|
27200 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20  WO_LE), pIdx);. 
27210 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
27220 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
27230 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
27240 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
27250 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
27260 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20    pRangeStart = 
27270 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
27280 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
27290 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20   (WO_GT|WO_GE), 
272a0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78  pIdx);.      nEx
272b0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
272c0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  }..    /* Genera
272d0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
272e0 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
272f0 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
27300 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61  = or IN.    ** a
27310 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  nd store the val
27320 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
27330 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ms in an array o
27340 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
27350 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  ** starting at r
27360 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  egBase..    */. 
27370 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64     regBase = cod
27380 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
27390 73 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  s(.        pPars
273a0 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20  e, pLevel, pWC, 
273b0 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78 74 72 61  notReady, nExtra
273c0 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66 66 0a  Reg, &zStartAff.
273d0 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64 41      );.    zEndA
273e0 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
273f0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
27400 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
27410 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
27420 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
27430 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
27440 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
27450 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
27460 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
27470 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
27480 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
27490 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
274a0 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
274b0 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
274c0 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
274d0 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
274e0 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
274f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e     */.    if( (n
27500 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  Eq<pIdx->nColumn
27510 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d   && bRev==(pIdx-
27520 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
27530 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
27540 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20  ).     || (bRev 
27550 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  && pIdx->nColumn
27560 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  ==nEq).    ){.  
27570 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
27580 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
27590 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
275a0 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
275b0 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
275c0 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  && pRangeStart->
275d0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
275e0 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
275f0 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
27600 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  & pRangeStart->e
27610 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45  Operator & WO_GE
27620 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
27630 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70  ( pRangeEnd && p
27640 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
27650 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
27660 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
27670 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65  ngeEnd && pRange
27680 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
27690 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74   WO_GE );.    st
276a0 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53  artEq = !pRangeS
276b0 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74  tart || pRangeSt
276c0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
276d0 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
276e0 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70      endEq =   !p
276f0 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e  RangeEnd || pRan
27700 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
27710 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
27720 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73  ;.    start_cons
27730 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65  traints = pRange
27740 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a  Start || nEq>0;.
27750 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
27760 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
27770 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
27780 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
27790 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
277a0 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
277b0 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  eStart ){.      
277c0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
277d0 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70  RangeStart->pExp
277e0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
277f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27800 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
27810 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
27820 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
27830 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
27840 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
27850 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27860 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
27870 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
27880 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
27890 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rNxt);.      }. 
278a0 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41       if( zStartA
278b0 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
278c0 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
278d0 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
278e0 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
278f0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
27900 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  E){.          /*
27910 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
27920 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
27930 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
27940 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
27950 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
27960 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
27970 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
27980 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
27990 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
279a0 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
279b0 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20  FF_NONE.  */.   
279c0 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
279d0 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
279e0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
279f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
27a00 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
27a10 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
27a20 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66  pRight, zStartAf
27a30 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
27a40 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
27a50 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
27a60 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
27a70 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
27a80 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
27a90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27aa0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
27ab0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
27ac0 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
27ad0 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
27ae0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d     }else if( isM
27af0 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20  inQuery ){.     
27b00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27b10 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
27b20 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
27b30 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
27b40 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74  t++;.      start
27b50 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  Eq = 0;.      st
27b60 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
27b70 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  = 1;.    }.    c
27b80 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
27b90 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
27ba0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a  , nConstraint, z
27bb0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f  StartAff);.    o
27bc0 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74  p = aStartOp[(st
27bd0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c  art_constraints<
27be0 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c  <2) + (startEq<<
27bf0 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20  1) + bRev];.    
27c00 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b  assert( op!=0 );
27c10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
27c20 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a  p==OP_Rewind );.
27c30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
27c40 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
27c50 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
27c60 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20  P_SeekGt );.    
27c70 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
27c80 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74  _SeekGe );.    t
27c90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
27ca0 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65  SeekLe );.    te
27cb0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
27cc0 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c  eekLt );.    sql
27cd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
27ce0 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
27cf0 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
27d00 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
27d10 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
27d20 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
27d30 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
27d40 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e  traint at the en
27d50 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
27d60 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a  range (if any)..
27d70 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73      */.    nCons
27d80 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
27d90 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20    if( pRangeEnd 
27da0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
27db0 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e  Right = pRangeEn
27dc0 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  d->pExpr->pRight
27dd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27de0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
27df0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e  Parse, regBase+n
27e00 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  Eq, 1);.      sq
27e10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
27e20 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
27e30 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
27e40 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64    if( (pRangeEnd
27e50 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
27e60 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
27e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27e80 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
27e90 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
27ea0 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
27eb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27ec0 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20  if( zEndAff ){. 
27ed0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
27ee0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
27ef0 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66  y(pRight, zEndAf
27f00 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f  f[nEq])==SQLITE_
27f10 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20  AFF_NONE){.     
27f20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68       /* Since th
27f30 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
27f40 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
27f50 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69  with no conversi
27f60 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ons.          **
27f70 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20   applied to the 
27f80 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68  operands, set th
27f90 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70  e affinity to ap
27fa0 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f  ply to pRight to
27fb0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53   .          ** S
27fc0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
27fd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45   */.          zE
27fe0 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  ndAff[nEq] = SQL
27ff0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
28000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28010 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
28020 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
28030 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e  ange(pRight, zEn
28040 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  dAff[nEq]) ){.  
28050 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b          zEndAff[
28060 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
28070 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
28080 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
28090 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
280a0 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
280b0 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64  ase, nEq+1, zEnd
280c0 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e  Aff);.      nCon
280d0 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
280e0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
280f0 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
28100 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
28110 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
28120 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  1662 */.    }.  
28130 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
28140 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61  pParse->db, zSta
28150 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69  rtAff);.    sqli
28160 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
28170 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a  ->db, zEndAff);.
28180 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  .    /* Top of t
28190 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  he loop body */.
281a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
281b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
281c0 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20  entAddr(v);..   
281d0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
281e0 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73   index cursor is
281f0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
28200 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
28210 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28     op = aEndOp[(
28220 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71  pRangeEnd || nEq
28230 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b  ) * (1 + bRev)];
28240 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
28250 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20  p==OP_Noop );.  
28260 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
28270 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20  OP_IdxGE );.    
28280 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
28290 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66  _IdxLT );.    if
282a0 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ( op!=OP_Noop ){
282b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
282c0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
282d0 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
282e0 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
282f0 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
28300 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
28310 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d  ngeP5(v, endEq!=
28320 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20  bRev ?1:0);.    
28330 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
28340 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
28350 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63  y constraints, c
28360 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
28370 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  lue.    ** of th
28380 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74  e table column t
28390 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69  hat the inequali
283a0 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20  ty contrains is 
283b0 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a  not NULL..    **
283c0 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20   If it is, jump 
283d0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
283e0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
283f0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31  p..    */.    r1
28400 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
28410 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
28420 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76    testcase( pLev
28430 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
28440 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
28450 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IT );.    testca
28460 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
28470 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
28480 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _TOP_LIMIT );.  
28490 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
284a0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57  lan.wsFlags & (W
284b0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
284c0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29  HERE_TOP_LIMIT))
284d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
284e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
284f0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
28500 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a  xCur, nEq, r1);.
28510 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28520 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
28530 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f  Null, r1, addrCo
28540 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nt);.    }.    s
28550 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
28560 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
28570 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  ;..    /* Seek t
28580 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c  he table cursor,
28590 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
285a0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
285b0 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74  pLevel, pRangeSt
285c0 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c  art);.    disabl
285d0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
285e0 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66  angeEnd);.    if
285f0 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  ( !omitTable ){.
28600 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20        iRowidReg 
28610 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  = iReleaseReg = 
28620 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
28630 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
28640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28650 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  p2(v, OP_IdxRowi
28660 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77  d, iIdxCur, iRow
28670 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
28680 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
28690 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
286a0 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
286b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
286c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
286d0 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77  Seek, iCur, iRow
286e0 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65  idReg);  /* Defe
286f0 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20  rred seek */.   
28700 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   }..    /* Recor
28710 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
28720 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
28730 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69  ate the loop. Di
28740 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48  sable .    ** WH
28750 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
28760 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20   made redundant 
28770 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e  by the index ran
28780 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a  ge scan..    */.
28790 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
287a0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
287b0 48 45 52 45 5f 55 4e 49 51 55 45 20 29 7b 0a 20  HERE_UNIQUE ){. 
287c0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
287d0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d  = OP_Noop;.    }
287e0 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b  else if( bRev ){
287f0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
28800 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20  p = OP_Prev;.   
28810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
28820 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65  evel->op = OP_Ne
28830 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  xt;.    }.    pL
28840 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43  evel->p1 = iIdxC
28850 75 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  ur;.    if( pLev
28860 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
28870 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f 53   & WHERE_COVER_S
28880 43 41 4e 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  CAN ){.      pLe
28890 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
288a0 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
288b0 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d  SCAN_STEP;.    }
288c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
288d0 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d  rt( pLevel->p5==
288e0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  0 );.    }.  }el
288f0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
28900 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
28910 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c  IZATION.  if( pL
28920 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
28930 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
28940 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _OR ){.    /* Ca
28950 73 65 20 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f  se 4:  Two or mo
28960 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e  re separately in
28970 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
28980 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20  ected by OR.    
28990 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
289a0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
289b0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
289c0 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
289d0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
289e0 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
289f0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
28a00 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
28a10 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
28a20 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  TE INDEX i3 ON t
28a30 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  1(c);.    **.   
28a40 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
28a50 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
28a60 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31   OR b=7 OR (c=11
28a70 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a   AND d=13).    *
28a80 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20  *.    ** In the 
28a90 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61  example, there a
28aa0 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64  re three indexed
28ab0 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
28ac0 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54   by OR..    ** T
28ad0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
28ae0 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  op looks like th
28af0 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
28b00 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
28b10 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
28b20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
28b30 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
28b40 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  1.    **.    ** 
28b50 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69  Then, for each i
28b60 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65  ndexed term, the
28b70 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20   following. The 
28b80 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
28b90 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61   ** RowSetTest a
28ba0 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65  re such that the
28bb0 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75   rowid of the cu
28bc0 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73  rrent row is ins
28bd0 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74  erted.    ** int
28be0 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66  o the RowSet. If
28bf0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
28c00 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20  resent, control 
28c10 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a  skips the.    **
28c20 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e   Gosub opcode an
28c30 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74  d jumps straight
28c40 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
28c50 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45  erated by WhereE
28c60 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nd()..    **.   
28c70 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
28c80 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65  e3WhereBegin(<te
28c90 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  rm>).    **     
28ca0 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20       RowSetTest 
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cc0 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20   # Insert rowid 
28cd0 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20  into rowset.    
28ce0 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  **          Gosu
28cf0 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a  b      2 A.    *
28d00 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
28d10 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a  WhereEnd().    *
28d20 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69  *.    ** Followi
28d30 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f  ng the above, co
28d40 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  de to terminate 
28d50 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  the loop. Label 
28d60 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20  A, the target.  
28d70 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75    ** of the Gosu
28d80 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74  b above, jumps t
28d90 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
28da0 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  n right after th
28db0 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20  e Goto..    **. 
28dc0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
28dd0 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
28de0 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
28df0 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
28e00 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20  reg 1.    **    
28e10 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20        Goto      
28e20 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20   B              
28e30 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20    # The loop is 
28e40 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a  finished..    **
28e50 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a  .    **       A:
28e60 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20   <loop body>    
28e70 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52               # R
28e80 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74  eturn data, what
28e90 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ever..    **.   
28ea0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74   **          Ret
28eb0 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20  urn     2       
28ec0 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20           # Jump 
28ed0 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75  back to the Gosu
28ee0 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  b.    **.    ** 
28ef0 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20        B: <after 
28f00 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a  the loop>.    **
28f10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72  .    */.    Wher
28f20 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20  eClause *pOrWc; 
28f30 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61     /* The OR-cla
28f40 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69  use broken out i
28f50 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
28f60 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72      SrcList *pOr
28f70 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68  Tab;       /* Sh
28f80 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69  ortened table li
28f90 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20  st or OR-clause 
28fa0 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
28fb0 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20    Index *pCov = 
28fc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
28fd0 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65  * Potential cove
28fe0 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e  ring index (or N
28ff0 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ULL) */.    int 
29000 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65  iCovCur = pParse
29010 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75  ->nTab++;  /* Cu
29020 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e  rsor used for in
29030 64 65 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e  dex scans (if an
29040 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72  y) */..    int r
29050 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
29060 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20  rse->nMem;      
29070 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
29080 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f   used with OP_Go
29090 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  sub */.    int r
290a0 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20  egRowset = 0;   
290b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290c0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
290d0 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65   for RowSet obje
290e0 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ct */.    int re
290f0 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20  gRowid = 0;     
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29110 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
29120 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f  holding rowid */
29130 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f  .    int iLoopBo
29140 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dy = sqlite3Vdbe
29150 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
29160 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20  * Start of loop 
29170 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  body */.    int 
29180 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20  iRetInit;       
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
291b0 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e   of regReturn in
291c0 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e  it */.    int un
291d0 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b  testedTerms = 0;
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
291f0 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63  Some terms not c
29200 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64  ompletely tested
29210 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   */.    int ii; 
29220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
29240 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
29250 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72    Expr *pAndExpr
29260 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
29270 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41       /* An ".. A
29280 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73  ND (...)" expres
29290 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20  sion */.   .    
292a0 70 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e  pTerm = pLevel->
292b0 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20 20  plan.u.pTerm;.  
292c0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
292d0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
292e0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
292f0 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20 20 20  or==WO_OR );.   
29300 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
29310 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
29320 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20  ORINFO)!=0 );.  
29330 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d    pOrWc = &pTerm
29340 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
29350 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
29360 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20  = OP_Return;.   
29370 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65   pLevel->p1 = re
29380 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a  gReturn;..    /*
29390 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72   Set up a new Sr
293a0 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20  cList in pOrTab 
293b0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
293c0 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e  able being scann
293d0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
293e0 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b  s loop in the a[
293f0 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20  0] slot and all 
29400 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20  notReady tables 
29410 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e  in a[1..] slots.
29420 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63  .    ** This bec
29430 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74  omes the SrcList
29440 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
29450 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
29460 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20  3WhereBegin().. 
29470 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57     */.    if( pW
29480 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
29490 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74  {.      int nNot
294a0 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
294b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
294c0 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79  mber of notReady
294d0 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
294e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
294f0 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20  item *origSrc;  
29500 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
29510 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
29520 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79  .      nNotReady
29530 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
29540 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a  l - iLevel - 1;.
29550 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73        pOrTab = s
29560 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
29570 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  Raw(pParse->db,.
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29590 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
295a0 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f  of(*pOrTab)+ nNo
295b0 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f  tReady*sizeof(pO
295c0 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  rTab->a[0]));.  
295d0 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d      if( pOrTab==
295e0 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65  0 ) return notRe
295f0 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  ady;.      pOrTa
29600 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36  b->nAlloc = (i16
29610 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
29620 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
29630 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
29640 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
29650 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
29660 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
29670 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
29680 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
29690 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
296a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
296b0 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
296c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
296d0 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
296e0 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
296f0 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
29700 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
29710 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
29720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
29730 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
29740 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
29750 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
29760 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
29770 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
29780 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
29790 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
297a0 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
297b0 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20  mpty rowset..   
297c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20   **.    ** Also 
297d0 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65  initialize regRe
297e0 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20  turn to contain 
297f0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
29800 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  he instruction .
29810 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
29820 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
29830 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68   OP_Return at th
29840 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
29850 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a  loop. This.    *
29860 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  * is required in
29870 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c   a few obscure L
29880 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77  EFT JOIN cases w
29890 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d  here control jum
298a0 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  ps.    ** over t
298b0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
298c0 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  op into the body
298d0 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20   of it. In this 
298e0 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  case the .    **
298f0 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73   correct respons
29900 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66  e for the end-of
29910 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20  -loop code (the 
29920 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f  OP_Return) is to
29930 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68   .    ** fall th
29940 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
29950 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a  t instruction, j
29960 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78  ust as an OP_Nex
29970 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a  t does if.    **
29980 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e   called on an un
29990 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73  initialized curs
299a0 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
299b0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
299c0 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
299d0 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
299e0 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b    regRowset = ++
299f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
29a00 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
29a10 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
29a20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29a30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
29a40 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29  l, 0, regRowset)
29a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74  ;.    }.    iRet
29a60 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Init = sqlite3Vd
29a70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
29a80 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65  nteger, 0, regRe
29a90 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  turn);..    /* I
29aa0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  f the original W
29ab0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a  HERE clause is z
29ac0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28   of the form:  (
29ad0 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
29ae0 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68   AND y.    ** Th
29af0 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  en for every ter
29b00 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61  m xN, evaluate a
29b10 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  s the subexpress
29b20 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20  ion: xN AND z.  
29b30 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74    ** That way, t
29b40 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61  erms in y that a
29b50 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f  re factored into
29b60 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e   the disjunction
29b70 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
29b80 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65  picked up by the
29b90 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
29ba0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
29bb0 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20  Begin() below.. 
29bc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74     **.    ** Act
29bd0 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65  ually, each sube
29be0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
29bf0 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e  verted to "xN AN
29c00 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a  D w" where w is.
29c10 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65      ** the "inte
29c20 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f  resting" terms o
29c30 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74  f z - terms that
29c40 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
29c50 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  te in the.    **
29c60 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
29c70 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
29c80 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68  IN, and terms th
29c90 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73  at are usable as
29ca0 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73   .    ** indices
29cb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29cc0 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b   pWC->nTerm>1 ){
29cd0 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d  .      int iTerm
29ce0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72  ;.      for(iTer
29cf0 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e  m=0; iTerm<pWC->
29d00 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b  nTerm; iTerm++){
29d10 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
29d20 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54  Expr = pWC->a[iT
29d30 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  erm].pExpr;.    
29d40 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
29d50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
29d60 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f  P_FromJoin) ) co
29d70 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
29d80 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d  if( pWC->a[iTerm
29d90 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ].wtFlags & (TER
29da0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 4f  M_VIRTUAL|TERM_O
29db0 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75  RINFO) ) continu
29dc0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
29dd0 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f  pWC->a[iTerm].eO
29de0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
29df0 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
29e00 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d  .        pExpr =
29e10 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
29e20 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
29e30 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
29e40 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
29e50 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
29e60 3e 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70  >db, pAndExpr, p
29e70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
29e80 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70       if( pAndExp
29e90 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e  r ){.        pAn
29ea0 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  dExpr = sqlite3P
29eb0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
29ec0 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72  AND, 0, pAndExpr
29ed0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
29ee0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d    }..    for(ii=
29ef0 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65  0; ii<pOrWc->nTe
29f00 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rm; ii++){.     
29f10 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
29f20 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  erm = &pOrWc->a[
29f30 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ii];.      if( p
29f40 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
29f50 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 70 4f 72 54  or==iCur || pOrT
29f60 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
29f70 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20  WO_AND ){.      
29f80 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75    WhereInfo *pSu
29f90 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  bWInfo;         
29fa0 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e   /* Info for sin
29fb0 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e  gle OR-term scan
29fc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
29fd0 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54   *pOrExpr = pOrT
29fe0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
29ff0 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72      if( pAndExpr
2a000 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41   ){.          pA
2a010 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
2a020 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20  pOrExpr;.       
2a030 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e     pOrExpr = pAn
2a040 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  dExpr;.        }
2a050 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
2a060 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
2a070 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
2a080 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
2a090 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62 57  */.        pSubW
2a0a0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
2a0b0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
2a0c0 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72   pOrTab, pOrExpr
2a0d0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0f0 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
2a100 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e  CLOSE | WHERE_AN
2a110 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20  D_ONLY |.       
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a130 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
2a140 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41  LE | WHERE_ONETA
2a150 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75  BLE_ONLY, iCovCu
2a160 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
2a170 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c  rt( pSubWInfo ||
2a180 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2a190 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
2a1a0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
2a1b0 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
2a1c0 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
2a1d0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  WhereLevel *pLvl
2a1e0 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c  ;.          expl
2a1f0 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
2a200 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
2a210 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57  , pOrTab, &pSubW
2a220 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76  Info->a[0], iLev
2a230 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  el, pLevel->iFro
2a240 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29  m, 0.          )
2a250 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a260 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2a270 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
2a280 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  K)==0 ){.       
2a290 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20       int iSet = 
2a2a0 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65  ((ii==pOrWc->nTe
2a2b0 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20  rm-1)?-1:ii);.  
2a2c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b            int r;
2a2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d  .            r =
2a2e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2a2f0 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
2a300 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
2a310 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20  , -1, iCur, .   
2a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a340 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20        regRowid, 
2a350 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2a360 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a370 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65  4Int(v, OP_RowSe
2a380 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74  tTest, regRowset
2a390 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
2a3c0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20  rrentAddr(v)+2, 
2a3d0 72 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20  r, iSet);.      
2a3e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a3f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a400 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2a410 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42  egReturn, iLoopB
2a420 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ody);..         
2a430 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66   /* The pSubWInf
2a440 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
2a450 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74   flag means that
2a460 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20   this OR term.  
2a470 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
2a480 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ined one or more
2a490 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61   AND term from a
2a4a0 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e   notReady table.
2a4b0 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20    The.          
2a4c0 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  ** terms from th
2a4d0 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  e notReady table
2a4e0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65   could not be te
2a4f0 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20  sted and will.  
2a500 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20          ** need 
2a510 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74  to be tested lat
2a520 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  er..          */
2a530 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2a540 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  SubWInfo->untest
2a550 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74  edTerms ) untest
2a560 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20  edTerms = 1;..  
2a570 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
2a580 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e  l of the OR-conn
2a590 65 63 74 65 64 20 74 65 72 6d 73 20 61 72 65 20  ected terms are 
2a5a0 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
2a5b0 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20  the same.       
2a5c0 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64     ** index, and
2a5d0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70   the index is op
2a5e0 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ened using the s
2a5f0 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ame cursor numbe
2a600 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  r.          ** b
2a610 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73  y each call to s
2a620 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2a630 28 29 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  () made by this 
2a640 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20  loop, it may.   
2a650 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73         ** be pos
2a660 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61  sible to use tha
2a670 74 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76  t index as a cov
2a680 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20  ering index..   
2a690 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2a6a0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61      ** If the ca
2a6b0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
2a6c0 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20  reBegin() above 
2a6d0 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63  resulted in a sc
2a6e0 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  an that.        
2a6f0 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64    ** uses an ind
2a700 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ex, and this is 
2a710 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73 74  either the first
2a720 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
2a730 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  rm.          ** 
2a740 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65  processed or the
2a750 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 73 61   index is the sa
2a760 6d 65 20 61 73 20 74 68 61 74 20 75 73 65 64 20  me as that used 
2a770 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a  by all previous.
2a780 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72            ** ter
2a790 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20  ms, set pCov to 
2a7a0 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f  the candidate co
2a7b0 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74  vering index. Ot
2a7c0 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20  herwise, set .  
2a7d0 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20          ** pCov 
2a7e0 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63  to NULL to indic
2a7f0 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64  ate that no cand
2a800 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
2a810 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20  ndex will .     
2a820 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c       ** be avail
2a830 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  able..          
2a840 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  */.          pLv
2a850 6c 20 3d 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e  l = &pSubWInfo->
2a860 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  a[0];.          
2a870 69 66 28 20 28 70 4c 76 6c 2d 3e 70 6c 61 6e 2e  if( (pLvl->plan.
2a880 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2a890 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
2a8a0 20 20 20 20 20 20 20 26 26 20 28 70 4c 76 6c 2d         && (pLvl-
2a8b0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2a8c0 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2a8d0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2a8e0 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 4c 76  && (ii==0 || pLv
2a8f0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  l->plan.u.pIdx==
2a900 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20  pCov).          
2a910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2a920 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 69 49 64  ssert( pLvl->iId
2a930 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b  xCur==iCovCur );
2a940 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
2a950 76 20 3d 20 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 75  v = pLvl->plan.u
2a960 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20  .pIdx;.         
2a970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a980 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20      pCov = 0;.  
2a990 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2a9a0 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74       /* Finish t
2a9b0 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20  he loop through 
2a9c0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68  table entries th
2a9d0 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f  at match term pO
2a9e0 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  rTerm. */.      
2a9f0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2aa00 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a  End(pSubWInfo);.
2aa10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2aa20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  }.    }.    pLev
2aa30 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20  el->u.pCovidx = 
2aa40 70 43 6f 76 3b 0a 20 20 20 20 70 4c 65 76 65 6c  pCov;.    pLevel
2aa50 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76  ->iIdxCur = iCov
2aa60 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e  Cur;.    if( pAn
2aa70 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  dExpr ){.      p
2aa80 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  AndExpr->pLeft =
2aa90 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
2aaa0 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
2aab0 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72  se->db, pAndExpr
2aac0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2aad0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
2aae0 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71  (v, iRetInit, sq
2aaf0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2ab00 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
2ab10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ab20 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
2ab30 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
2ab40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ab50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2ab60 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
2ab70 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
2ab80 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53  vel>1 ) sqlite3S
2ab90 74 61 63 6b 46 72 65 65 28 70 50 61 72 73 65 2d  tackFree(pParse-
2aba0 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20  >db, pOrTab);.  
2abb0 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54    if( !untestedT
2abc0 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65  erms ) disableTe
2abd0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
2abe0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
2abf0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2ac00 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
2ac10 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20   */..  {.    /* 
2ac20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20 69  Case 5:  There i
2ac30 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
2ac40 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
2ac50 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a   complete.    **
2ac60 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
2ac70 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
2ac80 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  le..    */.    s
2ac90 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
2aca0 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65  Step[] = { OP_Ne
2acb0 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20  xt, OP_Prev };. 
2acc0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2acd0 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20  u8 aStart[] = { 
2ace0 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61  OP_Rewind, OP_La
2acf0 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  st };.    assert
2ad00 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65  ( bRev==0 || bRe
2ad10 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  v==1 );.    asse
2ad20 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
2ad30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   );.    pLevel->
2ad40 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d  op = aStep[bRev]
2ad50 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
2ad60 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
2ad70 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71  vel->p2 = 1 + sq
2ad80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ad90 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c  v, aStart[bRev],
2ada0 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
2adb0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20  .    pLevel->p5 
2adc0 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
2add0 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
2ade0 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64  P;.  }.  notRead
2adf0 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57  y &= ~getMask(pW
2ae00 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75  C->pMaskSet, iCu
2ae10 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74  r);..  /* Insert
2ae20 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76   code to test ev
2ae30 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f  ery subexpressio
2ae40 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f  n that can be co
2ae50 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f  mpletely.  ** co
2ae60 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65  mputed using the
2ae70 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20   current set of 
2ae80 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
2ae90 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
2aea0 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35 30 39  -OF: R-49525-509
2aeb0 33 35 20 54 65 72 6d 73 20 74 68 61 74 20 63 61  35 Terms that ca
2aec0 6e 6e 6f 74 20 62 65 20 73 61 74 69 73 66 69 65  nnot be satisfie
2aed0 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74  d through.  ** t
2aee0 68 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  he use of indice
2aef0 73 20 62 65 63 6f 6d 65 20 74 65 73 74 73 20 74  s become tests t
2af00 68 61 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  hat are evaluate
2af10 64 20 61 67 61 69 6e 73 74 20 65 61 63 68 20 72  d against each r
2af20 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72  ow of.  ** the r
2af30 65 6c 65 76 61 6e 74 20 69 6e 70 75 74 20 74 61  elevant input ta
2af40 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
2af50 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
2af60 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
2af70 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
2af80 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20  .    Expr *pE;. 
2af90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
2afa0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
2afb0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
2afc0 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31   IMP: R-30575-11
2afd0 36 36 32 20 2a 2f 0a 20 20 20 20 74 65 73 74 63  662 */.    testc
2afe0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
2aff0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
2b000 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
2b010 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
2b020 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
2b030 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
2b040 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
2b050 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
2b060 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
2b070 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2b080 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
2b090 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20  erms==0.        
2b0a0 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
2b0b0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2b0c0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
2b0d0 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  NLY)!=0 );.     
2b0e0 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
2b0f0 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20  dTerms = 1;.    
2b100 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2b110 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d  }.    pE = pTerm
2b120 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
2b130 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20  ert( pE!=0 );.  
2b140 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
2b150 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72  eftJoin && !Expr
2b160 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
2b170 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
2b180 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2b190 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2b1a0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
2b1b0 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e  rse, pE, addrCon
2b1c0 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
2b1d0 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d  NULL);.    pTerm
2b1e0 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
2b1f0 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20  M_CODED;.  }..  
2b200 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55  /* For a LEFT OU
2b210 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61  TER JOIN, genera
2b220 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
2b230 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  l record the fac
2b240 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c  t that.  ** at l
2b250 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  east one row of 
2b260 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
2b270 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20  has matched the 
2b280 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20  left table.  .  
2b290 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  */.  if( pLevel-
2b2a0 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
2b2b0 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69    pLevel->addrFi
2b2c0 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
2b2d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2b2e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b2f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2b300 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d  eger, 1, pLevel-
2b310 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
2b320 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2b330 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f   "record LEFT JO
2b340 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73  IN hit"));.    s
2b350 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2b360 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2b370 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
2b380 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e  >a, j=0; j<pWC->
2b390 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72  nTerm; j++, pTer
2b3a0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74  m++){.      test
2b3b0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
2b3c0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
2b3d0 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20  UAL );  /* IMP: 
2b3e0 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
2b3f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b400 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
2b410 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
2b420 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
2b430 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
2b440 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
2b450 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
2b460 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
2b470 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
2b480 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
2b490 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2b4a0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
2b4b0 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
2b4c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2b4d0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2b4e0 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
2b4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2b500 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
2b510 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
2b520 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
2b530 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
2b540 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
2b550 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
2b560 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
2b570 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2b580 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65  eg(pParse, iRele
2b590 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75  aseReg);..  retu
2b5a0 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a  rn notReady;.}..
2b5b0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2b5c0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54  TE_TEST)./*.** T
2b5d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
2b5e0 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65  iable holds a te
2b5f0 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  xt description o
2b600 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e  f query plan gen
2b610 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  erated.** by the
2b620 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
2b630 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
2b640 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20  eBegin().  Each 
2b650 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67  call to WhereBeg
2b660 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73  in.** overwrites
2b670 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20   the previous.  
2b680 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
2b690 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
2b6a0 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ting and.** anal
2b6b0 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68  ysis only..*/.ch
2b6c0 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  ar sqlite3_query
2b6d0 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b  _plan[BMS*2*40];
2b6e0 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
2b6f0 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20   join */.static 
2b700 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20  int nQPlan = 0; 
2b710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b720 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69  Next free slow i
2b730 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20  n _query_plan[] 
2b740 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  */..#endif /* SQ
2b750 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f  LITE_TEST */.../
2b760 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
2b770 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
2b780 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2b790 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
2b7a0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
2b7b0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
2b7c0 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66  if( ALWAYS(pWInf
2b7d0 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  o) ){.    int i;
2b7e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b7f0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
2b800 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
2b810 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
2b820 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e  pInfo = pWInfo->
2b830 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20  a[i].pIdxInfo;. 
2b840 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29       if( pInfo )
2b850 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73  {.        /* ass
2b860 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64  ert( pInfo->need
2b870 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20  ToFreeIdxStr==0 
2b880 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2b890 6c 65 64 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  led ); */.      
2b8a0 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65 65    if( pInfo->nee
2b8b0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b  dToFreeIdxStr ){
2b8c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2b8d0 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69  e3_free(pInfo->i
2b8e0 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
2b8f0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2b900 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 66  3DbFree(db, pInf
2b910 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
2b920 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 61 5b    if( pWInfo->a[
2b930 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  i].plan.wsFlags 
2b940 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
2b950 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e  EX ){.        In
2b960 64 65 78 20 2a 70 49 64 78 20 3d 20 70 57 49 6e  dex *pIdx = pWIn
2b970 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 75 2e  fo->a[i].plan.u.
2b980 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66  pIdx;.        if
2b990 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
2b9a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2b9b0 65 28 64 62 2c 20 70 49 64 78 2d 3e 7a 43 6f 6c  e(db, pIdx->zCol
2b9c0 41 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Aff);.          
2b9d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2b9e0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
2b9f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2ba00 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
2ba10 43 6c 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70 57  Clear(pWInfo->pW
2ba20 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  C);.    sqlite3D
2ba30 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
2ba40 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
2ba50 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65   Generate the be
2ba60 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c  ginning of the l
2ba70 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45  oop used for WHE
2ba80 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
2ba90 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74  sing..** The ret
2baa0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70  urn value is a p
2bab0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61  ointer to an opa
2bac0 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68  que structure th
2bad0 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69  at contains.** i
2bae0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65  nformation neede
2baf0 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
2bb00 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c  he loop.  Later,
2bb10 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
2bb20 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69  tine.** should i
2bb30 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65  nvoke sqlite3Whe
2bb40 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65  reEnd() with the
2bb50 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
2bb60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
2bb70 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
2bb80 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45  mplete the WHERE
2bb90 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
2bba0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
2bbb0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
2bbc0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2bbd0 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  ns NULL..**.** T
2bbe0 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73  he basic idea is
2bbf0 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20   to do a nested 
2bc00 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66  loop, one loop f
2bc10 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
2bc20 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
2bc30 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  use of a select.
2bc40 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50    (INSERT and UP
2bc50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
2bc60 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  are the.** same 
2bc70 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68  as a SELECT with
2bc80 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
2bc90 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
2bca0 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a   clause.)  For.*
2bcb0 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
2bcc0 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a  e SQL is this:.*
2bcd0 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43  *.**       SELEC
2bce0 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
2bcf0 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a   t3 WHERE ...;.*
2bd00 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f  *.** Then the co
2bd10 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20  de generated is 
2bd20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b  conceptually lik
2bd30 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  e the following:
2bd40 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  .**.**      fore
2bd50 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
2bd60 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64  o       \    Cod
2bd70 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
2bd80 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
2bd90 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20  w2 in t2 do     
2bda0 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
2bdb0 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20  hereBegin().**  
2bdc0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
2bdd0 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20  row3 in t3 do   
2bde0 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
2bdf0 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
2be00 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
2be10 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64          \    Cod
2be20 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
2be30 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
2be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be50 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
2be60 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20  hereEnd().**    
2be70 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
2be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
2be90 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2bea0 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20  the loops might 
2beb0 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e  not be nested in
2bec0 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
2bed0 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65  ich they.** appe
2bee0 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
2bef0 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65  lause if a diffe
2bf00 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65  rent order is be
2bf10 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b  tter able to mak
2bf20 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69  e.** use of indi
2bf30 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ces.  Note also 
2bf40 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e  that when the IN
2bf50 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72   operator appear
2bf60 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  s in.** the WHER
2bf70 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67  E clause, it mig
2bf80 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64  ht result in add
2bf90 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c  itional nested l
2bfa0 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e  oops for.** scan
2bfb0 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
2bfc0 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72   values on the r
2bfd0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
2bfe0 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20  f the IN..**.** 
2bff0 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20  There are Btree 
2c000 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
2c010 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62  ed with each tab
2c020 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72  le.  t1 uses cur
2c030 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54  sor.** number pT
2c040 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
2c050 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74  rsor.  t2 uses t
2c060 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69  he cursor pTabLi
2c070 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72  st->a[1].iCursor
2c080 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74  ..** And so fort
2c090 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  h.  This routine
2c0a0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
2c0b0 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44  to open those VD
2c0c0 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e  BE cursors.** an
2c0d0 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
2c0e0 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68  d() generates th
2c0f0 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20  e code to close 
2c100 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  them..**.** The 
2c110 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
2c120 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65  3WhereBegin() ge
2c130 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74  nerates leaves t
2c140 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64  he cursors named
2c150 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20  .** in pTabList 
2c160 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69  pointing at thei
2c170 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  r appropriate en
2c180 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e  tries.  The [...
2c190 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73  ] code.** can us
2c1a0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20  e OP_Column and 
2c1b0 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73  OP_Rowid opcodes
2c1c0 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72   on these cursor
2c1d0 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20  s to extract.** 
2c1e0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61  data from the va
2c1f0 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20  rious tables of 
2c200 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
2c210 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
2c220 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  use is empty, th
2c230 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20  e foreach loops 
2c240 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74  must each scan t
2c250 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74  heir.** entire t
2c260 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74  ables.  Thus a t
2c270 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73  hree-way join is
2c280 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61   an O(N^3) opera
2c290 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a  tion.  But if.**
2c2a0 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65   the tables have
2c2b0 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65   indices and the
2c2c0 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20  re are terms in 
2c2d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2c2e0 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74   that.** refer t
2c2f0 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c  o those indices,
2c300 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c   a complete tabl
2c310 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76  e scan can be av
2c320 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  oided and the.**
2c330 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d   code will run m
2c340 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73  uch faster.  Mos
2c350 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66  t of the work of
2c360 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2c370 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20   checking.** to 
2c380 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
2c390 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61   indices that ca
2c3a0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65  n be used to spe
2c3b0 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a  ed up the loop..
2c3c0 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74  **.** Terms of t
2c3d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2c3e0 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f  are also used to
2c3f0 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77   limit which row
2c400 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61  s actually.** ma
2c410 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e  ke it to the "..
2c420 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ." in the middle
2c430 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41   of the loop.  A
2c440 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61  fter each "forea
2c450 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66  ch",.** terms of
2c460 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c470 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20  e that use only 
2c480 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f  terms in that lo
2c490 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20  op and outer.** 
2c4a0 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61  loops are evalua
2c4b0 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65  ted and if false
2c4c0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
2c4d0 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65  around all subse
2c4e0 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c  quent.** inner l
2c4f0 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20  oops (or around 
2c500 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65  the "..." if the
2c510 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74   test occurs wit
2c520 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a  hin the inner-.*
2c530 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a  * most loop).**.
2c540 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a  ** OUTER JOINS.*
2c550 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f  *.** An outer jo
2c560 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20  in of tables t1 
2c570 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70  and t2 is concep
2c580 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66  tally coded as f
2c590 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
2c5a0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
2c5b0 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66   t1 do.**      f
2c5c0 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20  lag = 0.**      
2c5d0 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
2c5e0 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20  t2 do.**        
2c5f0 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20  start:.**       
2c600 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
2c610 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20     flag = 1.**  
2c620 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20      end.**      
2c630 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a  if flag==0 then.
2c640 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74  **        move t
2c650 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74  he row2 cursor t
2c660 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20  o a null row.** 
2c670 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72         goto star
2c680 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20  t.**      fi.** 
2c690 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44     end.**.** ORD
2c6a0 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f  ER BY CLAUSE PRO
2c6b0 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f  CESSING.**.** pO
2c6c0 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
2c6d0 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
2c6e0 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20   BY clause of a 
2c6f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2c700 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  ,.** if there is
2c710 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20   one.  If there 
2c720 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
2c730 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73  lause or if this
2c740 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
2c750 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50  alled from an UP
2c760 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
2c770 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70  tatement, then p
2c780 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e  OrderBy is NULL.
2c790 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64  .**.** If an ind
2c7a0 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73  ex can be used s
2c7b0 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72  o that the natur
2c7c0 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  al output order 
2c7d0 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  of the table.** 
2c7e0 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20  scan is correct 
2c7f0 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
2c800 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
2c810 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  at index is used
2c820 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 65 74 75   and.** the retu
2c830 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 2e 6e  rned WhereInfo.n
2c840 4f 42 53 61 74 20 66 69 65 6c 64 20 69 73 20 73  OBSat field is s
2c850 65 74 20 74 6f 20 70 4f 72 64 65 72 42 79 2d 3e  et to pOrderBy->
2c860 6e 45 78 70 72 2e 20 20 54 68 69 73 0a 2a 2a 20  nExpr.  This.** 
2c870 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
2c880 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74 73  on that prevents
2c890 20 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79 20   an unnecessary 
2c8a0 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  sort of the resu
2c8b0 6c 74 20 73 65 74 0a 2a 2a 20 69 66 20 61 6e 20  lt set.** if an 
2c8c0 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61 74  index appropriat
2c8d0 65 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20  e for the ORDER 
2c8e0 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  BY clause alread
2c8f0 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  y exists..**.** 
2c900 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  If the where cla
2c910 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74  use loops cannot
2c920 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20   be arranged to 
2c930 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72  provide the corr
2c940 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72  ect.** output or
2c950 64 65 72 2c 20 74 68 65 6e 20 57 68 65 72 65 49  der, then WhereI
2c960 6e 66 6f 2e 6e 4f 42 53 61 74 20 69 73 20 30 2e  nfo.nOBSat is 0.
2c970 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
2c980 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2c990 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2c9a0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
2c9b0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
2c9c0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
2c9d0 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20  abList,    /* A 
2c9e0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
2c9f0 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
2ca00 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
2ca10 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
2ca20 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2ca30 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2ca40 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e  OrderBy,   /* An
2ca50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2ca60 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  , or NULL */.  E
2ca70 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
2ca80 63 74 2c 20 20 2f 2a 20 54 68 65 20 73 65 6c 65  ct,  /* The sele
2ca90 63 74 2d 6c 69 73 74 20 66 6f 72 20 44 49 53 54  ct-list for DIST
2caa0 49 4e 43 54 20 71 75 65 72 69 65 73 20 2d 20 6f  INCT queries - o
2cab0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20  r NULL */.  u16 
2cac0 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
2cad0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
2cae0 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
2caf0 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
2cb00 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nt.h */.  int iI
2cb10 64 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20  dxCur           
2cb20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54  /* If WHERE_ONET
2cb30 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74  ABLE_ONLY is set
2cb40 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e  , index cursor n
2cb50 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  umber */.){.  in
2cb60 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
2cb70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
2cb80 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
2cb90 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
2cba0 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  truct */.  int n
2cbb0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
2cbc0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2cbd0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70  of elements in p
2cbe0 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
2cbf0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
2cc00 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
2cc10 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
2cc20 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
2cc30 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
2cc40 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2cc50 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
2cc60 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
2cc70 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
2cc80 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
2cc90 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
2cca0 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
2ccb0 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
2ccc0 2f 0a 20 20 57 68 65 72 65 42 65 73 74 49 64 78  /.  WhereBestIdx
2ccd0 20 73 57 42 49 3b 20 20 20 20 20 20 20 20 20 2f   sWBI;         /
2cce0 2a 20 42 65 73 74 20 69 6e 64 65 78 20 73 65 61  * Best index sea
2ccf0 72 63 68 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rch context */. 
2cd00 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
2cd10 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
2cd20 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
2cd30 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
2cd40 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
2cd50 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
2cd60 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e  le level in pWIn
2cd70 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  fo->a[] */.  int
2cd80 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   iFrom;         
2cd90 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2cda0 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
2cdb0 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
2cdc0 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2cde0 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
2cdf0 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b  n of all pWC->a[
2ce00 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 69  ].wtFlags */.  i
2ce10 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
2ce20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2ce30 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
2ce40 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
2ce50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2ce60 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2ce70 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61   */...  /* Varia
2ce80 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
2ce90 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  on */.  memset(&
2cea0 73 57 42 49 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sWBI, 0, sizeof(
2ceb0 73 57 42 49 29 29 3b 0a 20 20 73 57 42 49 2e 70  sWBI));.  sWBI.p
2cec0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2ced0 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
2cee0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
2cef0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2cf00 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
2cf10 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
2cf20 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
2cf30 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
2cf40 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
2cf50 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
2cf60 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
2cf70 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
2cf80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2cf90 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
2cfa0 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
2cfb0 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
2cfc0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
2cfd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
2cfe0 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
2cff0 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
2d000 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
2d010 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
2d020 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
2d030 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
2d040 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
2d050 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  n we should.  **
2d060 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63   only generate c
2d070 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  ode for the firs
2d080 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  t table in pTabL
2d090 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74  ist and assume t
2d0a0 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72  hat.  ** any cur
2d0b0 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
2d0c0 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20  with subsequent 
2d0d0 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69  tables are unini
2d0e0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
2d0f0 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74   nTabList = (wct
2d100 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2d110 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f  ONETABLE_ONLY) ?
2d120 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e   1 : pTabList->n
2d130 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  Src;..  /* Alloc
2d140 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2d150 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
2d160 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2d170 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
2d180 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
2d190 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
2d1a0 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
2d1b0 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
2d1c0 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
2d1d0 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
2d1e0 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
2d1f0 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
2d200 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
2d210 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
2d220 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
2d230 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
2d240 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
2d250 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
2d260 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
2d270 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
2d280 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
2d290 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
2d2a0 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
2d2b0 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
2d2c0 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
2d2d0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
2d2e0 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57 49  e->db;.  nByteWI
2d2f0 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
2d300 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
2d310 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
2d320 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
2d330 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
2d340 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
2d350 64 62 2c 20 0a 20 20 20 20 20 20 6e 42 79 74 65  db, .      nByte
2d360 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20 73  WInfo + .      s
2d370 69 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75 73  izeof(WhereClaus
2d380 65 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f  e) +.      sizeo
2d390 66 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29 0a  f(WhereMaskSet).
2d3a0 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d    );.  if( db->m
2d3b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
2d3c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2d3d0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
2d3e0 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
2d3f0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
2d400 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
2d410 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  Info->nLevel = n
2d420 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
2d430 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
2d440 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
2d450 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
2d460 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
2d470 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
2d480 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2d490 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 73   pWInfo->pWC = s
2d4a0 57 42 49 2e 70 57 43 20 3d 20 28 57 68 65 72 65  WBI.pWC = (Where
2d4b0 43 6c 61 75 73 65 20 2a 29 26 28 28 75 38 20 2a  Clause *)&((u8 *
2d4c0 29 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49  )pWInfo)[nByteWI
2d4d0 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  nfo];.  pWInfo->
2d4e0 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
2d4f0 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
2d500 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
2d510 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
2d520 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b  eryLoop;.  pMask
2d530 53 65 74 20 3d 20 28 57 68 65 72 65 4d 61 73 6b  Set = (WhereMask
2d540 53 65 74 2a 29 26 73 57 42 49 2e 70 57 43 5b 31  Set*)&sWBI.pWC[1
2d550 5d 3b 0a 20 20 73 57 42 49 2e 61 4c 65 76 65 6c  ];.  sWBI.aLevel
2d560 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 0a 20   = pWInfo->a;.. 
2d570 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20   /* Disable the 
2d580 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a  DISTINCT optimiz
2d590 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ation if SQLITE_
2d5a0 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73  DistinctOpt is s
2d5b0 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69  et via.  ** sqli
2d5c0 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51  te3_test_ctrl(SQ
2d5d0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
2d5e0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29  TIMIZATIONS,...)
2d5f0 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
2d600 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
2d610 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  b, SQLITE_Distin
2d620 63 74 4f 70 74 29 20 29 20 70 44 69 73 74 69 6e  ctOpt) ) pDistin
2d630 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 70  ct = 0;..  /* Sp
2d640 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  lit the WHERE cl
2d650 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61  ause into separa
2d660 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  te subexpression
2d670 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a  s where each.  *
2d680 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
2d690 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
2d6a0 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
2d6b0 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
2d6c0 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20  Set(pMaskSet);. 
2d6d0 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
2d6e0 28 73 57 42 49 2e 70 57 43 2c 20 70 50 61 72 73  (sWBI.pWC, pPars
2d6f0 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20 77 63 74  e, pMaskSet, wct
2d700 72 6c 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69  rlFlags);.  sqli
2d710 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
2d720 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68  ants(pParse, pWh
2d730 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  ere);.  whereSpl
2d740 69 74 28 73 57 42 49 2e 70 57 43 2c 20 70 57 68  it(sWBI.pWC, pWh
2d750 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20  ere, TK_AND);   
2d760 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d  /* IMP: R-15842-
2d770 35 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20  53296 */.    .  
2d780 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
2d790 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
2d7a0 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
2d7b0 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
2d7c0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
2d7d0 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
2d7e0 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
2d7f0 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
2d800 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  u..  */.  if( pW
2d810 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73  here && (nTabLis
2d820 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  t==0 || sqlite3E
2d830 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
2d840 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b  Join(pWhere)) ){
2d850 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2d860 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
2d870 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
2d880 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a  iBreak, SQLITE_J
2d890 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
2d8a0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
2d8b0 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
2d8c0 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
2d8d0 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
2d8e0 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
2d8f0 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
2d900 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62  When assigning b
2d910 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f  itmask values to
2d920 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72   FROM clause cur
2d930 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65  sors, it must be
2d940 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74  .  ** the case t
2d950 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20  hat if X is the 
2d960 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
2d970 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65  N-th FROM clause
2d980 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20   term then.  ** 
2d990 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
2d9a0 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
2d9b0 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66  terms to the lef
2d9c0 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65  t of the N-th te
2d9d0 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29  rm.  ** is (X-1)
2d9e0 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f  .   An expressio
2d9f0 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c  n from the ON cl
2da00 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
2da10 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a  OIN can use.  **
2da20 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74   its Expr.iRight
2da30 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20  JoinTable value 
2da40 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d  to find the bitm
2da50 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74  ask of the right
2da60 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74   table.  ** of t
2da70 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61  he join.  Subtra
2da80 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74  cting one from t
2da90 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62  he right table b
2daa0 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20  itmask gives a. 
2dab0 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20   ** bitmask for 
2dac0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
2dad0 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
2dae0 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65  in.  Knowing the
2daf0 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f   bitmask.  ** fo
2db00 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
2db10 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
2db20 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72  ft join is impor
2db30 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
2db40 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  015..  **.  ** C
2db50 6f 6e 66 69 67 75 72 65 20 74 68 65 20 57 68 65  onfigure the Whe
2db60 72 65 43 6c 61 75 73 65 2e 76 6d 61 73 6b 20 76  reClause.vmask v
2db70 61 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20  ariable so that 
2db80 62 69 74 73 20 74 68 61 74 20 63 6f 72 72 65 73  bits that corres
2db90 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20 76 69 72  pond.  ** to vir
2dba0 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
2dbb0 72 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  rs are set. This
2dbc0 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 6c 65   is used to sele
2dbd0 63 74 69 76 65 6c 79 20 64 69 73 61 62 6c 65 20  ctively disable 
2dbe0 0a 20 20 2a 2a 20 74 68 65 20 4f 52 2d 74 6f 2d  .  ** the OR-to-
2dbf0 49 4e 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  IN transformatio
2dc00 6e 20 69 6e 20 65 78 70 72 41 6e 61 6c 79 7a 65  n in exprAnalyze
2dc10 4f 72 54 65 72 6d 28 29 2e 20 49 74 20 69 73 20  OrTerm(). It is 
2dc20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 0a 20 20 2a  not helpful .  *
2dc30 2a 20 77 69 74 68 20 76 69 72 74 75 61 6c 20 74  * with virtual t
2dc40 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
2dc50 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61   Note that bitma
2dc60 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20  sks are created 
2dc70 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74  for all pTabList
2dc80 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e  ->nSrc tables in
2dc90 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20  .  ** pTabList, 
2dca0 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72  not just the fir
2dcb0 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c  st nTabList tabl
2dcc0 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73  es.  nTabList is
2dcd0 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65   normally.  ** e
2dce0 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74  qual to pTabList
2dcf0 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74  ->nSrc but might
2dd00 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f   be shortened to
2dd10 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57   1 if the.  ** W
2dd20 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
2dd30 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  LY flag is set..
2dd40 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
2dd50 57 42 49 2e 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d  WBI.pWC->vmask==
2dd60 30 20 26 26 20 70 4d 61 73 6b 53 65 74 2d 3e 6e  0 && pMaskSet->n
2dd70 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d  ==0 );.  for(ii=
2dd80 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
2dd90 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
2dda0 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
2ddb0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2ddc0 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
2ddd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2dde0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2ddf0 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28  .    if( ALWAYS(
2de00 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
2de10 70 54 61 62 29 20 26 26 20 49 73 56 69 72 74 75  pTab) && IsVirtu
2de20 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  al(pTabList->a[i
2de30 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  i].pTab) ){.    
2de40 20 20 73 57 42 49 2e 70 57 43 2d 3e 76 6d 61 73    sWBI.pWC->vmas
2de50 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31  k |= ((Bitmask)1
2de60 20 3c 3c 20 69 69 29 3b 0a 20 20 20 20 7d 0a 23   << ii);.    }.#
2de70 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65  endif.  }.#ifnde
2de80 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  f NDEBUG.  {.   
2de90 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65   Bitmask toTheLe
2dea0 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ft = 0;.    for(
2deb0 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
2dec0 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
2ded0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
2dee0 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
2def0 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
2df00 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
2df10 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31      assert( (m-1
2df20 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a  )==toTheLeft );.
2df30 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20        toTheLeft 
2df40 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  |= m;.    }.  }.
2df50 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61  #endif..  /* Ana
2df60 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
2df70 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
2df80 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41   Note that exprA
2df90 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20  nalyze() might. 
2dfa0 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74   ** add new virt
2dfb0 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74  ual terms onto t
2dfc0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
2dfd0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20  ERE clause.  We 
2dfe0 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74  do not.  ** want
2dff0 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73   to analyze thes
2e000 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c  e virtual terms,
2e010 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a   so start analyz
2e020 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20  ing at the end. 
2e030 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72   ** and work for
2e040 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65  ward so that the
2e050 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74   added virtual t
2e060 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70  erms are never p
2e070 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  rocessed..  */. 
2e080 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
2e090 70 54 61 62 4c 69 73 74 2c 20 73 57 42 49 2e 70  pTabList, sWBI.p
2e0a0 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  WC);.  if( db->m
2e0b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
2e0c0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
2e0d0 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  inError;.  }..  
2e0e0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
2e0f0 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
2e100 65 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  er, if there is 
2e110 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e 64 61 6e  one, is redundan
2e120 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69 74 20 69  t. .  ** If it i
2e130 73 2c 20 74 68 65 6e 20 73 65 74 20 70 44 69 73  s, then set pDis
2e140 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  tinct to NULL an
2e150 64 20 57 68 65 72 65 49 6e 66 6f 2e 65 44 69 73  d WhereInfo.eDis
2e160 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a 20 57 48  tinct to.  ** WH
2e170 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
2e180 51 55 45 20 74 6f 20 74 65 6c 6c 20 74 68 65 20  QUE to tell the 
2e190 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e 6f 72 65  caller to ignore
2e1a0 20 74 68 65 20 44 49 53 54 49 4e 43 54 2e 0a 20   the DISTINCT.. 
2e1b0 20 2a 2f 0a 20 20 69 66 28 20 70 44 69 73 74 69   */.  if( pDisti
2e1c0 6e 63 74 20 26 26 20 69 73 44 69 73 74 69 6e 63  nct && isDistinc
2e1d0 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
2e1e0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 73 57 42  e, pTabList, sWB
2e1f0 49 2e 70 57 43 2c 20 70 44 69 73 74 69 6e 63 74  I.pWC, pDistinct
2e200 29 20 29 7b 0a 20 20 20 20 70 44 69 73 74 69 6e  ) ){.    pDistin
2e210 63 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 49 6e  ct = 0;.    pWIn
2e220 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
2e230 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2e240 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NIQUE;.  }..  /*
2e250 20 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20   Chose the best 
2e260 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
2e270 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
2e280 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
2e290 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
2e2a0 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65  oop fills in the
2e2b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
2e2c0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70  s:.  **.  **   p
2e2d0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20  WInfo->a[].pIdx 
2e2e0 20 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74       The index t
2e2f0 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c  o use for this l
2e300 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70  evel of the loop
2e310 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  ..  **   pWInfo-
2e320 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57  >a[].wsFlags   W
2e330 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61  HERE_xxx flags a
2e340 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2e350 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  Idx.  **   pWInf
2e360 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20  o->a[].nEq      
2e370 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
2e380 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
2e390 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ints.  **   pWIn
2e3a0 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20  fo->a[].iFrom   
2e3b0 20 20 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20    Which term of 
2e3c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2e3d0 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20  is being coded. 
2e3e0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
2e3f0 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20  ].iTabCur   The 
2e400 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
2e410 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
2e420 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  le.  **   pWInfo
2e430 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20  ->a[].iIdxCur   
2e440 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
2e450 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20  for the index.  
2e460 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
2e470 2e 70 54 65 72 6d 20 20 20 20 20 57 68 65 6e 20  .pTerm     When 
2e480 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20  wsFlags==WO_OR, 
2e490 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 74 65  the OR-clause te
2e4a0 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  rm.  **.  ** Thi
2e4b0 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75  s loop also figu
2e4c0 72 65 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74  res out the nest
2e4d0 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62  ing order of tab
2e4e0 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
2e4f0 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a    ** clause..  *
2e500 2f 0a 20 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69  /.  sWBI.notVali
2e510 64 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  d = ~(Bitmask)0;
2e520 0a 20 20 73 57 42 49 2e 70 4f 72 64 65 72 42 79  .  sWBI.pOrderBy
2e530 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 73   = pOrderBy;.  s
2e540 57 42 49 2e 6e 20 3d 20 6e 54 61 62 4c 69 73 74  WBI.n = nTabList
2e550 3b 0a 20 20 73 57 42 49 2e 70 44 69 73 74 69 6e  ;.  sWBI.pDistin
2e560 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 3b 0a  ct = pDistinct;.
2e570 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b    andFlags = ~0;
2e580 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
2e590 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
2e5a0 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
2e5b0 66 6f 72 28 73 57 42 49 2e 69 3d 69 46 72 6f 6d  for(sWBI.i=iFrom
2e5c0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
2e5d0 6f 2d 3e 61 3b 20 73 57 42 49 2e 69 3c 6e 54 61  o->a; sWBI.i<nTa
2e5e0 62 4c 69 73 74 3b 20 73 57 42 49 2e 69 2b 2b 2c  bList; sWBI.i++,
2e5f0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
2e600 57 68 65 72 65 43 6f 73 74 20 62 65 73 74 50 6c  WhereCost bestPl
2e610 61 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  an;         /* M
2e620 6f 73 74 20 65 66 66 69 63 69 65 6e 74 20 70 6c  ost efficient pl
2e630 61 6e 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a  an seen so far *
2e640 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
2e650 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
2e660 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46    /* Index for F
2e670 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61  ROM table at pTa
2e680 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  bItem */.    int
2e690 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
2e6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
2e6b0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f  looping over FRO
2e6c0 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  M tables */.    
2e6d0 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d 31 3b 20  int bestJ = -1; 
2e6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2e6f0 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f  he value of j */
2e700 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20  .    Bitmask m; 
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e720 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75   /* Bitmask valu
2e730 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a  e for j or bestJ
2e740 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4f 70   */.    int isOp
2e750 74 69 6d 61 6c 3b 20 20 20 20 20 20 20 20 20 20  timal;          
2e760 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2e770 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d  for optimal/non-
2e780 6f 70 74 69 6d 61 6c 20 73 65 61 72 63 68 20 2a  optimal search *
2e790 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e 63 6f 6e  /.    int nUncon
2e7a0 73 74 72 61 69 6e 65 64 3b 20 20 20 20 20 20 20  strained;       
2e7b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 61 62 6c    /* Number tabl
2e7c0 65 73 20 77 69 74 68 6f 75 74 20 49 4e 44 45 58  es without INDEX
2e7d0 45 44 20 42 59 20 2a 2f 0a 20 20 20 20 42 69 74  ED BY */.    Bit
2e7e0 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78 65 64 3b  mask notIndexed;
2e7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
2e800 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
2e810 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e  cannot use an in
2e820 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73  dex */..    mems
2e830 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20 30 2c  et(&bestPlan, 0,
2e840 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c 61 6e   sizeof(bestPlan
2e850 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c 61 6e  ));.    bestPlan
2e860 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  .rCost = SQLITE_
2e870 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 57 48 45  BIG_DBL;.    WHE
2e880 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 42 65  RETRACE(("*** Be
2e890 67 69 6e 20 73 65 61 72 63 68 20 66 6f 72 20 6c  gin search for l
2e8a0 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22 2c 20 73  oop %d ***\n", s
2e8b0 57 42 49 2e 69 29 29 3b 0a 0a 20 20 20 20 2f 2a  WBI.i));..    /*
2e8c0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
2e8d0 65 20 72 65 6d 61 69 6e 69 6e 67 20 65 6e 74 72  e remaining entr
2e8e0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2e8f0 63 6c 61 75 73 65 20 74 6f 20 66 69 6e 64 20 74  clause to find t
2e900 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 6e  he.    ** next n
2e910 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54 68 65 20  ested loop. The 
2e920 6c 6f 6f 70 20 74 65 73 74 73 20 61 6c 6c 20 46  loop tests all F
2e930 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69  ROM clause entri
2e940 65 73 0a 20 20 20 20 2a 2a 20 65 69 74 68 65 72  es.    ** either
2e950 20 6f 6e 63 65 20 6f 72 20 74 77 69 63 65 2e 20   once or twice. 
2e960 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2e970 68 65 20 66 69 72 73 74 20 74 65 73 74 20 69 73  he first test is
2e980 20 61 6c 77 61 79 73 20 70 65 72 66 6f 72 6d 65   always performe
2e990 64 20 69 66 20 74 68 65 72 65 20 61 72 65 20 74  d if there are t
2e9a0 77 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69  wo or more entri
2e9b0 65 73 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e  es.    ** remain
2e9c0 69 6e 67 20 61 6e 64 20 6e 65 76 65 72 20 70 65  ing and never pe
2e9d0 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65  rformed if there
2e9e0 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f   is only one FRO
2e9f0 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 0a 20  M clause entry. 
2ea00 20 20 20 2a 2a 20 74 6f 20 63 68 6f 6f 73 65 20     ** to choose 
2ea10 66 72 6f 6d 2e 20 20 54 68 65 20 66 69 72 73 74  from.  The first
2ea20 20 74 65 73 74 20 6c 6f 6f 6b 73 20 66 6f 72 20   test looks for 
2ea30 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 73 63 61  an "optimal" sca
2ea40 6e 2e 20 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68  n.  In.    ** th
2ea50 69 73 20 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70  is context an op
2ea60 74 69 6d 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e  timal scan is on
2ea70 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  e that uses the 
2ea80 73 61 6d 65 20 73 74 72 61 74 65 67 79 0a 20 20  same strategy.  
2ea90 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 67 69 76    ** for the giv
2eaa0 65 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  en FROM clause e
2eab0 6e 74 72 79 20 61 73 20 77 6f 75 6c 64 20 62 65  ntry as would be
2eac0 20 73 65 6c 65 63 74 65 64 20 69 66 20 74 68 65   selected if the
2ead0 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 77 65   entry.    ** we
2eae0 72 65 20 75 73 65 64 20 61 73 20 74 68 65 20 69  re used as the i
2eaf0 6e 6e 65 72 6d 6f 73 74 20 6e 65 73 74 65 64 20  nnermost nested 
2eb00 6c 6f 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20  loop.  In other 
2eb10 77 6f 72 64 73 2c 20 61 20 74 61 62 6c 65 0a 20  words, a table. 
2eb20 20 20 20 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20     ** is chosen 
2eb30 73 75 63 68 20 74 68 61 74 20 74 68 65 20 63 6f  such that the co
2eb40 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68  st of running th
2eb50 61 74 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  at table cannot 
2eb60 62 65 20 72 65 64 75 63 65 64 0a 20 20 20 20 2a  be reduced.    *
2eb70 2a 20 62 79 20 77 61 69 74 69 6e 67 20 66 6f 72  * by waiting for
2eb80 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f   other tables to
2eb90 20 72 75 6e 20 66 69 72 73 74 2e 20 20 54 68 69   run first.  Thi
2eba0 73 20 22 6f 70 74 69 6d 61 6c 22 20 74 65 73 74  s "optimal" test
2ebb0 20 77 6f 72 6b 73 0a 20 20 20 20 2a 2a 20 62 79   works.    ** by
2ebc0 20 66 69 72 73 74 20 61 73 73 75 6d 69 6e 67 20   first assuming 
2ebd0 74 68 61 74 20 74 68 65 20 46 52 4f 4d 20 63 6c  that the FROM cl
2ebe0 61 75 73 65 20 69 73 20 6f 6e 20 74 68 65 20 69  ause is on the i
2ebf0 6e 6e 65 72 20 6c 6f 6f 70 20 61 6e 64 20 66 69  nner loop and fi
2ec00 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 73  nding.    ** its
2ec10 20 71 75 65 72 79 20 70 6c 61 6e 2c 20 74 68 65   query plan, the
2ec20 6e 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65  n checking to se
2ec30 65 20 69 66 20 74 68 61 74 20 71 75 65 72 79 20  e if that query 
2ec40 70 6c 61 6e 20 75 73 65 73 20 61 6e 79 0a 20 20  plan uses any.  
2ec50 20 20 2a 2a 20 6f 74 68 65 72 20 46 52 4f 4d 20    ** other FROM 
2ec60 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
2ec70 74 20 61 72 65 20 73 57 42 49 2e 6e 6f 74 56 61  t are sWBI.notVa
2ec80 6c 69 64 2e 20 20 49 66 20 6e 6f 20 6e 6f 74 56  lid.  If no notV
2ec90 61 6c 69 64 20 74 65 72 6d 73 0a 20 20 20 20 2a  alid terms.    *
2eca0 2a 20 61 72 65 20 75 73 65 64 20 74 68 65 6e 20  * are used then 
2ecb0 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 71 75  the "optimal" qu
2ecc0 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b 73 2e 0a  ery plan works..
2ecd0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
2ece0 74 65 20 74 68 61 74 20 74 68 65 20 57 68 65 72  te that the Wher
2ecf0 65 43 6f 73 74 2e 6e 52 6f 77 20 70 61 72 61 6d  eCost.nRow param
2ed00 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 74 69  eter for an opti
2ed10 6d 61 6c 20 73 63 61 6e 20 6d 69 67 68 74 0a 20  mal scan might. 
2ed20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 73 20     ** not be as 
2ed30 73 6d 61 6c 6c 20 61 73 20 69 74 20 77 6f 75 6c  small as it woul
2ed40 64 20 62 65 20 69 66 20 74 68 65 20 74 61 62 6c  d be if the tabl
2ed50 65 20 72 65 61 6c 6c 79 20 77 65 72 65 20 74 68  e really were th
2ed60 65 20 69 6e 6e 65 72 6d 6f 73 74 0a 20 20 20 20  e innermost.    
2ed70 2a 2a 20 6a 6f 69 6e 2e 20 20 54 68 65 20 6e 52  ** join.  The nR
2ed80 6f 77 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  ow value can be 
2ed90 72 65 64 75 63 65 64 20 62 79 20 57 48 45 52 45  reduced by WHERE
2eda0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
2edb0 6e 74 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  nts.    ** that 
2edc0 64 6f 20 6e 6f 74 20 75 73 65 20 69 6e 64 69 63  do not use indic
2edd0 65 73 2e 20 20 42 75 74 20 74 68 69 73 20 6e 52  es.  But this nR
2ede0 6f 77 20 72 65 64 75 63 74 69 6f 6e 20 6f 6e 6c  ow reduction onl
2edf0 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
2ee00 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 72 65  .    ** table re
2ee10 61 6c 6c 79 20 69 73 20 74 68 65 20 69 6e 6e 65  ally is the inne
2ee20 72 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20 0a 20 20  rmost join.  .  
2ee30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2ee40 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69 74 65 72  second loop iter
2ee50 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 70 65  ation is only pe
2ee60 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f 20 6f 70  rformed if no op
2ee70 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20 20 20 2a  timal scan.    *
2ee80 2a 20 73 74 72 61 74 65 67 69 65 73 20 77 65 72  * strategies wer
2ee90 65 20 66 6f 75 6e 64 20 62 79 20 74 68 65 20 66  e found by the f
2eea0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20  irst iteration. 
2eeb0 54 68 69 73 20 73 65 63 6f 6e 64 20 69 74 65 72  This second iter
2eec0 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20  ation.    ** is 
2eed0 75 73 65 64 20 74 6f 20 73 65 61 72 63 68 20 66  used to search f
2eee0 6f 72 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  or the lowest co
2eef0 73 74 20 73 63 61 6e 20 6f 76 65 72 61 6c 6c 2e  st scan overall.
2ef00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50  .    **.    ** P
2ef10 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
2ef20 20 6f 66 20 53 51 4c 69 74 65 20 70 65 72 66 6f   of SQLite perfo
2ef30 72 6d 65 64 20 6f 6e 6c 79 20 74 68 65 20 73 65  rmed only the se
2ef40 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2d  cond iteration -
2ef50 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78 74  .    ** the next
2ef60 20 6f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20   outermost loop 
2ef70 77 61 73 20 61 6c 77 61 79 73 20 74 68 61 74 20  was always that 
2ef80 77 69 74 68 20 74 68 65 20 6c 6f 77 65 73 74 20  with the lowest 
2ef90 6f 76 65 72 61 6c 6c 0a 20 20 20 20 2a 2a 20 63  overall.    ** c
2efa0 6f 73 74 2e 20 48 6f 77 65 76 65 72 2c 20 74 68  ost. However, th
2efb0 69 73 20 6d 65 61 6e 74 20 74 68 61 74 20 53 51  is meant that SQ
2efc0 4c 69 74 65 20 63 6f 75 6c 64 20 73 65 6c 65 63  Lite could selec
2efd0 74 20 74 68 65 20 77 72 6f 6e 67 20 70 6c 61 6e  t the wrong plan
2efe0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 73 63 72 69  .    ** for scri
2eff0 70 74 73 20 73 75 63 68 20 61 73 20 74 68 65 20  pts such as the 
2f000 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a  following:.    *
2f010 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20 43 52  *   .    **   CR
2f020 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
2f030 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20 20 20 43   b); .    **   C
2f040 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 63  REATE TABLE t2(c
2f050 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 53  , d);.    **   S
2f060 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 2c  ELECT * FROM t2,
2f070 20 74 31 20 57 48 45 52 45 20 74 32 2e 72 6f 77   t1 WHERE t2.row
2f080 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20 20 20 2a  id = t1.a;.    *
2f090 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 65 73  *.    ** The bes
2f0a0 74 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  t strategy is to
2f0b0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2f0c0 20 74 61 62 6c 65 20 74 31 20 66 69 72 73 74 2e   table t1 first.
2f0d0 20 48 6f 77 65 76 65 72 20 69 74 0a 20 20 20 20   However it.    
2f0e0 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
2f0f0 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
2f100 74 68 69 73 20 77 69 74 68 20 61 20 73 69 6d 70  this with a simp
2f110 6c 65 20 67 72 65 65 64 79 20 61 6c 67 6f 72 69  le greedy algori
2f120 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 53 69 6e 63  thm..    ** Sinc
2f130 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20  e the cost of a 
2f140 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
2f150 75 67 68 20 74 61 62 6c 65 20 74 32 20 69 73 20  ugh table t2 is 
2f160 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a  the same .    **
2f170 20 61 73 20 74 68 65 20 63 6f 73 74 20 6f 66 20   as the cost of 
2f180 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
2f190 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 2c 20  rough table t1, 
2f1a0 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20  a simple greedy 
2f1b0 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68  .    ** algorith
2f1c0 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20  m may choose to 
2f1d0 75 73 65 20 74 32 20 66 6f 72 20 74 68 65 20 6f  use t2 for the o
2f1e0 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68  uter loop, which
2f1f0 20 69 73 20 61 20 6d 75 63 68 0a 20 20 20 20 2a   is a much.    *
2f200 2a 20 63 6f 73 74 6c 69 65 72 20 61 70 70 72 6f  * costlier appro
2f210 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ach..    */.    
2f220 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 3d  nUnconstrained =
2f230 20 30 3b 0a 20 20 20 20 6e 6f 74 49 6e 64 65 78   0;.    notIndex
2f240 65 64 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ed = 0;.    for(
2f250 69 73 4f 70 74 69 6d 61 6c 3d 28 69 46 72 6f 6d  isOptimal=(iFrom
2f260 3c 6e 54 61 62 4c 69 73 74 2d 31 29 3b 20 69 73  <nTabList-1); is
2f270 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26 20 62 65  Optimal>=0 && be
2f280 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69 6d 61 6c  stJ<0; isOptimal
2f290 2d 2d 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  --){.      for(j
2f2a0 3d 69 46 72 6f 6d 2c 20 73 57 42 49 2e 70 53 72  =iFrom, sWBI.pSr
2f2b0 63 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  c=&pTabList->a[j
2f2c0 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74 3b 20 6a  ]; j<nTabList; j
2f2d0 2b 2b 2c 20 73 57 42 49 2e 70 53 72 63 2b 2b 29  ++, sWBI.pSrc++)
2f2e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 6f  {.        int do
2f2f0 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 20 20 2f  NotReorder;    /
2f300 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 74  * True if this t
2f310 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  able should not 
2f320 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a  be reordered */.
2f330 20 20 0a 20 20 20 20 20 20 20 20 64 6f 4e 6f 74    .        doNot
2f340 52 65 6f 72 64 65 72 20 3d 20 20 28 73 57 42 49  Reorder =  (sWBI
2f350 2e 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20  .pSrc->jointype 
2f360 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
2f370 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  OSS))!=0;.      
2f380 20 20 69 66 28 20 6a 21 3d 69 46 72 6f 6d 20 26    if( j!=iFrom &
2f390 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29  & doNotReorder )
2f3a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2f3b0 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  m = getMask(pMas
2f3c0 6b 53 65 74 2c 20 73 57 42 49 2e 70 53 72 63 2d  kSet, sWBI.pSrc-
2f3d0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2f3e0 20 20 20 69 66 28 20 28 6d 20 26 20 73 57 42 49     if( (m & sWBI
2f3f0 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d 30 20 29 7b  .notValid)==0 ){
2f400 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
2f410 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b  ==iFrom ) iFrom+
2f420 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  +;.          con
2f430 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
2f440 0a 20 20 20 20 20 20 20 20 73 57 42 49 2e 6e 6f  .        sWBI.no
2f450 74 52 65 61 64 79 20 3d 20 28 69 73 4f 70 74 69  tReady = (isOpti
2f460 6d 61 6c 20 3f 20 6d 20 3a 20 73 57 42 49 2e 6e  mal ? m : sWBI.n
2f470 6f 74 56 61 6c 69 64 29 3b 0a 20 20 20 20 20 20  otValid);.      
2f480 20 20 69 66 28 20 73 57 42 49 2e 70 53 72 63 2d    if( sWBI.pSrc-
2f490 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20 6e 55 6e  >pIndex==0 ) nUn
2f4a0 63 6f 6e 73 74 72 61 69 6e 65 64 2b 2b 3b 0a 20  constrained++;. 
2f4b0 20 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54   .        WHERET
2f4c0 52 41 43 45 28 28 22 3d 3d 3d 20 74 72 79 69 6e  RACE(("=== tryin
2f4d0 67 20 74 61 62 6c 65 20 25 64 20 28 25 73 29 20  g table %d (%s) 
2f4e0 77 69 74 68 20 69 73 4f 70 74 69 6d 61 6c 3d 25  with isOptimal=%
2f4f0 64 20 3d 3d 3d 5c 6e 22 2c 0a 20 20 20 20 20 20  d ===\n",.      
2f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c                j,
2f510 20 73 57 42 49 2e 70 53 72 63 2d 3e 70 54 61 62   sWBI.pSrc->pTab
2f520 2d 3e 7a 4e 61 6d 65 2c 20 69 73 4f 70 74 69 6d  ->zName, isOptim
2f530 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  al));.        as
2f540 73 65 72 74 28 20 73 57 42 49 2e 70 53 72 63 2d  sert( sWBI.pSrc-
2f550 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66  >pTab );.#ifndef
2f560 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2f570 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
2f580 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
2f590 73 57 42 49 2e 70 53 72 63 2d 3e 70 54 61 62 29  sWBI.pSrc->pTab)
2f5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 57   ){.          sW
2f5b0 42 49 2e 70 70 49 64 78 49 6e 66 6f 20 3d 20 26  BI.ppIdxInfo = &
2f5c0 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64  pWInfo->a[j].pId
2f5d0 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  xInfo;.         
2f5e0 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
2f5f0 78 28 26 73 57 42 49 29 3b 0a 20 20 20 20 20 20  x(&sWBI);.      
2f600 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a    }else .#endif.
2f610 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2f620 20 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64      bestBtreeInd
2f630 65 78 28 26 73 57 42 49 29 3b 0a 20 20 20 20 20  ex(&sWBI);.     
2f640 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2f650 65 72 74 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c  ert( isOptimal |
2f660 7c 20 28 73 57 42 49 2e 63 6f 73 74 2e 75 73 65  | (sWBI.cost.use
2f670 64 26 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29  d&sWBI.notValid)
2f680 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  ==0 );..        
2f690 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44  /* If an INDEXED
2f6a0 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 70 72   BY clause is pr
2f6b0 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  esent, then the 
2f6c0 70 6c 61 6e 20 6d 75 73 74 20 75 73 65 20 74 68  plan must use th
2f6d0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  at.        ** in
2f6e0 64 65 78 20 69 66 20 69 74 20 75 73 65 73 20 61  dex if it uses a
2f6f0 6e 79 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 20  ny index at all 
2f700 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2f710 74 28 20 73 57 42 49 2e 70 53 72 63 2d 3e 70 49  t( sWBI.pSrc->pI
2f720 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20  ndex==0 .       
2f730 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73             || (s
2f740 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73  WBI.cost.plan.ws
2f750 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
2f760 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20  T_FULLSCAN)==0. 
2f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f780 20 7c 7c 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c   || sWBI.cost.pl
2f790 61 6e 2e 75 2e 70 49 64 78 3d 3d 73 57 42 49 2e  an.u.pIdx==sWBI.
2f7a0 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 3b 0a  pSrc->pIndex );.
2f7b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
2f7c0 70 74 69 6d 61 6c 20 26 26 20 28 73 57 42 49 2e  ptimal && (sWBI.
2f7d0 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
2f7e0 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
2f7f0 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20  LLSCAN)==0 ){.  
2f800 20 20 20 20 20 20 20 20 6e 6f 74 49 6e 64 65 78          notIndex
2f810 65 64 20 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20  ed |= m;.       
2f820 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   }..        /* C
2f830 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72 20  onditions under 
2f840 77 68 69 63 68 20 74 68 69 73 20 74 61 62 6c 65  which this table
2f850 20 62 65 63 6f 6d 65 73 20 74 68 65 20 62 65 73   becomes the bes
2f860 74 20 73 6f 20 66 61 72 3a 0a 20 20 20 20 20 20  t so far:.      
2f870 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2f880 20 20 28 31 29 20 54 68 65 20 74 61 62 6c 65 20    (1) The table 
2f890 6d 75 73 74 20 6e 6f 74 20 64 65 70 65 6e 64 20  must not depend 
2f8a0 6f 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  on other tables 
2f8b0 74 68 61 74 20 68 61 76 65 20 6e 6f 74 0a 20 20  that have not.  
2f8c0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 79        **       y
2f8d0 65 74 20 72 75 6e 2e 20 20 28 49 6e 20 6f 74 68  et run.  (In oth
2f8e0 65 72 20 77 6f 72 64 73 2c 20 69 74 20 6d 75 73  er words, it mus
2f8f0 74 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20  t not depend on 
2f900 74 61 62 6c 65 73 0a 20 20 20 20 20 20 20 20 2a  tables.        *
2f910 2a 20 20 20 20 20 20 20 69 6e 20 69 6e 6e 65 72  *       in inner
2f920 20 6c 6f 6f 70 73 2e 29 0a 20 20 20 20 20 20 20   loops.).       
2f930 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2f940 20 28 32 29 20 41 20 66 75 6c 6c 2d 74 61 62 6c   (2) A full-tabl
2f950 65 2d 73 63 61 6e 20 70 6c 61 6e 20 63 61 6e 6e  e-scan plan cann
2f960 6f 74 20 73 75 70 65 72 63 65 64 65 20 69 6e 64  ot supercede ind
2f970 65 78 65 64 20 70 6c 61 6e 20 75 6e 6c 65 73 73  exed plan unless
2f980 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2f990 20 20 74 68 65 20 66 75 6c 6c 2d 74 61 62 6c 65    the full-table
2f9a0 2d 73 63 61 6e 20 69 73 20 61 6e 20 22 6f 70 74  -scan is an "opt
2f9b0 69 6d 61 6c 22 20 70 6c 61 6e 20 61 73 20 64 65  imal" plan as de
2f9c0 66 69 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  fined above..   
2f9d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2f9e0 2a 2a 20 20 20 28 33 29 20 41 6c 6c 20 74 61 62  **   (3) All tab
2f9f0 6c 65 73 20 68 61 76 65 20 61 6e 20 49 4e 44 45  les have an INDE
2fa00 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72  XED BY clause or
2fa10 20 74 68 69 73 20 74 61 62 6c 65 20 6c 61 63 6b   this table lack
2fa20 73 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s an.        ** 
2fa30 20 20 20 20 20 20 49 4e 44 45 58 45 44 20 42 59        INDEXED BY
2fa40 20 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20   clause or this 
2fa50 74 61 62 6c 65 20 75 73 65 73 20 74 68 65 20 73  table uses the s
2fa60 70 65 63 69 66 69 63 0a 20 20 20 20 20 20 20 20  pecific.        
2fa70 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 73  **       index s
2fa80 70 65 63 69 66 69 65 64 20 62 79 20 69 74 73 20  pecified by its 
2fa90 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2faa0 65 2e 20 20 54 68 69 73 20 72 75 6c 65 20 65 6e  e.  This rule en
2fab0 73 75 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  sures.        **
2fac0 20 20 20 20 20 20 20 74 68 61 74 20 61 20 62 65         that a be
2fad0 73 74 2d 73 6f 2d 66 61 72 20 69 73 20 61 6c 77  st-so-far is alw
2fae0 61 79 73 20 73 65 6c 65 63 74 65 64 20 65 76 65  ays selected eve
2faf0 6e 20 69 66 20 61 6e 20 69 6d 70 6f 73 73 69 62  n if an impossib
2fb00 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  le.        **   
2fb10 20 20 20 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20      combination 
2fb20 6f 66 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  of INDEXED BY cl
2fb30 61 75 73 65 73 20 61 72 65 20 67 69 76 65 6e 2e  auses are given.
2fb40 20 20 54 68 65 20 65 72 72 6f 72 0a 20 20 20 20    The error.    
2fb50 20 20 20 20 2a 2a 20 20 20 20 20 20 20 77 69 6c      **       wil
2fb60 6c 20 62 65 20 64 65 74 65 63 74 65 64 20 61 6e  l be detected an
2fb70 64 20 72 65 6c 61 79 65 64 20 62 61 63 6b 20 74  d relayed back t
2fb80 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  o the applicatio
2fb90 6e 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20  n later..       
2fba0 20 2a 2a 20 20 20 20 20 20 20 54 68 65 20 4e 45   **       The NE
2fbb0 56 45 52 28 29 20 63 6f 6d 65 73 20 61 62 6f 75  VER() comes abou
2fbc0 74 20 62 65 63 61 75 73 65 20 72 75 6c 65 20 28  t because rule (
2fbd0 32 29 20 61 62 6f 76 65 20 70 72 65 76 65 6e 74  2) above prevent
2fbe0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  s.        **    
2fbf0 20 20 20 41 6e 20 69 6e 64 65 78 61 62 6c 65 20     An indexable 
2fc00 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20  full-table-scan 
2fc10 66 72 6f 6d 20 72 65 61 63 68 69 6e 67 20 72 75  from reaching ru
2fc20 6c 65 20 28 33 29 2e 0a 20 20 20 20 20 20 20 20  le (3)..        
2fc30 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2fc40 28 34 29 20 54 68 65 20 70 6c 61 6e 20 63 6f 73  (4) The plan cos
2fc50 74 20 6d 75 73 74 20 62 65 20 6c 6f 77 65 72 20  t must be lower 
2fc60 74 68 61 6e 20 70 72 69 6f 72 20 70 6c 61 6e 73  than prior plans
2fc70 20 6f 72 20 65 6c 73 65 20 74 68 65 0a 20 20 20   or else the.   
2fc80 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63 6f       **       co
2fc90 73 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  st must be the s
2fca0 61 6d 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ame and the numb
2fcb0 65 72 20 6f 66 20 72 6f 77 73 20 6d 75 73 74 20  er of rows must 
2fcc0 62 65 20 6c 6f 77 65 72 2e 0a 20 20 20 20 20 20  be lower..      
2fcd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2fce0 20 28 73 57 42 49 2e 63 6f 73 74 2e 75 73 65 64   (sWBI.cost.used
2fcf0 26 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3d  &sWBI.notValid)=
2fd00 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
2fd10 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
2fd20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2fd30 62 65 73 74 4a 3c 30 20 7c 7c 20 28 6e 6f 74 49  bestJ<0 || (notI
2fd40 6e 64 65 78 65 64 26 6d 29 21 3d 30 20 20 20 20  ndexed&m)!=0    
2fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd60 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
2fd70 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 62             || (b
2fd80 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
2fd90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
2fda0 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20  _FULLSCAN)==0.  
2fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2fdc0 20 28 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e   (sWBI.cost.plan
2fdd0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2fde0 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d  _NOT_FULLSCAN)!=
2fdf0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  0).            &
2fe00 26 20 28 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65  & (nUnconstraine
2fe10 64 3d 3d 30 20 7c 7c 20 73 57 42 49 2e 70 53 72  d==0 || sWBI.pSr
2fe20 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 20 20 20  c->pIndex==0    
2fe30 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20      /* (3) */.  
2fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2fe50 20 4e 45 56 45 52 28 28 73 57 42 49 2e 63 6f 73   NEVER((sWBI.cos
2fe60 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  t.plan.wsFlags &
2fe70 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
2fe80 43 41 4e 29 21 3d 30 29 29 0a 20 20 20 20 20 20  CAN)!=0)).      
2fe90 20 20 20 20 20 20 26 26 20 28 62 65 73 74 4a 3c        && (bestJ<
2fea0 30 20 7c 7c 20 73 57 42 49 2e 63 6f 73 74 2e 72  0 || sWBI.cost.r
2feb0 43 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43  Cost<bestPlan.rC
2fec0 6f 73 74 20 20 20 20 20 20 20 20 2f 2a 20 28 34  ost        /* (4
2fed0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
2fee0 20 20 20 20 20 7c 7c 20 28 73 57 42 49 2e 63 6f       || (sWBI.co
2fef0 73 74 2e 72 43 6f 73 74 3c 3d 62 65 73 74 50 6c  st.rCost<=bestPl
2ff00 61 6e 2e 72 43 6f 73 74 20 0a 20 20 20 20 20 20  an.rCost .      
2ff10 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 57             && sW
2ff20 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f  BI.cost.plan.nRo
2ff30 77 3c 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  w<bestPlan.plan.
2ff40 6e 52 6f 77 29 29 0a 20 20 20 20 20 20 20 20 29  nRow)).        )
2ff50 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  {.          WHER
2ff60 45 54 52 41 43 45 28 28 22 3d 3d 3d 20 74 61 62  ETRACE(("=== tab
2ff70 6c 65 20 25 64 20 28 25 73 29 20 69 73 20 62 65  le %d (%s) is be
2ff80 73 74 20 73 6f 20 66 61 72 22 0a 20 20 20 20 20  st so far".     
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffa0 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25 2e 31   " with cost=%.1
2ffb0 66 2c 20 6e 52 6f 77 3d 25 2e 31 66 2c 20 6e 4f  f, nRow=%.1f, nO
2ffc0 42 53 61 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  BSat=%d\n",.    
2ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffe0 20 20 6a 2c 20 73 57 42 49 2e 70 53 72 63 2d 3e    j, sWBI.pSrc->
2fff0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
30000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30010 20 20 20 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f     sWBI.cost.rCo
30020 73 74 2c 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c  st, sWBI.cost.pl
30030 61 6e 2e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  an.nRow,.       
30040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
30050 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f  WBI.cost.plan.nO
30060 42 53 61 74 29 29 3b 0a 20 20 20 20 20 20 20 20  BSat));.        
30070 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 57 42    bestPlan = sWB
30080 49 2e 63 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  I.cost;.        
30090 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20    bestJ = j;.   
300a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
300b0 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  f( doNotReorder 
300c0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
300d0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
300e0 74 28 20 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20  t( bestJ>=0 );. 
300f0 20 20 20 61 73 73 65 72 74 28 20 73 57 42 49 2e     assert( sWBI.
30100 6e 6f 74 56 61 6c 69 64 20 26 20 67 65 74 4d 61  notValid & getMa
30110 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
30120 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
30130 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  iCursor) );.    
30140 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
30150 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65 63   Optimizer selec
30160 74 73 20 74 61 62 6c 65 20 25 64 20 28 25 73 29  ts table %d (%s)
30170 20 66 6f 72 20 6c 6f 6f 70 20 25 64 20 77 69 74   for loop %d wit
30180 68 3a 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  h:\n".          
30190 20 20 20 20 20 20 22 20 20 20 20 63 6f 73 74 3d        "    cost=
301a0 25 2e 31 66 2c 20 6e 52 6f 77 3d 25 2e 31 66 2c  %.1f, nRow=%.1f,
301b0 20 6e 4f 42 53 61 74 3d 25 64 20 77 73 46 6c 61   nOBSat=%d wsFla
301c0 67 73 3d 30 78 25 30 38 78 5c 6e 22 2c 0a 20 20  gs=0x%08x\n",.  
301d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
301e0 73 74 4a 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  stJ, pTabList->a
301f0 5b 62 65 73 74 4a 5d 2e 70 54 61 62 2d 3e 7a 4e  [bestJ].pTab->zN
30200 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
30210 20 20 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e       pLevel-pWIn
30220 66 6f 2d 3e 61 2c 20 62 65 73 74 50 6c 61 6e 2e  fo->a, bestPlan.
30230 72 43 6f 73 74 2c 20 62 65 73 74 50 6c 61 6e 2e  rCost, bestPlan.
30240 70 6c 61 6e 2e 6e 52 6f 77 2c 0a 20 20 20 20 20  plan.nRow,.     
30250 20 20 20 20 20 20 20 20 20 20 20 62 65 73 74 50             bestP
30260 6c 61 6e 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 2c  lan.plan.nOBSat,
30270 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77   bestPlan.plan.w
30280 73 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66  sFlags));.    if
30290 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  ( (bestPlan.plan
302a0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
302b0 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a  _ORDERBY)!=0 ){.
302c0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f        pWInfo->nO
302d0 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d  BSat = pOrderBy-
302e0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20  >nExpr;.    }.  
302f0 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e    if( (bestPlan.
30300 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
30310 48 45 52 45 5f 44 49 53 54 49 4e 43 54 29 21 3d  HERE_DISTINCT)!=
30320 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
30330 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  t( pWInfo->eDist
30340 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
30350 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
30360 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
30370 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
30380 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73 20   }.    andFlags 
30390 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  &= bestPlan.plan
303a0 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c  .wsFlags;.    pL
303b0 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20 62 65 73  evel->plan = bes
303c0 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20 20 20 20  tPlan.plan;.    
303d0 74 65 73 74 63 61 73 65 28 20 62 65 73 74 50 6c  testcase( bestPl
303e0 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  an.plan.wsFlags 
303f0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
30400 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
30410 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77   bestPlan.plan.w
30420 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
30430 45 4d 50 5f 49 4e 44 45 58 20 29 3b 0a 20 20 20  EMP_INDEX );.   
30440 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c   if( bestPlan.pl
30450 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
30460 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52  ERE_INDEXED|WHER
30470 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 20 29 7b  E_TEMP_INDEX) ){
30480 0a 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72  .      if( (wctr
30490 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
304a0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 0a 20  NETABLE_ONLY) . 
304b0 20 20 20 20 20 20 26 26 20 28 62 65 73 74 50 6c        && (bestPl
304c0 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  an.plan.wsFlags 
304d0 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
304e0 45 58 29 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b  EX)==0 .      ){
304f0 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
30500 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64 78 43  >iIdxCur = iIdxC
30510 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ur;.      }else{
30520 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
30530 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73  >iIdxCur = pPars
30540 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
30550 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
30560 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
30570 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Cur = -1;.    }.
30580 20 20 20 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69      sWBI.notVali
30590 64 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d  d &= ~getMask(pM
305a0 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
305b0 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73  ->a[bestJ].iCurs
305c0 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  or);.    pLevel-
305d0 3e 69 46 72 6f 6d 20 3d 20 28 75 38 29 62 65 73  >iFrom = (u8)bes
305e0 74 4a 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74  tJ;.    if( best
305f0 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d  Plan.plan.nRow>=
30600 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20 20 20  (double)1 ){.   
30610 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
30620 79 4c 6f 6f 70 20 2a 3d 20 62 65 73 74 50 6c 61  yLoop *= bestPla
30630 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20  n.plan.nRow;.   
30640 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
30650 20 74 68 61 74 20 69 66 20 74 68 65 20 74 61 62   that if the tab
30660 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68  le scanned by th
30670 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f  is loop iteratio
30680 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a 20  n had an.    ** 
30690 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
306a0 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74  e attached to it
306b0 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65 64  , that the named
306c0 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e 67 0a   index is being.
306d0 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20      ** used for 
306e0 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f 74  the scan. If not
306f0 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63 6f 6d  , then query com
30700 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66 61 69  pilation has fai
30710 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75  led..    ** Retu
30720 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  rn an error..   
30730 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70   */.    pIdx = p
30740 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a  TabList->a[bestJ
30750 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ].pIndex;.    if
30760 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
30770 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c  if( (bestPlan.pl
30780 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
30790 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
307a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
307b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
307c0 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e  , "cannot use in
307d0 64 65 78 3a 20 25 73 22 2c 20 70 49 64 78 2d 3e  dex: %s", pIdx->
307e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
307f0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
30800 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rror;.      }els
30810 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
30820 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
30830 6c 61 75 73 65 20 69 73 20 75 73 65 64 2c 20 74  lause is used, t
30840 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 66  he bestIndex() f
30850 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 20  unction is.     
30860 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
30870 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 64   to find the ind
30880 65 78 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ex specified in 
30890 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
308a0 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
308b0 20 69 66 20 69 74 20 66 69 6e 64 20 61 6e 20 69   if it find an i
308c0 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a  ndex at all. */.
308d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
308e0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e  bestPlan.plan.u.
308f0 70 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a 20 20  pIdx==pIdx );.  
30900 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
30910 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
30920 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
30930 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
30940 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
30950 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
30960 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
30970 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
30980 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  or;.  }..  /* If
30990 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
309a0 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20   only selects a 
309b0 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e  single row, then
309c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
309d0 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72  ** clause is irr
309e0 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20  elevant..  */.  
309f0 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20  if( (andFlags & 
30a00 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
30a10 20 26 26 20 70 4f 72 64 65 72 42 79 20 29 7b 0a   && pOrderBy ){.
30a20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53      pWInfo->nOBS
30a30 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  at = pOrderBy->n
30a40 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Expr;.  }..  /* 
30a50 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
30a60 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
30a70 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
30a80 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
30a90 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
30aa0 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
30ab0 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
30ac0 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
30ad0 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
30ae0 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
30af0 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
30b00 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
30b10 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
30b20 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
30b30 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67  to update a sing
30b40 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61  le row..  */.  a
30b50 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
30b60 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
30b70 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
30b80 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
30b90 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
30ba0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
30bb0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
30bc0 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67  )!=0 && (andFlag
30bd0 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
30be0 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e  )!=0 ){.    pWIn
30bf0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20  fo->okOnePass = 
30c00 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
30c10 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  [0].plan.wsFlags
30c20 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
30c30 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  NLY;.  }..  /* O
30c40 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
30c50 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
30c60 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
30c70 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
30c80 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
30c90 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
30ca0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
30cb0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
30cc0 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
30cd0 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
30ce0 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74  er Goto */.  not
30cf0 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
30d00 6b 29 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  k)0;.  pWInfo->n
30d10 52 6f 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65  RowOut = (double
30d20 29 31 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20  )1;.  for(ii=0, 
30d30 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
30d40 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
30d50 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
30d60 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
30d70 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
30d80 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
30d90 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
30da0 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
30db0 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
30dc0 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
30dd0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
30de0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a  item *pTabItem;.
30df0 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
30e00 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
30e10 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
30e20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d   pTab = pTabItem
30e30 2d 3e 70 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->pTab;.    pLev
30e40 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54  el->iTabCur = pT
30e50 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
30e60 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
30e70 77 4f 75 74 20 2a 3d 20 70 4c 65 76 65 6c 2d 3e  wOut *= pLevel->
30e80 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 69  plan.nRow;.    i
30e90 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
30ea0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
30eb0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
30ec0 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
30ed0 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
30ee0 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
30ef0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
30f00 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
30f10 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69   */.    }else.#i
30f20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30f30 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
30f40 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
30f50 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
30f60 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
30f70 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  E)!=0 ){.      c
30f80 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62  onst char *pVTab
30f90 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
30fa0 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c  )sqlite3GetVTabl
30fb0 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
30fc0 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54     int iCur = pT
30fd0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
30fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30ff0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
31000 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30  Open, iCur, 0, 0
31010 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42  , pVTab, P4_VTAB
31020 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
31030 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65  dif.    if( (pLe
31040 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
31050 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
31060 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
31070 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
31080 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
31090 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20  _CLOSE)==0 ){.  
310a0 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49      int op = pWI
310b0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f  nfo->okOnePass ?
310c0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20   OP_OpenWrite : 
310d0 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
310e0 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
310f0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
31100 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69  Item->iCursor, i
31110 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20  Db, pTab, op);. 
31120 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
31130 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  Tab->nCol==BMS-1
31140 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
31150 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  se( pTab->nCol==
31160 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
31170 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
31180 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
31190 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20  l<BMS ){.       
311a0 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
311b0 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
311c0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
311d0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
311e0 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
311f0 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
31200 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
31210 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
31220 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a  rentAddr(v)-1, .
31230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31240 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
31250 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29  TE_INT_TO_PTR(n)
31260 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
31270 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
31280 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
31290 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
312a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
312b0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
312c0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
312d0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
312e0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
312f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31300 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
31310 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
31320 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
31330 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30  E_TEMP_INDEX)!=0
31340 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
31350 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
31360 78 28 70 50 61 72 73 65 2c 20 73 57 42 49 2e 70  x(pParse, sWBI.p
31370 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f  WC, pTabItem, no
31380 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b  tReady, pLevel);
31390 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
313a0 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  f.    if( (pLeve
313b0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
313c0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
313d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  !=0 ){.      Ind
313e0 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c  ex *pIx = pLevel
313f0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
31400 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
31410 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
31420 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
31430 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74   pIx);.      int
31440 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65   iIndexCur = pLe
31450 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
31460 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
31470 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
31480 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
31490 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43   assert( iIndexC
314a0 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ur>=0 );.      s
314b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
314c0 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
314d0 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d   iIndexCur, pIx-
314e0 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
314f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31500 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c      (char*)pKey,
31510 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
31520 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65  OFF);.      Vdbe
31530 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
31540 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
31550 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
31560 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
31570 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
31580 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
31590 7e 67 65 74 4d 61 73 6b 28 73 57 42 49 2e 70 57  ~getMask(sWBI.pW
315a0 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  C->pMaskSet, pTa
315b0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
315c0 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  .  }.  pWInfo->i
315d0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
315e0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
315f0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
31600 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
31610 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
31620 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
31630 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  he code to do th
31640 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20  e search.  Each 
31650 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
31660 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62   for.  ** loop b
31670 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63  elow generates c
31680 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
31690 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
316a0 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67  the VM.  ** prog
316b0 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  ram..  */.  notR
316c0 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
316d0 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  )0;.  for(ii=0; 
316e0 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
316f0 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  +){.    pLevel =
31700 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b   &pWInfo->a[ii];
31710 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53  .    explainOneS
31720 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  can(pParse, pTab
31730 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69  List, pLevel, ii
31740 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
31750 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20   wctrlFlags);.  
31760 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64    notReady = cod
31770 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57  eOneLoopStart(pW
31780 49 6e 66 6f 2c 20 69 69 2c 20 77 63 74 72 6c 46  Info, ii, wctrlF
31790 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29 3b  lags, notReady);
317a0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  .    pWInfo->iCo
317b0 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d  ntinue = pLevel-
317c0 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a  >addrCont;.  }..
317d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
317e0 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69  ST  /* For testi
317f0 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
31800 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f   use only */.  /
31810 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * Record in the 
31820 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72  query plan infor
31830 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
31840 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20   current table. 
31850 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65   ** and the inde
31860 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  x used to access
31870 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49   it (if any).  I
31880 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65  f the table itse
31890 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75  lf.  ** is not u
318a0 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73  sed, its name is
318b0 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20   just '{}'.  If 
318c0 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  no index is used
318d0 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  .  ** the index 
318e0 69 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d  is listed as "{}
318f0 22 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61  ".  If the prima
31900 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74  ry key is used t
31910 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61  he.  ** index na
31920 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a  me is '*'..  */.
31930 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
31940 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a  TabList; ii++){.
31950 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
31960 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 6e 74 20   int n;.    int 
31970 77 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  w;.    struct Sr
31980 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
31990 49 74 65 6d 3b 0a 0a 20 20 20 20 70 4c 65 76 65  Item;..    pLeve
319a0 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
319b0 69 5d 3b 0a 20 20 20 20 77 20 3d 20 70 4c 65 76  i];.    w = pLev
319c0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
319d0 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ;.    pTabItem =
319e0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
319f0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
31a00 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e    z = pTabItem->
31a10 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20  zAlias;.    if( 
31a20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49  z==0 ) z = pTabI
31a30 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
31a40 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
31a50 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20  3Strlen30(z);.  
31a60 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
31a70 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
31a80 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29  query_plan)-10 )
31a90 7b 0a 20 20 20 20 20 20 69 66 28 20 28 77 20 26  {.      if( (w &
31aa0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
31ab0 21 3d 30 20 26 26 20 28 77 20 26 20 57 48 45 52  !=0 && (w & WHER
31ac0 45 5f 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30  E_COVER_SCAN)==0
31ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
31ae0 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
31af0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
31b00 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20  "{}", 2);.      
31b10 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20    nQPlan += 2;. 
31b20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31b30 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
31b40 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
31b50 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20  QPlan], z, n);. 
31b60 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
31b70 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
31b80 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
31b90 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d  plan[nQPlan++] =
31ba0 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20   ' ';.    }.    
31bb0 74 65 73 74 63 61 73 65 28 20 77 20 26 20 57 48  testcase( w & WH
31bc0 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a  ERE_ROWID_EQ );.
31bd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 20      testcase( w 
31be0 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  & WHERE_ROWID_RA
31bf0 4e 47 45 20 29 3b 0a 20 20 20 20 69 66 28 20 77  NGE );.    if( w
31c00 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f   & (WHERE_ROWID_
31c10 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
31c20 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 6d  ANGE) ){.      m
31c30 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
31c40 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
31c50 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20 20  ], "* ", 2);.   
31c60 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a     nQPlan += 2;.
31c70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 77      }else if( (w
31c80 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
31c90 29 21 3d 30 20 26 26 20 28 77 20 26 20 57 48 45  )!=0 && (w & WHE
31ca0 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d  RE_COVER_SCAN)==
31cb0 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73  0 ){.      n = s
31cc0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
31cd0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
31ce0 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
31cf0 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
31d00 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
31d10 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b  query_plan)-2 ){
31d20 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
31d30 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
31d40 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65  lan[nQPlan], pLe
31d50 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
31d60 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
31d70 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
31d80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
31d90 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
31da0 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
31db0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
31dc0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
31dd0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
31de0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22  n[nQPlan], "{} "
31df0 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  , 3);.      nQPl
31e00 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20  an += 3;.    }. 
31e10 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c   }.  while( nQPl
31e20 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f  an>0 && sqlite3_
31e30 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
31e40 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20  n-1]==' ' ){.   
31e50 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
31e60 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20  lan[--nQPlan] = 
31e70 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
31e80 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
31e90 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61  an] = 0;.  nQPla
31ea0 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a  n = 0;.#endif /*
31eb0 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20   SQLITE_TEST // 
31ec0 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  Testing and debu
31ed0 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a  gging use only *
31ee0 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  /..  /* Record t
31ef0 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
31f00 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 57  address in the W
31f10 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
31f20 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63  re.  Then.  ** c
31f30 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75  lean up and retu
31f40 72 6e 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  rn..  */.  retur
31f50 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
31f60 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
31f70 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
31f80 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
31f90 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
31fa0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
31fb0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
31fc0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
31fd0 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
31fe0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
31ff0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
32000 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
32010 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
32020 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
32030 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
32040 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
32050 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
32060 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
32070 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
32080 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
32090 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
320a0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
320b0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
320c0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
320d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
320e0 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
320f0 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69  *pLevel;.  SrcLi
32100 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
32110 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
32120 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
32130 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
32140 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70  /* Generate loop
32150 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64   termination cod
32160 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
32170 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
32180 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
32190 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
321a0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
321b0 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
321c0 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  nfo->a[i];.    s
321d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
321e0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
321f0 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
32200 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
32210 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
32220 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32230 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op2(v, pLevel->o
32240 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
32250 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20  Level->p2);.    
32260 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
32270 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d  ngeP5(v, pLevel-
32280 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >p5);.    }.    
32290 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
322a0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
322b0 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76  _IN_ABLE && pLev
322c0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29  el->u.in.nIn>0 )
322d0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  {.      struct I
322e0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
322f0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
32300 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
32310 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
32320 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  ->addrNxt);.    
32330 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
32340 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70  u.in.nIn, pIn=&p
32350 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
32360 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
32370 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
32380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
32390 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
323a0 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20  addrInTop+1);.  
323b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
323c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
323d0 78 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  xt, pIn->iCur, p
323e0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
323f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
32400 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
32410 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
32420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32430 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
32440 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
32450 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
32460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
32470 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
32480 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
32490 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
324a0 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
324b0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
324c0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
324d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
324e0 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  P_IfPos, pLevel-
324f0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
32500 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 65 76     assert( (pLev
32510 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
32520 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
32530 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Y)==0.          
32540 20 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61   || (pLevel->pla
32550 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
32560 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b  E_INDEXED)!=0 );
32570 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76  .      if( (pLev
32580 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
32590 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
325a0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
325b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
325c0 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
325d0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
325e0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
325f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
32600 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
32610 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
32620 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
32630 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
32640 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
32650 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32660 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
32670 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
32680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32690 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
326a0 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
326b0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
326c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
326d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
326e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
326f0 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
32700 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
32710 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
32720 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
32730 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ddr);.    }.  }.
32740 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
32750 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
32760 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
32770 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
32780 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
32790 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
327a0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
327b0 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
327c0 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  eak);..  /* Clos
327d0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
327e0 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
327f0 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
32800 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f  WhereBegin..  */
32810 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
32820 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20  o->nLevel==1 || 
32830 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
32840 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
32850 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
32860 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
32870 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
32880 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
32890 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
328a0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
328b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
328c0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
328d0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
328e0 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
328f0 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
32900 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
32910 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
32920 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
32930 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
32940 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20  emeral)==0.     
32950 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
32960 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  ==0.     && (pWI
32970 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
32980 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
32990 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20  N_CLOSE)==0.    
329a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20  ){.      int ws 
329b0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  = pLevel->plan.w
329c0 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66  sFlags;.      if
329d0 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
329e0 50 61 73 73 20 26 26 20 28 77 73 20 26 20 57 48  Pass && (ws & WH
329f0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
32a00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
32a10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
32a20 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49   OP_Close, pTabI
32a30 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
32a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
32a50 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
32a60 45 58 45 44 29 21 3d 30 20 26 26 20 28 77 73 20  EXED)!=0 && (ws 
32a70 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
32a80 45 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  EX)==0 ){.      
32a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32aa0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
32ab0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
32ac0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
32ad0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
32ae0 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e   scan uses an in
32af0 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73  dex, make code s
32b00 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20  ubstitutions to 
32b10 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a  read data.    **
32b20 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
32b30 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f  in preference to
32b40 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65   the table. Some
32b50 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e  times, this mean
32b60 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62  s.    ** the tab
32b70 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65  le need never be
32b80 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73   read from. This
32b90 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   is a performanc
32ba0 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20  e boost,.    ** 
32bb0 61 73 20 74 68 65 20 76 64 62 65 20 6c 65 76 65  as the vdbe leve
32bc0 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68  l waits until th
32bd0 65 20 74 61 62 6c 65 20 69 73 20 72 65 61 64 20  e table is read 
32be0 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a  before actually.
32bf0 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74      ** seeking t
32c00 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  he table cursor 
32c10 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  to the record co
32c20 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
32c30 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a  he current.    *
32c40 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  * position in th
32c50 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20  e index..    ** 
32c60 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
32c70 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
32c80 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
32c90 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
32ca0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
32cb0 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
32cc0 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
32cd0 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
32ce0 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
32cf0 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
32d00 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
32d10 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
32d20 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
32d30 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
32d40 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
32d50 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
32d60 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
32d70 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
32d80 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
32d90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
32da0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
32db0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
32dc0 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 70 49  EXED ){.      pI
32dd0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
32de0 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 7d 65  n.u.pIdx;.    }e
32df0 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
32e00 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
32e10 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
32e20 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c  .      pIdx = pL
32e30 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b  evel->u.pCovidx;
32e40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
32e50 49 64 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Idx && !db->mall
32e60 6f 63 46 61 69 6c 65 64 29 7b 0a 20 20 20 20 20  ocFailed){.     
32e70 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b   int k, j, last;
32e80 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
32e90 4f 70 3b 0a 0a 20 20 20 20 20 20 70 4f 70 20 3d  Op;..      pOp =
32ea0 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
32eb0 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f  p(v, pWInfo->iTo
32ec0 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d  p);.      last =
32ed0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
32ee0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
32ef0 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e    for(k=pWInfo->
32f00 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  iTop; k<last; k+
32f10 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
32f20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
32f30 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
32f40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
32f50 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
32f60 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29  ode==OP_Column )
32f70 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
32f80 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
32f90 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
32fa0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
32fb0 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  >p2==pIdx->aiCol
32fc0 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  umn[j] ){.      
32fd0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
32fe0 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
32ff0 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
33000 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
33010 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
33020 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
33030 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
33040 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
33050 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
33060 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
33070 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
33080 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 70 49           || j<pI
33090 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  dx->nColumn );. 
330a0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
330b0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
330c0 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
330d0 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
330e0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
330f0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
33100 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
33110 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
33120 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
33130 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61  .  /* Final clea
33140 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73  nup.  */.  pPars
33150 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
33160 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
33170 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65  eryLoop;.  where
33180 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
33190 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  nfo);.  return;.
331a0 7d 0a                                            }.