/ Hex Artifact Content
Login

Artifact 53b991af50dab230b319b098bcb90fc7cd82da47:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0460: 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  e.# define WHERE
0470: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
0480: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0490: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
04a0: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
04b0: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65  WhereMaskSet Whe
04e0: 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64  reMaskSet;.typed
04f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0500: 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66  rInfo WhereOrInf
0510: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0520: 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57  t WhereAndInfo W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70  hereAndInfo;.typ
0540: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0550: 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b  eCost WhereCost;
0560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0570: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0580: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0590: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
05a0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
05b0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
05c0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
05d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05e0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05f0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0600: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0610: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0620: 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f   others by AND o
0630: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75  perators,.** usu
0640: 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d  ally, or sometim
0650: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
0660: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  s separated by O
0670: 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  R..**.** All Whe
0680: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
0690: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
06a0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06b0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
06c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
06d0: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
06e0: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
06f0: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
0700: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0710: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0720: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0730: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0750: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
0760: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
0770: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
0780: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
0790: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
07a0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07b0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
07c0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
07d0: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
07e0: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
07f0: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
0800: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
0810: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
0820: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
0830: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0840: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0850: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
0860: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0870: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0880: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0890: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
08a0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
08b0: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
08c0: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
08d0: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
08e0: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
08f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
0900: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
0910: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
0920: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
0930: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
0940: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
0950: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
0960: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
0970: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
0980: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
0990: 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68 65  e, wtFlag as the
09a0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74   TERM_ORINFO set
09b0: 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d   and eOperator==
09c0: 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65  WO_OR.** and the
09d0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
09e0: 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74  Info field point
09f0: 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69  s to auxiliary i
0a00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a  nformation that.
0a10: 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ** is collected 
0a20: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20  about the.**.** 
0a30: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
0a40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
0a50: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
0a60: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
0a70: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
0a80: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
0a90: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
0aa0: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
0ab0: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
0ac0: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
0ad0: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
0ae0: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
0af0: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
0b00: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
0b10: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
0b20: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
0b30: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
0b40: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
0b50: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
0b60: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
0b70: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0b80: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0ba0: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0bb0: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0bc0: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
0bd0: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
0be0: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
0bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
0c00: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
0c10: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
0c20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
0c30: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
0c40: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
0c50: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
0c60: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
0c70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
0c80: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
0c90: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
0ca0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0cb0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0cc0: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
0cd0: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
0ce0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
0cf0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
0d00: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
0d10: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
0d20: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
0d30: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
0d40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
0d50: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0d60: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0d70: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0d80: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0d90: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0da0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0db0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0dc0: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0dd0: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0de0: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0df0: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0e00: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0e10: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0e20: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0e30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0e40: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0e50: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
0e60: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
0e70: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
0e80: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
0e90: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
0ea0: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
0eb0: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
0ec0: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
0ed0: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
0ee0: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
0ef0: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
0f00: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
0f10: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65   tables..*/.type
0f20: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0f30: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0f40: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f50: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0f80: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
0f90: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
0fa0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0fc0: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
0fd0: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
0fe0: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
0ff0: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
1000: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
1010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1020: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
1030: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
1040: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
1050: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
1060: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
1070: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
1080: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
1090: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
10a0: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
10b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f  nformation if eO
10c0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a  perator==WO_OR *
10d0: 2f 0a 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e  /.    WhereAndIn
10e0: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a  fo *pAndInfo; /*
10f0: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
1100: 6f 6e 20 69 66 20 65 4f 70 65 72 61 74 6f 72 3d  on if eOperator=
1110: 3d 57 4f 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75  =WO_AND */.  } u
1120: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
1130: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
1140: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
1150: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
1160: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
1170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
1180: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
1190: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
11a0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
11b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11c0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
11d0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
11e0: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
11f0: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
1200: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
1210: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
1220: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
1230: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
1240: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
1250: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
1260: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
1270: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
1280: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
1290: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
12a0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
12b0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
12c0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
12d0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
12e0: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
12f0: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
1300: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
1310: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
1320: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1330: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
1340: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
1350: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
1360: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
1370: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
1380: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
1390: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
13a0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
13b0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
13c0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
13d0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
13e0: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
13f0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
1400: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
1410: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
1420: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
1430: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
1440: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
1450: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
1460: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
1470: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
1480: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
1490: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
14a0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
14b0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
14c0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
14d0: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
14e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14f0: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
1500: 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20  VNULL    0x80   
1510: 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20  /* Manufactured 
1520: 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c  x>NULL or x<=NUL
1530: 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a  L term */.#else.
1540: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
1550: 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f  NULL    0x00   /
1560: 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f  * Disabled if no
1570: 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f  t using stat3 */
1580: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1590: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
15a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
15b0: 63 74 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20  cture holds all 
15c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
15d0: 74 20 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  t a.** WHERE cla
15e0: 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69  use.  Mostly thi
15f0: 73 20 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72  s is a container
1600: 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   for one or more
1610: 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a   WhereTerms..**.
1620: 2a 2a 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ** Explanation o
1630: 66 20 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61  f pOuter:  For a
1640: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
1650: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
1660: 20 20 20 20 20 20 20 20 20 20 61 20 41 4e 44 20            a AND 
1670: 28 28 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64  ((b AND c) OR (d
1680: 20 41 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a   AND e)) AND f.*
1690: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73  *.** There are s
16a0: 65 70 61 72 61 74 65 20 57 68 65 72 65 43 6c 61  eparate WhereCla
16b0: 75 73 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  use objects for 
16c0: 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65  the whole clause
16d0: 20 61 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20   and for.** the 
16e0: 73 75 62 63 6c 61 75 73 65 73 20 22 28 62 20 41  subclauses "(b A
16f0: 4e 44 20 63 29 22 20 61 6e 64 20 22 28 64 20 41  ND c)" and "(d A
1700: 4e 44 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75  ND e)".  The pOu
1710: 74 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ter field of the
1720: 0a 2a 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70  .** subclauses p
1730: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65  oints to the Whe
1740: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
1750: 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c  for the whole cl
1760: 61 75 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ause..*/.struct 
1770: 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20  WhereClause {.  
1780: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1790: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17a0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
17b0: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
17c0: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a 20   *pMaskSet;  /* 
17d0: 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c 65  Mapping of table
17e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
17f0: 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20  to bitmasks */. 
1800: 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b 20   Bitmask vmask; 
1810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
1820: 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67  mask identifying
1830: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
1840: 75 72 73 6f 72 73 20 2a 2f 0a 20 20 57 68 65 72  ursors */.  Wher
1850: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
1860: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
1870: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
1880: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
1890: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
18a0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
18b0: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
18c0: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
18d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
18e0: 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45  ht include WHERE
18f0: 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69  _AND_ONLY */.  i
1900: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1910: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1920: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1930: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1950: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1960: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1970: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1980: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1990: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
19a0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
19b0: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
19c0: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
19d0: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
19e0: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
19f0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
1a00: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
1a10: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
1a20: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
1a30: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
1a40: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1a50: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1a60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1a70: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1a80: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1a90: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1aa0: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1ab0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1ac0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1ad0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1ae0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1af0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1b00: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1b10: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1b20: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1b30: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1b40: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1b50: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1b60: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1b70: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1b80: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1b90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1ba0: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1bb0: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1bc0: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1bd0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1be0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1bf0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1c00: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1c10: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1c20: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1c30: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1c40: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1c50: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1c60: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1c70: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1c80: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1c90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1ca0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1cb0: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1cc0: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1cd0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ce0: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1cf0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1d00: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1d10: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1d20: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1d30: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1d40: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1d50: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1d60: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1d70: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1d80: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1d90: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1da0: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1db0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1dc0: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1dd0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1de0: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1df0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1e00: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1e10: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1e20: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1e30: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1e40: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1e50: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1e60: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1e70: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1e80: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1e90: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1ea0: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1eb0: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1ec0: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1ed0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1ee0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1ef0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1f00: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1f10: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1f20: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1f30: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1f40: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f50: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1f60: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1f70: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1f80: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1f90: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1fa0: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1fb0: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1fc0: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1fd0: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1fe0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1ff0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
2000: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
2010: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
2020: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
2030: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
2040: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
2050: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
2060: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
2070: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
2080: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
2090: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
20a0: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
20b0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
20c0: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
20d0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
20e0: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
20f0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
2100: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
2110: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
2120: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
2130: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
2140: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
2150: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
2160: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
2170: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
2180: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21b0: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
21c0: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
21d0: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
21e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21f0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
2200: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
2210: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
2220: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
2230: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
2240: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2250: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2260: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2270: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2280: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2290: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
22a0: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
22b0: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
22c0: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
22d0: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
22e0: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
22f0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2300: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
2310: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
2320: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
2330: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
2340: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2350: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2360: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2370: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2380: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2390: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
23a0: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
23b0: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
23c0: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
23d0: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
23e0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
23f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
2400: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
2410: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
2420: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
2430: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
2440: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2450: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2460: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2470: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2480: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2490: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
24a0: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
24b0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
24c0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
24d0: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
24e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
24f0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
2500: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
2510: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
2520: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
2530: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
2540: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2550: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2560: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2570: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2580: 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20  #define WO_NOOP 
2590: 20 20 30 78 38 30 30 20 20 20 20 20 20 20 2f 2a    0x800       /*
25a0: 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65 73 20   This term does 
25b0: 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73 65 61  not restrict sea
25c0: 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64  rch space */..#d
25d0: 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20  efine WO_ALL    
25e0: 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d  0xfff       /* M
25f0: 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69  ask of all possi
2600: 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  ble WO_* values 
2610: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49  */.#define WO_SI
2620: 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20  NGLE 0x0ff      
2630: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2640: 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f  non-compound WO_
2650: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a  * values */../*.
2660: 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46  ** Value for wsF
2670: 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2680: 20 62 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64   bestIndex() and
2690: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68   stored in.** Wh
26a0: 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73  ereLevel.wsFlags
26b0: 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 64  .  These flags d
26c0: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73  etermine which s
26d0: 65 61 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67  earch.** strateg
26e0: 69 65 73 20 61 72 65 20 61 70 70 72 6f 70 72 69  ies are appropri
26f0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ate..**.** The l
2700: 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  east significant
2710: 20 31 32 20 62 69 74 73 20 69 73 20 72 65 73 65   12 bits is rese
2720: 72 76 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66  rved as a mask f
2730: 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62  or WO_ values ab
2740: 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72  ove..** The Wher
2750: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66  eLevel.wsFlags f
2760: 69 65 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20  ield is usually 
2770: 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f  set to WO_IN|WO_
2780: 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a  EQ|WO_ISNULL..**
2790: 20 42 75 74 20 69 66 20 74 68 65 20 74 61 62 6c   But if the tabl
27a0: 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
27b0: 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a  able of a left j
27c0: 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e  oin, WhereLevel.
27d0: 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65  wsFlags.** is se
27e0: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
27f0: 2e 20 20 54 68 65 20 57 68 65 72 65 4c 65 76 65  .  The WhereLeve
2800: 6c 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20  l.wsFlags field 
2810: 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64  can then be used
2820: 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20   as.** the "op" 
2830: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e  parameter to fin
2840: 64 54 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72  dTerm when we ar
2850: 65 20 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61  e resolving equa
2860: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
2870: 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73  ..** ISNULL cons
2880: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65  traints will the
2890: 6e 20 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e  n not be used on
28a0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
28b0: 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f   of a left.** jo
28c0: 69 6e 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31  in.  Tickets #21
28d0: 37 37 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f  77 and #2189..*/
28e0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
28f0: 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78 30 30  OWID_EQ     0x00
2900: 30 30 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64  001000  /* rowid
2910: 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49  =EXPR or rowid I
2920: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
2930: 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  ne WHERE_ROWID_R
2940: 41 4e 47 45 20 20 30 78 30 30 30 30 32 30 30 30  ANGE  0x00002000
2950: 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20    /* rowid<EXPR 
2960: 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50  and/or rowid>EXP
2970: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
2980: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20  RE_COLUMN_EQ    
2990: 30 78 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78  0x00010000  /* x
29a0: 3d 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e  =EXPR or x IN (.
29b0: 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c  ..) or x IS NULL
29c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
29d0: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30  E_COLUMN_RANGE 0
29e0: 78 30 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c  x00020000  /* x<
29f0: 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58  EXPR and/or x>EX
2a00: 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  PR */.#define WH
2a10: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20  ERE_COLUMN_IN   
2a20: 20 30 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20   0x00040000  /* 
2a30: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
2a40: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
2a50: 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38 30  MN_NULL  0x00080
2a60: 30 30 30 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c  000  /* x IS NUL
2a70: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  L */.#define WHE
2a80: 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20  RE_INDEXED      
2a90: 30 78 30 30 30 66 30 30 30 30 20 20 2f 2a 20 41  0x000f0000  /* A
2aa0: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 75 73 65  nything that use
2ab0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64  s an index */.#d
2ac0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4e 4f 54 5f  efine WHERE_NOT_
2ad0: 46 55 4c 4c 53 43 41 4e 20 30 78 31 30 30 66 33  FULLSCAN 0x100f3
2ae0: 30 30 30 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74  000  /* Does not
2af0: 20 64 6f 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   do a full table
2b00: 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65   scan */.#define
2b10: 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20   WHERE_IN_ABLE  
2b20: 20 20 20 20 30 78 30 30 30 66 31 30 30 30 20 20      0x000f1000  
2b30: 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75 70 70 6f  /* Able to suppo
2b40: 72 74 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  rt an IN operato
2b50: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  r */.#define WHE
2b60: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20  RE_TOP_LIMIT    
2b70: 30 78 30 30 31 30 30 30 30 30 20 20 2f 2a 20 78  0x00100000  /* x
2b80: 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52  <EXPR or x<=EXPR
2b90: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23   constraint */.#
2ba0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d  define WHERE_BTM
2bb0: 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 32 30  _LIMIT    0x0020
2bc0: 30 30 30 30 20 20 2f 2a 20 78 3e 45 58 50 52 20  0000  /* x>EXPR 
2bd0: 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74  or x>=EXPR const
2be0: 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  raint */.#define
2bf0: 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49   WHERE_BOTH_LIMI
2c00: 54 20 20 20 30 78 30 30 33 30 30 30 30 30 20 20  T   0x00300000  
2c10: 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50 52 20 61  /* Both x>EXPR a
2c20: 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65  nd x<EXPR */.#de
2c30: 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f  fine WHERE_IDX_O
2c40: 4e 4c 59 20 20 20 20 20 30 78 30 30 34 30 30 30  NLY     0x004000
2c50: 30 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  00  /* Use index
2c60: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
2c70: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
2c80: 45 52 45 5f 4f 52 44 45 52 45 44 20 20 20 20 20  ERE_ORDERED     
2c90: 20 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a 20   0x00800000  /* 
2ca0: 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65  Output will appe
2cb0: 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72  ar in correct or
2cc0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
2cd0: 48 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20  HERE_REVERSE    
2ce0: 20 20 30 78 30 31 30 30 30 30 30 30 20 20 2f 2a    0x01000000  /*
2cf0: 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   Scan in reverse
2d00: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2d10: 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20  e WHERE_UNIQUE  
2d20: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2d30: 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d   /* Selects no m
2d40: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
2d50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2d60: 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20 20 20 30  E_ALL_UNIQUE   0
2d70: 78 30 34 30 30 30 30 30 30 20 20 2f 2a 20 54 68  x04000000  /* Th
2d80: 69 73 20 61 6e 64 20 61 6c 6c 20 70 72 69 6f 72  is and all prior
2d90: 20 68 61 76 65 20 6f 6e 65 20 72 6f 77 20 2a 2f   have one row */
2da0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
2db0: 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78 30 38  IRTUALTABLE 0x08
2dc0: 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 76  000000  /* Use v
2dd0: 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f  irtual-table pro
2de0: 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69  cessing */.#defi
2df0: 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  ne WHERE_MULTI_O
2e00: 52 20 20 20 20 20 30 78 31 30 30 30 30 30 30 30  R     0x10000000
2e10: 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75    /* OR using mu
2e20: 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a  ltiple indices *
2e30: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2e40: 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78 32  TEMP_INDEX   0x2
2e50: 30 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 73  0000000  /* Uses
2e60: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2e70: 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  dex */.#define W
2e80: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 20 20 20  HERE_DISTINCT   
2e90: 20 20 30 78 34 30 30 30 30 30 30 30 20 20 2f 2a    0x40000000  /*
2ea0: 20 43 6f 72 72 65 63 74 20 6f 72 64 65 72 20 66   Correct order f
2eb0: 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 23  or DISTINCT */.#
2ec0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 56  define WHERE_COV
2ed0: 45 52 5f 53 43 41 4e 20 20 20 30 78 38 30 30 30  ER_SCAN   0x8000
2ee0: 30 30 30 30 20 20 2f 2a 20 46 75 6c 6c 20 73 63  0000  /* Full sc
2ef0: 61 6e 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67  an of a covering
2f00: 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   index */../*.**
2f10: 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63 6f 6e   This module con
2f20: 74 61 69 6e 73 20 6d 61 6e 79 20 73 65 70 61 72  tains many separ
2f30: 61 74 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ate subroutines 
2f40: 74 68 61 74 20 77 6f 72 6b 20 74 6f 67 65 74 68  that work togeth
2f50: 65 72 20 74 6f 0a 2a 2a 20 66 69 6e 64 20 74 68  er to.** find th
2f60: 65 20 62 65 73 74 20 69 6e 64 69 63 65 73 20 74  e best indices t
2f70: 6f 20 75 73 65 20 66 6f 72 20 61 63 63 65 73 73  o use for access
2f80: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
2f90: 20 74 61 62 6c 65 20 69 6e 20 61 20 71 75 65 72   table in a quer
2fa0: 79 2e 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  y..** An instanc
2fb0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2fc0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c  ng structure hol
2fd0: 64 73 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72  ds context infor
2fe0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
2ff0: 0a 2a 2a 20 69 6e 64 65 78 20 73 65 61 72 63 68  .** index search
3000: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
3010: 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 70  be more easily p
3020: 61 73 73 65 64 20 62 65 74 77 65 65 6e 20 74 68  assed between th
3030: 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 72 6f 75  e various.** rou
3040: 74 69 6e 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65  tines..*/.typede
3050: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 42 65  f struct WhereBe
3060: 73 74 49 64 78 20 57 68 65 72 65 42 65 73 74 49  stIdx WhereBestI
3070: 64 78 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65  dx;.struct Where
3080: 42 65 73 74 49 64 78 20 7b 0a 20 20 50 61 72 73  BestIdx {.  Pars
3090: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30b0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
30c0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
30d0: 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
30e0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
30f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
3100: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3110: 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
3120: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
3130: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
3140: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
3150: 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
3160: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
3170: 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61  rsors not availa
3180: 62 6c 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ble */.  Bitmask
3190: 20 6e 6f 74 56 61 6c 69 64 3b 20 20 20 20 20 20   notValid;      
31a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
31b0: 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
31c0: 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73  e for any purpos
31d0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
31e0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20  *pOrderBy;      
31f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
3200: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3210: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
3220: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
3230: 20 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74     /* The select
3240: 2d 6c 69 73 74 20 69 66 20 71 75 65 72 79 20 69  -list if query i
3250: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
3260: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
3270: 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 3b 20  fo **ppIdxInfo; 
3280: 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61  /* Index informa
3290: 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78  tion passed to x
32a0: 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 69  BestIndex */.  i
32b0: 6e 74 20 69 2c 20 6e 3b 20 20 20 20 20 20 20 20  nt i, n;        
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32d0: 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20 69 73 20  * Which loop is 
32e0: 62 65 69 6e 67 20 63 6f 64 65 64 3b 20 23 20 6f  being coded; # o
32f0: 66 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65  f loops */.  Whe
3300: 72 65 4c 65 76 65 6c 20 2a 61 4c 65 76 65 6c 3b  reLevel *aLevel;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3320: 49 6e 66 6f 20 61 62 6f 75 74 20 6f 75 74 65 72  Info about outer
3330: 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57 68 65 72   loops */.  Wher
3340: 65 43 6f 73 74 20 63 6f 73 74 3b 20 20 20 20 20  eCost cost;     
3350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3360: 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
3370: 20 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   plan */.};../*.
3380: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
3390: 66 20 74 68 65 20 70 72 6f 62 65 20 63 6f 73 74  f the probe cost
33a0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
33b0: 65 20 62 61 73 65 6c 69 6e 65 20 63 6f 73 74 0a  e baseline cost.
33c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
33d0: 6d 70 61 72 65 43 6f 73 74 28 63 6f 6e 73 74 20  mpareCost(const 
33e0: 57 68 65 72 65 43 6f 73 74 20 2a 70 50 72 6f 62  WhereCost *pProb
33f0: 65 2c 20 63 6f 6e 73 74 20 57 68 65 72 65 43 6f  e, const WhereCo
3400: 73 74 20 2a 70 42 61 73 65 6c 69 6e 65 29 7b 0a  st *pBaseline){.
3410: 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 72 43    if( pProbe->rC
3420: 6f 73 74 3c 70 42 61 73 65 6c 69 6e 65 2d 3e 72  ost<pBaseline->r
3430: 43 6f 73 74 20 29 20 72 65 74 75 72 6e 20 31 3b  Cost ) return 1;
3440: 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 72  .  if( pProbe->r
3450: 43 6f 73 74 3e 70 42 61 73 65 6c 69 6e 65 2d 3e  Cost>pBaseline->
3460: 72 43 6f 73 74 20 29 20 72 65 74 75 72 6e 20 30  rCost ) return 0
3470: 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  ;.  if( pProbe->
3480: 70 6c 61 6e 2e 6e 4f 42 53 61 74 3e 70 42 61 73  plan.nOBSat>pBas
3490: 65 6c 69 6e 65 2d 3e 70 6c 61 6e 2e 6e 4f 42 53  eline->plan.nOBS
34a0: 61 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  at ) return 1;. 
34b0: 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 6c 61   if( pProbe->pla
34c0: 6e 2e 6e 52 6f 77 3c 70 42 61 73 65 6c 69 6e 65  n.nRow<pBaseline
34d0: 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 29 20 72 65  ->plan.nRow ) re
34e0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
34f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
3500: 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c  tialize a preall
3510: 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75  ocated WhereClau
3520: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
3530: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
3540: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20  reClauseInit(.  
3550: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
3560: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3570: 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62  WhereClause to b
3580: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  e initialized */
3590: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
35a0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
35b0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
35c0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
35d0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
35e0: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
35f0: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75   table cursor nu
3600: 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b  mbers to bitmask
3610: 73 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  s */.  u16 wctrl
3620: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
3630: 2f 2a 20 4d 69 67 68 74 20 69 6e 63 6c 75 64 65  /* Might include
3640: 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
3650: 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61  */.){.  pWC->pPa
3660: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
3670: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20  pWC->pMaskSet = 
3680: 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d  pMaskSet;.  pWC-
3690: 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a 20 20 70  >pOuter = 0;.  p
36a0: 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20  WC->nTerm = 0;. 
36b0: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72   pWC->nSlot = Ar
36c0: 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74  raySize(pWC->aSt
36d0: 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20  atic);.  pWC->a 
36e0: 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a  = pWC->aStatic;.
36f0: 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30    pWC->vmask = 0
3700: 3b 0a 20 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c  ;.  pWC->wctrlFl
3710: 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
3720: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
3730: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
3740: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
3750: 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43  auseClear(WhereC
3760: 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  lause*);../*.** 
3770: 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d  Deallocate all m
3780: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
3790: 20 77 69 74 68 20 61 20 57 68 65 72 65 4f 72 49   with a WhereOrI
37a0: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
37b0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
37c0: 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  OrInfoDelete(sql
37d0: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f  ite3 *db, WhereO
37e0: 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65  rInfo *p){.  whe
37f0: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
3800: 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->wc);.  sqlite3
3810: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
3820: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
3830: 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  te all memory as
3840: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
3850: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a  WhereAndInfo obj
3860: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
3870: 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f  oid whereAndInfo
3880: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
3890: 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f  db, WhereAndInfo
38a0: 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61   *p){.  whereCla
38b0: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
38c0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
38d0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
38e0: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
38f0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
3900: 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65 72  cture.  The Wher
3910: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
3920: 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e  e.** itself is n
3930: 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73 20  ot freed.  This 
3940: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 69  routine is the i
3950: 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72 65 43  nverse of whereC
3960: 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a  lauseInit()..*/.
3970: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
3980: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65  eClauseClear(Whe
3990: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a  reClause *pWC){.
39a0: 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
39b0: 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74  Term *a;.  sqlit
39c0: 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50  e3 *db = pWC->pP
39d0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28  arse->db;.  for(
39e0: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20  i=pWC->nTerm-1, 
39f0: 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20  a=pWC->a; i>=0; 
3a00: 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69  i--, a++){.    i
3a10: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
3a20: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
3a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
3a40: 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70  rDelete(db, a->p
3a50: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
3a60: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
3a70: 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b  & TERM_ORINFO ){
3a80: 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e  .      whereOrIn
3a90: 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  foDelete(db, a->
3aa0: 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20  u.pOrInfo);.    
3ab0: 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46  }else if( a->wtF
3ac0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49  lags & TERM_ANDI
3ad0: 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65  NFO ){.      whe
3ae0: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
3af0: 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66  db, a->u.pAndInf
3b00: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
3b10: 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d  if( pWC->a!=pWC-
3b20: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
3b30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3b40: 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d  , pWC->a);.  }.}
3b50: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69  ../*.** Add a si
3b60: 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65  ngle new WhereTe
3b70: 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  rm entry to the 
3b80: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
3b90: 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e  ct pWC..** The n
3ba0: 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a  ew WhereTerm obj
3bb0: 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74  ect is construct
3bc0: 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61  ed from Expr p a
3bd0: 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e  nd with wtFlags.
3be0: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e  .** The index in
3bf0: 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65   pWC->a[] of the
3c00: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 69   new WhereTerm i
3c10: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
3c20: 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72  ccess..** 0 is r
3c30: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e  eturned if the n
3c40: 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75  ew WhereTerm cou
3c50: 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20  ld not be added 
3c60: 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a  due to a memory.
3c70: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ** allocation er
3c80: 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ror.  The memory
3c90: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
3ca0: 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f  ure will be reco
3cb0: 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  rded in.** the d
3cc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3cd0: 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69 67  flag so that hig
3ce0: 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69  her-level functi
3cf0: 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20 69  ons can detect i
3d00: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
3d10: 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65  utine will incre
3d20: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
3d30: 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72  the pWC->a[] arr
3d40: 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ay as necessary.
3d50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74  .**.** If the wt
3d60: 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  Flags argument i
3d70: 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e  ncludes TERM_DYN
3d80: 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f  AMIC, then respo
3d90: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72  nsibility.** for
3da0: 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70   freeing the exp
3db0: 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73  ression p is ass
3dc0: 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72  umed by the Wher
3dd0: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70  eClause object p
3de0: 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  WC..** This is t
3df0: 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69 73  rue even if this
3e00: 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74   routine fails t
3e10: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
3e20: 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
3e30: 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73  * WARNING:  This
3e40: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72   routine might r
3e50: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70  eallocate the sp
3e60: 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ace used to stor
3e70: 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e  e.** WhereTerms.
3e80: 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74    All pointers t
3e90: 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f  o WhereTerms sho
3ea0: 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74  uld be invalidat
3eb0: 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c  ed after.** call
3ec0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
3ed0: 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73  .  Such pointers
3ee0: 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61   may be reinitia
3ef0: 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e  lized by referen
3f00: 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d  cing.** the pWC-
3f10: 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  >a[] array..*/.s
3f20: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43  tatic int whereC
3f30: 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72  lauseInsert(Wher
3f40: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
3f50: 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67  pr *p, u8 wtFlag
3f60: 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  s){.  WhereTerm 
3f70: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64  *pTerm;.  int id
3f80: 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77  x;.  testcase( w
3f90: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
3fa0: 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a  RTUAL );  /* EV:
3fb0: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 20 2a   R-00211-15100 *
3fc0: 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65  /.  if( pWC->nTe
3fd0: 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29  rm>=pWC->nSlot )
3fe0: 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
3ff0: 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a  *pOld = pWC->a;.
4000: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4010: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pWC->pParse->d
4020: 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  b;.    pWC->a = 
4030: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
4040: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57  aw(db, sizeof(pW
4050: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53  C->a[0])*pWC->nS
4060: 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  lot*2 );.    if(
4070: 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20   pWC->a==0 ){.  
4080: 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73 20      if( wtFlags 
4090: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
40a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
40b0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
40c0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
40d0: 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b    pWC->a = pOld;
40e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
40f0: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
4100: 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20  y(pWC->a, pOld, 
4110: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
4120: 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20  )*pWC->nTerm);. 
4130: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43     if( pOld!=pWC
4140: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
4150: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4160: 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20  (db, pOld);.    
4170: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
4180: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
4190: 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e  ocSize(db, pWC->
41a0: 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  a)/sizeof(pWC->a
41b0: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72  [0]);.  }.  pTer
41c0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20  m = &pWC->a[idx 
41d0: 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b  = pWC->nTerm++];
41e0: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
41f0: 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  = p;.  pTerm->wt
4200: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
4210: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
4220: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
4230: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
4240: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
4250: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4260: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
4270: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
4280: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
4290: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
42a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
42b0: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
42c0: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
42d0: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
42e0: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
42f0: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
4300: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
4310: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
4320: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
4330: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
4340: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
4350: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
4360: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
4370: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
4380: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
4390: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
43a0: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
43b0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
43c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
43d0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
43e0: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
43f0: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
4400: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4420: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
4430: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
4440: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
4450: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
4460: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
4470: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
4480: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
4490: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
44a0: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
44b0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
44c0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
44d0: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
44e0: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
44f0: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
4500: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
4510: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
4520: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
4530: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
4540: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
4550: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
4560: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
4570: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
4580: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4590: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
45a0: 6e 74 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f  nt op){.  pWC->o
45b0: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66  p = (u8)op;.  if
45c0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
45d0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
45e0: 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20  ->op!=op ){.    
45f0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
4600: 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29  t(pWC, pExpr, 0)
4610: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
4620: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
4630: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29  Expr->pLeft, op)
4640: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
4650: 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69  (pWC, pExpr->pRi
4660: 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a  ght, op);.  }.}.
4670: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
4680: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
4690: 6d 61 73 6b 20 73 65 74 20 28 61 20 57 68 65 72  mask set (a Wher
46a0: 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29  eMaskSet object)
46b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74  .*/.#define init
46c0: 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73  MaskSet(P)  mems
46d0: 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(P, 0, sizeof(
46e0: 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  *P))../*.** Retu
46f0: 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  rn the bitmask f
4700: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
4710: 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  sor number.  Ret
4720: 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72  urn 0 if.** iCur
4730: 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  sor is not in th
4740: 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e set..*/.static
4750: 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b   Bitmask getMask
4760: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
4770: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
4780: 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rsor){.  int i;.
4790: 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53    assert( pMaskS
47a0: 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65  et->n<=(int)size
47b0: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b  of(Bitmask)*8 );
47c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d  .  for(i=0; i<pM
47d0: 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  askSet->n; i++){
47e0: 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65  .    if( pMaskSe
47f0: 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f  t->ix[i]==iCurso
4800: 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  r ){.      retur
4810: 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  n ((Bitmask)1)<<
4820: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  i;.    }.  }.  r
4830: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4840: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d  * Create a new m
4850: 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69  ask for cursor i
4860: 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cursor..**.** Th
4870: 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f  ere is one curso
4880: 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74  r per table in t
4890: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
48a0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   The number of.*
48b0: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
48c0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
48d0: 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74  imited by a test
48e0: 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a   early in the.**
48f0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
4900: 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  in() routine.  S
4910: 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
4920: 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  he pMaskSet->ix[
4930: 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20  ].** array will 
4940: 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a  never overflow..
4950: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
4960: 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d  reateMask(WhereM
4970: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4980: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
4990: 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53    assert( pMaskS
49a0: 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a  et->n < ArraySiz
49b0: 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20  e(pMaskSet->ix) 
49c0: 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69  );.  pMaskSet->i
49d0: 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d  x[pMaskSet->n++]
49e0: 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f   = iCursor;.}../
49f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4a00: 65 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69  e walks (recursi
4a10: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
4a20: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
4a30: 65 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d  erates.** a bitm
4a40: 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77  ask indicating w
4a50: 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
4a60: 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70  used in that exp
4a70: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e  ression.** tree.
4a80: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
4a90: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
4aa0: 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61   to work, the ca
4ab0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d  lling function m
4ac0: 75 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76  ust have.** prev
4ad0: 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73  iously invoked s
4ae0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
4af0: 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20  rNames() on the 
4b00: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65  expression.  See
4b10: 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 63  .** the header c
4b20: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
4b30: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
4b40: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
4b50: 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  n..** The sqlite
4b60: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
4b70: 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f  s() routines loo
4b80: 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61  ks for column na
4b90: 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20  mes and.** sets 
4ba0: 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f  their opcodes to
4bb0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74   TK_COLUMN and t
4bc0: 68 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65  heir Expr.iTable
4bd0: 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68   fields to.** th
4be0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
4bf0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
4c00: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
4c10: 20 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20   just has to.** 
4c20: 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75  translate the cu
4c30: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
4c40: 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  o bitmask values
4c50: 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74   and OR all.** t
4c60: 68 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65  he bitmasks toge
4c70: 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
4c80: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
4c90: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
4ca0: 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69  MaskSet*, ExprLi
4cb0: 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  st*);.static Bit
4cc0: 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54  mask exprSelectT
4cd0: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4ce0: 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a  askSet*, Select*
4cf0: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
4d00: 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  k exprTableUsage
4d10: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
4d20: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70  MaskSet, Expr *p
4d30: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
4d40: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  k = 0;.  if( p==
4d50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4d60: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
4d70: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b  LUMN ){.    mask
4d80: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
4d90: 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b  Set, p->iTable);
4da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b  .    return mask
4db0: 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65  ;.  }.  mask = e
4dc0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4dd0: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68  askSet, p->pRigh
4de0: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
4df0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
4e00: 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29  skSet, p->pLeft)
4e10: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
4e20: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
4e30: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
4e40: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
4e50: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
4e60: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c  skSet, p->x.pSel
4e70: 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ect);.  }else{. 
4e80: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
4e90: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
4ea0: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69  askSet, p->x.pLi
4eb0: 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  st);.  }.  retur
4ec0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
4ed0: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
4ee0: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
4ef0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
4f00: 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  et, ExprList *pL
4f10: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
4f20: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
4f30: 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
4f40: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4f50: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
4f60: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  ++){.      mask 
4f70: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
4f80: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
4f90: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
4fa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4fb0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
4fc0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
4fd0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57  lectTableUsage(W
4fe0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
4ff0: 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70  skSet, Select *p
5000: 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  S){.  Bitmask ma
5010: 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  sk = 0;.  while(
5020: 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69   pS ){.    SrcLi
5030: 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70  st *pSrc = pS->p
5040: 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  Src;.    mask |=
5050: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
5060: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
5070: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
5080: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
5090: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
50a0: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
50b0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
50c0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
50d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
50e0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
50f0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
5100: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
5110: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
5120: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
5130: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
5140: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
5150: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
5160: 53 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Src!=0) ){.     
5170: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
5180: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
5190: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
51a0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53     mask |= exprS
51b0: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
51c0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e  pMaskSet, pSrc->
51d0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
51e0: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65         mask |= e
51f0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
5200: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
5210: 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d  i].pOn);.      }
5220: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20  .    }.    pS = 
5230: 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  pS->pPrior;.  }.
5240: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
5250: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
5260: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
5270: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
5280: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
5290: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
52a0: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
52b0: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
52c0: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
52d0: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
52e0: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
52f0: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
5300: 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a 0a 2a  , and "IN"..**.*
5310: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
5320: 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32 36 33  -OF: R-59926-263
5330: 39 33 20 54 6f 20 62 65 20 75 73 61 62 6c 65 20  93 To be usable 
5340: 62 79 20 61 6e 20 69 6e 64 65 78 20 61 20 74 65  by an index a te
5350: 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f 66  rm must be.** of
5360: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
5370: 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f 6c  owing forms: col
5380: 75 6d 6e 20 3d 20 65 78 70 72 65 73 73 69 6f 6e  umn = expression
5390: 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65 73   column > expres
53a0: 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e  sion.** column >
53b0: 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  = expression col
53c0: 75 6d 6e 20 3c 20 65 78 70 72 65 73 73 69 6f 6e  umn < expression
53d0: 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72 65   column <= expre
53e0: 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73 73  ssion.** express
53f0: 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78 70  ion = column exp
5400: 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e  ression > column
5410: 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20 63   expression >= c
5420: 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73 73  olumn.** express
5430: 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78 70  ion < column exp
5440: 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d  ression <= colum
5450: 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28  n column IN.** (
5460: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 29  expression-list)
5470: 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62 71   column IN (subq
5480: 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53 20  uery) column IS 
5490: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
54a0: 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74  nt allowedOp(int
54b0: 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   op){.  assert( 
54c0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_GT>TK_EQ && T
54d0: 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_GT<TK_GE );.  
54e0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b  assert( TK_LT>TK
54f0: 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f  _EQ && TK_LT<TK_
5500: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
5510: 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LE>TK_EQ && T
5520: 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LE<TK_GE );.  
5530: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
5540: 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75  K_EQ+4 );.  retu
5550: 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  rn op==TK_IN || 
5560: 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70  (op>=TK_EQ && op
5570: 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d  <=TK_GE) || op==
5580: 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a  TK_ISNULL;.}../*
5590: 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a  .** Swap two obj
55a0: 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50  ects of type TYP
55b0: 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57  E..*/.#define SW
55c0: 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59  AP(TYPE,A,B) {TY
55d0: 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74  PE t=A; A=B; B=t
55e0: 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74  ;}../*.** Commut
55f0: 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  e a comparison o
5600: 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73  perator.  Expres
5610: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
5620: 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72  m "X op Y".** ar
5630: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
5640: 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a   "Y op X"..**.**
5650: 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20 70   If left/right p
5660: 72 65 63 65 6e 64 65 6e 63 65 20 72 75 6c 65 73  recendence rules
5670: 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20   come into play 
5680: 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67  when determining
5690: 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e   the.** collatin
56a0: 67 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65  g.** side of the
56b0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20   comparison, it 
56c0: 72 65 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74  remains associat
56d0: 65 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ed with the same
56e0: 20 73 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74   side after.** t
56f0: 68 65 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20  he commutation. 
5700: 53 6f 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f  So "Y collate NO
5710: 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d  CASE op X" becom
5720: 65 73 20 0a 2a 2a 20 22 58 20 6f 70 20 59 22 2e  es .** "X op Y".
5730: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
5740: 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
5750: 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68  equence on.** th
5760: 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65  e left hand side
5770: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
5780: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 63   overrides any c
5790: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
57a0: 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74  e .** attached t
57b0: 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72  o the right. For
57c0: 20 74 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e   the same reason
57d0: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
57e0: 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  flag.** is not c
57f0: 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  ommuted..*/.stat
5800: 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d  ic void exprComm
5810: 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ute(Parse *pPars
5820: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
5830: 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74 20  .  u16 expRight 
5840: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
5850: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
5860: 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70  late);.  u16 exp
5870: 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  Left = (pExpr->p
5880: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
5890: 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73  _Collate);.  ass
58a0: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70  ert( allowedOp(p
58b0: 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78  Expr->op) && pEx
58c0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b  pr->op!=TK_IN );
58d0: 0a 20 20 69 66 28 20 65 78 70 52 69 67 68 74 3d  .  if( expRight=
58e0: 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  =expLeft ){.    
58f0: 2f 2a 20 45 69 74 68 65 72 20 58 20 61 6e 64 20  /* Either X and 
5900: 59 20 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c  Y both have COLL
5910: 41 54 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  ATE operator or 
5920: 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20  neither do */.  
5930: 20 20 69 66 28 20 65 78 70 52 69 67 68 74 20 29    if( expRight )
5940: 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20  {.      /* Both 
5950: 58 20 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c  X and Y have COL
5960: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20  LATE operators. 
5970: 20 4d 61 6b 65 20 73 75 72 65 20 58 20 69 73 20   Make sure X is 
5980: 61 6c 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20  always.      ** 
5990: 75 73 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67  used by clearing
59a0: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
59b0: 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a  flag from Y. */.
59c0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
59d0: 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45  ght->flags &= ~E
59e0: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
59f0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
5a00: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
5a10: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
5a20: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
5a30: 20 4e 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59   Neither X nor Y
5a40: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
5a50: 65 72 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68  erators, but X h
5a60: 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  as a non-default
5a70: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  .      ** collat
5a80: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53  ing sequence.  S
5a90: 6f 20 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c  o add the EP_Col
5aa0: 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58  late marker on X
5ab0: 20 74 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20   to cause.      
5ac0: 2a 2a 20 69 74 20 74 6f 20 62 65 20 73 65 61 72  ** it to be sear
5ad0: 63 68 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20  ched first. */. 
5ae0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
5af0: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  t->flags |= EP_C
5b00: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  ollate;.    }.  
5b10: 7d 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70  }.  SWAP(Expr*,p
5b20: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78  Expr->pRight,pEx
5b30: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
5b40: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
5b50: 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  GT ){.    assert
5b60: 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
5b70: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
5b80: 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29  TK_GE==TK_LE+2 )
5b90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
5ba0: 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20  _GT>TK_EQ );.   
5bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54   assert( TK_GT<T
5bc0: 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  K_LE );.    asse
5bd0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  rt( pExpr->op>=T
5be0: 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_GT && pExpr->o
5bf0: 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p<=TK_GE );.    
5c00: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45  pExpr->op = ((pE
5c10: 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32  xpr->op-TK_GT)^2
5c20: 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a  )+TK_GT;.  }.}..
5c30: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
5c40: 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61  from TK_xx opera
5c50: 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74  tor to WO_xx bit
5c60: 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mask..*/.static 
5c70: 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  u16 operatorMask
5c80: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20  (int op){.  u16 
5c90: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  c;.  assert( all
5ca0: 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20  owedOp(op) );.  
5cb0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
5cc0: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a  .    c = WO_IN;.
5cd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
5ce0: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
5cf0: 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a   c = WO_ISNULL;.
5d00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
5d10: 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70  ert( (WO_EQ<<(op
5d20: 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66  -TK_EQ)) < 0x7ff
5d30: 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31  f );.    c = (u1
5d40: 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  6)(WO_EQ<<(op-TK
5d50: 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  _EQ));.  }.  ass
5d60: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55  ert( op!=TK_ISNU
5d70: 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55  LL || c==WO_ISNU
5d80: 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LL );.  assert( 
5d90: 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d  op!=TK_IN || c==
5da0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72  WO_IN );.  asser
5db0: 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  t( op!=TK_EQ || 
5dc0: 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73  c==WO_EQ );.  as
5dd0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20  sert( op!=TK_LT 
5de0: 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20  || c==WO_LT );. 
5df0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5e00: 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29  LE || c==WO_LE )
5e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
5e20: 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GT || c==WO_G
5e30: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
5e40: 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57  p!=TK_GE || c==W
5e50: 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  O_GE );.  return
5e60: 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61   c;.}../*.** Sea
5e70: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
5e80: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
5e90: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
5ea0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
5eb0: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
5ec0: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
5ed0: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
5ee0: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e  of table iCur an
5ef0: 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  d <op> is one of
5f00: 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70  .** the WO_xx op
5f10: 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65  erator codes spe
5f20: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70  cified by the op
5f30: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52   parameter..** R
5f40: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
5f50: 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65  to the term.  Re
5f60: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f  turn 0 if not fo
5f70: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  und..*/.static W
5f80: 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65  hereTerm *findTe
5f90: 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  rm(.  WhereClaus
5fa0: 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
5fb0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5fc0: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
5fd0: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
5fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
5ff0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48  sor number of LH
6000: 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  S */.  int iColu
6010: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn,          /* 
6020: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
6030: 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73   LHS */.  Bitmas
6040: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
6050: 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20  /* RHS must not 
6060: 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69  overlap with thi
6070: 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20  s mask */.  u32 
6080: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6090: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f    /* Mask of WO_
60a0: 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69  xx values descri
60b0: 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f  bing operator */
60c0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
60d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
60e0: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
60f0: 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20  ith this index, 
6100: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29  if not NULL */.)
6110: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
6120: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20  Term;.  int k;. 
6130: 20 61 73 73 65 72 74 28 20 69 43 75 72 3e 3d 30   assert( iCur>=0
6140: 20 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 41   );.  op &= WO_A
6150: 4c 4c 3b 0a 20 20 66 6f 72 28 3b 20 70 57 43 3b  LL;.  for(; pWC;
6160: 20 70 57 43 3d 70 57 43 2d 3e 70 4f 75 74 65 72   pWC=pWC->pOuter
6170: 29 7b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  ){.    for(pTerm
6180: 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e  =pWC->a, k=pWC->
6190: 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70  nTerm; k; k--, p
61a0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
61b0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
61c0: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
61d0: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70      && (pTerm->p
61e0: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
61f0: 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20  Ready)==0.      
6200: 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c     && pTerm->u.l
6210: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
6220: 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  mn.         && (
6230: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
6240: 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20 20 20   & op)!=0.      
6250: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
6260: 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 49 64  Column>=0 && pId
6270: 78 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65  x && pTerm->eOpe
6280: 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c  rator!=WO_ISNULL
6290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
62a0: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
62b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
62c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
62d0: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
62e0: 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20 20 20  idxaff;.        
62f0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
6300: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
6310: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a   = pWC->pParse;.
6320: 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 64 78    .          idx
6330: 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  aff = pIdx->pTab
6340: 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
6350: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
6360: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
6370: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
6380: 6b 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20  k(pX, idxaff) ) 
6390: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 0a 20 20 20  continue;.  .   
63a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65         /* Figure
63b0: 20 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   out the collati
63c0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65 71 75  on sequence requ
63d0: 69 72 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64  ired from an ind
63e0: 65 78 20 66 6f 72 0a 20 20 20 20 20 20 20 20 20  ex for.         
63f0: 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75 73 65   ** it to be use
6400: 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69 73 69  ful for optimisi
6410: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58  ng expression pX
6420: 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20 20 20  . Store this.   
6430: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
6440: 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c  in variable pCol
6450: 6c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  l..          */.
6460: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
6470: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
6480: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
6490: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
64a0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
64b0: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
64c0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
64d0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
64e0: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
64f0: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
6500: 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  l;.  .          
6510: 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61  for(j=0; pIdx->a
6520: 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c  iColumn[j]!=iCol
6530: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
6540: 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
6550: 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  (j>=pIdx->nColum
6560: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
6570: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6580: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6590: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
65a0: 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
65b0: 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75  ll[j]) ) continu
65c0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
65d0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72       return pTer
65e0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
65f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6600: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
6610: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
6620: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
6630: 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57 68  yze(SrcList*, Wh
6640: 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29  ereClause*, int)
6650: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78  ;../*.** Call ex
6660: 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c  prAnalyze on all
6670: 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52   terms in a WHER
6680: 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a  E clause.  .**.*
6690: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
66a0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
66b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
66c0: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  List,       /* t
66d0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
66e0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
66f0: 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20  *pWC         /* 
6700: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
6710: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
6720: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
6730: 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
6740: 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
6750: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
6760: 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c 20  (pTabList, pWC, 
6770: 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  i);.  }.}..#ifnd
6780: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
6790: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
67a0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
67b0: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
67c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
67d0: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
67e0: 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63  erator that.** c
67f0: 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  an be optimized 
6800: 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79  using inequality
6810: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52   constraints.  R
6820: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
6830: 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61   is.** so and fa
6840: 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a  lse if not..**.*
6850: 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74  * In order for t
6860: 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  he operator to b
6870: 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74  e optimizible, t
6880: 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20 61  he RHS must be a
6890: 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72   string.** liter
68a0: 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  al that does not
68b0: 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77 69   begin with a wi
68c0: 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61  ldcard.  .*/.sta
68d0: 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72  tic int isLikeOr
68e0: 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20 2a 70  Glob(.  Parse *p
68f0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
6900: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
6910: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6920: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
6930: 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  r,      /* Test 
6940: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
6950: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 50 72  */.  Expr **ppPr
6960: 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e 74 65  efix,  /* Pointe
6970: 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47 20 65  r to TK_STRING e
6980: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 70  xpression with p
6990: 61 74 74 65 72 6e 20 70 72 65 66 69 78 20 2a 2f  attern prefix */
69a0: 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c  .  int *pisCompl
69b0: 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66 20  ete, /* True if 
69c0: 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72  the only wildcar
69d0: 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61  d is % in the la
69e0: 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  st character */.
69f0: 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20    int *pnoCase  
6a00: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75      /* True if u
6a10: 70 70 65 72 63 61 73 65 20 69 73 20 65 71 75 69  ppercase is equi
6a20: 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63  valent to lowerc
6a30: 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ase */.){.  cons
6a40: 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 20 20  t char *z = 0;  
6a50: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
6a60: 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45 20   on RHS of LIKE 
6a70: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78  operator */.  Ex
6a80: 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
6a90: 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69 67 68  ft;      /* Righ
6aa0: 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a 65 20  t and left size 
6ab0: 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  of LIKE operator
6ac0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
6ad0: 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
6ae0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65 72   /* List of oper
6af0: 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49 4b 45  ands to the LIKE
6b00: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
6b10: 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20 20 20  nt c;           
6b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
6b30: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 5b   character in z[
6b40: 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  ] */.  int cnt; 
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
6b70: 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66  on-wildcard pref
6b80: 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ix characters */
6b90: 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 20 20  .  char wc[3];  
6ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6bb0: 20 57 69 6c 64 63 61 72 64 20 63 68 61 72 61 63   Wildcard charac
6bc0: 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ters */.  sqlite
6bd0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6be0: 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
6bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
6c00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6c10: 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pVal = 0;.  int 
6c20: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
6c30: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
6c40: 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a 0a 20   of pRight */.. 
6c50: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c   if( !sqlite3IsL
6c60: 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ikeFunction(db, 
6c70: 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20  pExpr, pnoCase, 
6c80: 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  wc) ){.    retur
6c90: 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  n 0;.  }.#ifdef 
6ca0: 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20  SQLITE_EBCDIC.  
6cb0: 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72  if( *pnoCase ) r
6cc0: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
6cd0: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
6ce0: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66  >x.pList;.  pLef
6cf0: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  t = pList->a[1].
6d00: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65  pExpr;.  if( pLe
6d10: 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  ft->op!=TK_COLUM
6d20: 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  N .   || sqlite3
6d30: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
6d40: 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ft)!=SQLITE_AFF_
6d50: 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73 56 69  TEXT .   || IsVi
6d60: 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61  rtual(pLeft->pTa
6d70: 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 49  b).  ){.    /* I
6d80: 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34 36  MP: R-02065-4946
6d90: 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  5 The left-hand 
6da0: 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b 45  side of the LIKE
6db0: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
6dc0: 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  r must.    ** be
6dd0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
6de0: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77  indexed column w
6df0: 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69 74  ith TEXT affinit
6e00: 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  y. */.    return
6e10: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
6e20: 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ( pLeft->iColumn
6e30: 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63  !=(-1) ); /* Bec
6e40: 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20 68  ause IPK never h
6e50: 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a 0a  as AFF_TEXT */..
6e60: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74    pRight = pList
6e70: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
6e80: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b  op = pRight->op;
6e90: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
6ea0: 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f 70  GISTER ){.    op
6eb0: 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a   = pRight->op2;.
6ec0: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
6ed0: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
6ee0: 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72   Vdbe *pReprepar
6ef0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70  e = pParse->pRep
6f00: 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74 20  repare;.    int 
6f10: 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69  iCol = pRight->i
6f20: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c  Column;.    pVal
6f30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
6f40: 74 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72  tValue(pReprepar
6f50: 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  e, iCol, SQLITE_
6f60: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69  AFF_NONE);.    i
6f70: 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74  f( pVal && sqlit
6f80: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
6f90: 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  al)==SQLITE_TEXT
6fa0: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   ){.      z = (c
6fb0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
6fc0: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
6fd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6fe0: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
6ff0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69  pParse->pVdbe, i
7000: 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Col);.    assert
7010: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
7020: 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69  _VARIABLE || pRi
7030: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  ght->op==TK_REGI
7040: 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20  STER );.  }else 
7050: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  if( op==TK_STRIN
7060: 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69  G ){.    z = pRi
7070: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  ght->u.zToken;. 
7080: 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20   }.  if( z ){.  
7090: 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
70a0: 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29  hile( (c=z[cnt])
70b0: 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20  !=0 && c!=wc[0] 
70c0: 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63  && c!=wc[1] && c
70d0: 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20  !=wc[2] ){.     
70e0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   cnt++;.    }.  
70f0: 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20    if( cnt!=0 && 
7100: 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31  255!=(u8)z[cnt-1
7110: 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ] ){.      Expr 
7120: 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20  *pPrefix;.      
7130: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63  *pisComplete = c
7140: 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74  ==wc[0] && z[cnt
7150: 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50  +1]==0;.      pP
7160: 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45  refix = sqlite3E
7170: 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e  xpr(db, TK_STRIN
7180: 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  G, z);.      if(
7190: 20 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66   pPrefix ) pPref
71a0: 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74  ix->u.zToken[cnt
71b0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70  ] = 0;.      *pp
71c0: 50 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78  Prefix = pPrefix
71d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  ;.      if( op==
71e0: 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20  TK_VARIABLE ){. 
71f0: 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d         Vdbe *v =
7200: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
7210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7220: 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c  dbeSetVarmask(v,
7230: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
7240: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  );.        if( *
7250: 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70  pisComplete && p
7260: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  Right->u.zToken[
7270: 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
7280: 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66  /* If the rhs of
7290: 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73   the LIKE expres
72a0: 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62  sion is a variab
72b0: 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  le, and the curr
72c0: 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ent.          **
72d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61   value of the va
72e0: 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65  riable means the
72f0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
7300: 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45   invoke the LIKE
7310: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75  .          ** fu
7320: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20  nction, then no 
7330: 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c  OP_Variable will
7340: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
7350: 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20   program..      
7360: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73      ** This caus
7370: 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  es problems for 
7380: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
7390: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
73a0: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41  ).          ** A
73b0: 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e  PI. To workaroun
73c0: 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75  d them, add a du
73d0: 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20  mmy OP_Variable 
73e0: 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20  here..          
73f0: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e  */ .          in
7400: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
7410: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7420: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
7430: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
7440: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  t(pParse, pRight
7450: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
7460: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7470: 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56  geP3(v, sqlite3V
7480: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
7490: 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  )-1, 0);.       
74a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
74b0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
74c0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   r1);.        }.
74d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
74e0: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a  e{.      z = 0;.
74f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
7500: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
7510: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a  al);.  return (z
7520: 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  !=0);.}.#endif /
7530: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
7540: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
7550: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
7560: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
7570: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63  TABLE./*.** Chec
7580: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
7590: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
75a0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
75b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  **.**         co
75c0: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a  lumn MATCH expr.
75d0: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74  **.** If it is t
75e0: 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e  hen return TRUE.
75f0: 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e    If not, return
7600: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
7610: 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43  c int isMatchOfC
7620: 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70  olumn(.  Expr *p
7630: 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73  Expr      /* Tes
7640: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
7650: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  n */.){.  ExprLi
7660: 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66  st *pList;..  if
7670: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
7680: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
7690: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
76a0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
76b0: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
76c0: 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29  en,"match")!=0 )
76d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
76e0: 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45    }.  pList = pE
76f0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
7700: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
7710: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
7720: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
7730: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
7740: 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d  ->op != TK_COLUM
7750: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
7760: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7770: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
7780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
7790: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
77a0: 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65  * If the pBase e
77b0: 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
77c0: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
77d0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
77e0: 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65  f.** a join, the
77f0: 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61  n transfer the a
7800: 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69  ppropriate marki
7810: 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69  ngs over to deri
7820: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
7830: 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e  oid transferJoin
7840: 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70  Markings(Expr *p
7850: 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70  Derived, Expr *p
7860: 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69 76 65  Base){.  pDerive
7870: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
7880: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
7890: 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76  omJoin;.  pDeriv
78a0: 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  ed->iRightJoinTa
78b0: 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52 69  ble = pBase->iRi
78c0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a  ghtJoinTable;.}.
78d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
78e0: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
78f0: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
7900: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7910: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a  IT_SUBQUERY)./*.
7920: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  ** Analyze a ter
7930: 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  m that consists 
7940: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  of two or more O
7950: 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73  R-connected.** s
7960: 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a  ubterms.  So in:
7970: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57  .**.**     ... W
7980: 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20  HERE  (a=5) AND 
7990: 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64  (b=7 OR c=9 OR d
79a0: 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a  =13) AND (d=13).
79b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e              ^^^^
79d0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
79e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
79f0: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72  ine analyzes ter
7a00: 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d  ms such as the m
7a10: 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  iddle term in th
7a20: 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e  e above example.
7a30: 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72  .** A WhereOrTer
7a40: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70  m object is comp
7a50: 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65  uted and attache
7a60: 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e  d to the term un
7a70: 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c  der.** analysis,
7a80: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
7a90: 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68  he outcome of th
7aa0: 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e  e analysis.  Hen
7ab0: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  ce:.**.**     Wh
7ac0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20  ereTerm.wtFlags 
7ad0: 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46    |=  TERM_ORINF
7ae0: 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  O.**     WhereTe
7af0: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20  rm.u.pOrInfo  = 
7b00: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
7b10: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72  llocated WhereOr
7b20: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a  Term object.**.*
7b30: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
7b40: 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68   analyzed must h
7b50: 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ave two or more 
7b60: 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  of OR-connected 
7b70: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73  subterms..** A s
7b80: 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69  ingle subterm mi
7b90: 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20  ght be a set of 
7ba0: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75  AND-connected su
7bb0: 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45  b-subterms..** E
7bc0: 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73  xamples of terms
7bd0: 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a   under analysis:
7be0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20  .**.**     (A)  
7bf0: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
7c00: 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e  t1.x=t2.z OR t1.
7c10: 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e  y=15 OR t1.z=t3.
7c20: 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20  a+5.**     (B)  
7c30: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78     x=expr1 OR ex
7c40: 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33  pr2=x OR x=expr3
7c50: 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20  .**     (C)     
7c60: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31  t1.x=t2.y OR (t1
7c70: 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79  .x=t2.z AND t1.y
7c80: 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20  =15).**     (D) 
7c90: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28      x=expr1 OR (
7ca0: 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e  y>11 AND y<22 AN
7cb0: 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f  D z LIKE '*hello
7cc0: 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20  *').**     (E)  
7cd0: 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e     (p.a=1 AND q.
7ce0: 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f  b=2 AND r.c=3) O
7cf0: 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79  R (p.x=4 AND q.y
7d00: 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a  =5 AND r.z=6).**
7d10: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
7d20: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
7d30: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
7d40: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
7d50: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
7d60: 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69 6e 67  n of C.** a sing
7d70: 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73 20 73  le table T (as s
7d80: 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20  hown in example 
7d90: 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72  B above) then cr
7da0: 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75  eate a new virtu
7db0: 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20  al.** term that 
7dc0: 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  is an equivalent
7dd0: 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20   IN expression. 
7de0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
7df0: 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20   if the term.** 
7e00: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69  being analyzed i
7e10: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  s:.**.**      x 
7e20: 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70  = expr1  OR  exp
7e30: 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20  r2 = x  OR  x = 
7e40: 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  expr3.**.** then
7e50: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69   create a new vi
7e60: 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20  rtual term like 
7e70: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
7e80: 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70   x IN (expr1,exp
7e90: 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20  r2,expr3).**.** 
7ea0: 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66  CASE 2:.**.** If
7eb0: 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72   all subterms ar
7ec0: 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61  e indexable by a
7ed0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c   single table T,
7ee0: 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20   then set.**.** 
7ef0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f      WhereTerm.eO
7f00: 70 65 72 61 74 6f 72 20 20 20 20 20 20 20 20 20  perator         
7f10: 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a       =  WO_OR.**
7f20: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75       WhereTerm.u
7f30: 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
7f40: 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72  ble  |=  the cur
7f50: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
7f60: 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73  able T.**.** A s
7f70: 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78  ubterm is "index
7f80: 61 62 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f  able" if it is o
7f90: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54  f the form.** "T
7fa0: 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20  .C <op> <expr>" 
7fb0: 77 68 65 72 65 20 43 20 69 73 20 61 6e 79 20 63  where C is any c
7fc0: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54  olumn of table T
7fd0: 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73   and .** <op> is
7fe0: 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22   one of "=", "<"
7ff0: 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d  , "<=", ">", ">=
8000: 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72  ", "IS NULL", or
8010: 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74   "IN"..** A subt
8020: 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65  erm is also inde
8030: 78 61 62 6c 65 20 69 66 20 69 74 20 69 73 20 61  xable if it is a
8040: 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20  n AND of two or 
8050: 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65  more.** subsubte
8060: 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  rms at least one
8070: 20 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e 64   of which is ind
8080: 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62  exable.  Indexab
8090: 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65  le AND .** subte
80a0: 72 6d 73 20 68 61 76 65 20 74 68 65 69 72 20 65  rms have their e
80b0: 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20  Operator set to 
80c0: 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20  WO_AND and they 
80d0: 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e  have.** u.pAndIn
80e0: 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61  fo set to a dyna
80f0: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
8100: 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f  d WhereAndTerm o
8110: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f  bject..**.** Fro
8120: 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20  m another point 
8130: 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61  of view, "indexa
8140: 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20  ble" means that 
8150: 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c  the subterm coul
8160: 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79  d.** potentially
8170: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
8180: 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70   index if an app
8190: 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20 65  ropriate index e
81a0: 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61  xists..** This a
81b0: 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74  nalysis does not
81c0: 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65   consider whethe
81d0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64  r or not the ind
81e0: 65 78 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a  ex exists; that.
81f0: 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  ** is something 
8200: 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20  the bestIndex() 
8210: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74  routine will det
8220: 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61 6e  ermine.  This an
8230: 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c  alysis.** only l
8240: 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72 20  ooks at whether 
8250: 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70 72  subterms appropr
8260: 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e  iate for indexin
8270: 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  g exist..**.** A
8280: 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68  ll examples A th
8290: 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61 6c  rough E above al
82a0: 6c 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  l satisfy case 2
82b0: 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72 6d  .  But if a term
82c0: 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73 66  .** also statisf
82d0: 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68  ies case 1 (such
82e0: 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74   as B) we know t
82f0: 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
8300: 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73  r will.** always
8310: 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20   prefer case 1, 
8320: 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
8330: 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20  we pretend that 
8340: 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a  case 2 is not.**
8350: 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a   satisfied..**.*
8360: 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68  * It might be th
8370: 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74  e case that mult
8380: 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20  iple tables are 
8390: 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20  indexable.  For 
83a0: 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20  example,.** (E) 
83b0: 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62  above is indexab
83c0: 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20  le on tables P, 
83d0: 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20  Q, and R..**.** 
83e0: 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73  Terms that satis
83f0: 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61  fy case 2 are ca
8400: 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f  ndidates for loo
8410: 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20  kup by using.** 
8420: 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
8430: 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20   to find rowids 
8440: 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d  for each subterm
8450: 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a   and composing.*
8460: 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61  * the union of a
8470: 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20  ll rowids using 
8480: 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e  a RowSet object.
8490: 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61    This is simila
84a0: 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20  r.** to "bitmap 
84b0: 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65  indices" in othe
84c0: 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  r database engin
84d0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57  es..**.** OTHERW
84e0: 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ISE:.**.** If ne
84f0: 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72  ither case 1 nor
8500: 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74   case 2 apply, t
8510: 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f  hen leave the eO
8520: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a  perator set to.*
8530: 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65  * zero.  This te
8540: 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c  rm is not useful
8550: 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a   for search..*/.
8560: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
8570: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20  AnalyzeOrTerm(. 
8580: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
8590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
85a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
85b0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
85c0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
85d0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45  the complete WHE
85e0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
85f0: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
8600: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
8610: 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d  x of the OR-term
8620: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
8630: 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  */.){.  Parse *p
8640: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
8650: 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
8660: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
8670: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
8680: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
86a0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
86b0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ction */.  Where
86c0: 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
86d0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20  WC->a[idxTerm]; 
86e0: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
86f0: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
8700: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
8710: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20   pTerm->pExpr;  
8720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8730: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
8740: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68  the term */.  Wh
8750: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
8760: 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73  kSet = pWC->pMas
8770: 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20 75  kSet; /* Table u
8780: 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e  se masks */.  in
8790: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87b0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
87c0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
87d0: 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20  eClause *pOrWc; 
87e0: 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70        /* Breakup
87f0: 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73   of pTerm into s
8800: 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65  ubterms */.  Whe
8810: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
8820: 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d         /* A Sub-
8830: 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
8840: 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65  pOrWc */.  Where
8850: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
8860: 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e       /* Addition
8870: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  al information a
8880: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
8890: 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Term */.  Bitmas
88a0: 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20  k chngToIN;     
88b0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
88c0: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
88d0: 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74   case 1 */.  Bit
88e0: 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20  mask indexable; 
88f0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
8900: 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61   that are indexa
8910: 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20  ble, satisfying 
8920: 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a  case 2 */..  /*.
8930: 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f    ** Break the O
8940: 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74  R clause into it
8950: 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65  s separate subte
8960: 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72  rms.  The subter
8970: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72  ms are.  ** stor
8980: 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61  ed in a WhereCla
8990: 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  use structure co
89a0: 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20  ntaining within 
89b0: 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a  the WhereOrInfo.
89c0: 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74    ** object that
89d0: 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
89e0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20  the original OR 
89f0: 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a  clause term..  *
8a00: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  /.  assert( (pTe
8a10: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
8a20: 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d  ERM_DYNAMIC|TERM
8a30: 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44  _ORINFO|TERM_AND
8a40: 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61  INFO))==0 );.  a
8a50: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
8a60: 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65  ==TK_OR );.  pTe
8a70: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20  rm->u.pOrInfo = 
8a80: 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  pOrInfo = sqlite
8a90: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
8aa0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66  , sizeof(*pOrInf
8ab0: 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e  o));.  if( pOrIn
8ac0: 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  fo==0 ) return;.
8ad0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
8ae0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b   |= TERM_ORINFO;
8af0: 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49  .  pOrWc = &pOrI
8b00: 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65  nfo->wc;.  where
8b10: 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63  ClauseInit(pOrWc
8b20: 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70  , pWC->pParse, p
8b30: 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77 63  MaskSet, pWC->wc
8b40: 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 77 68 65  trlFlags);.  whe
8b50: 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70  reSplit(pOrWc, p
8b60: 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20  Expr, TK_OR);.  
8b70: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
8b80: 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69  Src, pOrWc);.  i
8b90: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
8ba0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
8bb0: 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e  assert( pOrWc->n
8bc0: 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a  Term>=2 );..  /*
8bd0: 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  ** Compute th
8be0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
8bf0: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
8c00: 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e  fy cases 1 or 2.
8c10: 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c  .  */.  indexabl
8c20: 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  e = ~(Bitmask)0;
8c30: 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28  .  chngToIN = ~(
8c40: 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20 20 66  pWC->vmask);.  f
8c50: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
8c60: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72  m-1, pOrTerm=pOr
8c70: 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69  Wc->a; i>=0 && i
8c80: 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70  ndexable; i--, p
8c90: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69  OrTerm++){.    i
8ca0: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
8cb0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47  erator & WO_SING
8cc0: 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)==0 ){.      
8cd0: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41  WhereAndInfo *pA
8ce0: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73  ndInfo;.      as
8cf0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
8d00: 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a 20  Operator==0 );. 
8d10: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
8d20: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8d30: 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54   (TERM_ANDINFO|T
8d40: 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20  ERM_ORINFO))==0 
8d50: 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49  );.      chngToI
8d60: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e  N = 0;.      pAn
8d70: 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  dInfo = sqlite3D
8d80: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8d90: 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29  izeof(*pAndInfo)
8da0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e  );.      if( pAn
8db0: 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  dInfo ){.       
8dc0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41   WhereClause *pA
8dd0: 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68  ndWC;.        Wh
8de0: 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72  ereTerm *pAndTer
8df0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  m;.        int j
8e00: 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
8e10: 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k b = 0;.       
8e20: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64   pOrTerm->u.pAnd
8e30: 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b  Info = pAndInfo;
8e40: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
8e50: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
8e60: 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20  M_ANDINFO;.     
8e70: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65     pOrTerm->eOpe
8e80: 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a  rator = WO_AND;.
8e90: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d          pAndWC =
8ea0: 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a   &pAndInfo->wc;.
8eb0: 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61          whereCla
8ec0: 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20  useInit(pAndWC, 
8ed0: 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61  pWC->pParse, pMa
8ee0: 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77 63 74 72  skSet, pWC->wctr
8ef0: 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  lFlags);.       
8f00: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
8f10: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
8f20: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
8f30: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
8f40: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
8f50: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  );.        pAndW
8f60: 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  C->pOuter = pWC;
8f70: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
8f80: 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e( db->mallocFai
8f90: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
8fa0: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
8fb0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
8fc0: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54    for(j=0, pAndT
8fd0: 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a  erm=pAndWC->a; j
8fe0: 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20  <pAndWC->nTerm; 
8ff0: 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29  j++, pAndTerm++)
9000: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
9010: 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e  sert( pAndTerm->
9020: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
9030: 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65 64       if( allowed
9040: 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  Op(pAndTerm->pEx
9050: 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20  pr->op) ){.     
9060: 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65           b |= ge
9070: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
9080: 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pAndTerm->leftCu
9090: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rsor);.         
90a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
90b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
90c0: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
90d0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
90e0: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
90f0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
9100: 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20  _COPIED ){.     
9110: 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65   /* Skip this te
9120: 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20  rm for now.  We 
9130: 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20  revisit it when 
9140: 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20  we process the. 
9150: 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f       ** correspo
9160: 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55  nding TERM_VIRTU
9170: 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d  AL term */.    }
9180: 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
9190: 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d  ask b;.      b =
91a0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
91b0: 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t, pOrTerm->left
91c0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
91d0: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  f( pOrTerm->wtFl
91e0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
91f0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  AL ){.        Wh
9200: 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20  ereTerm *pOther 
9210: 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54  = &pOrWc->a[pOrT
9220: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20  erm->iParent];. 
9230: 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d         b |= getM
9240: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f  ask(pMaskSet, pO
9250: 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72  ther->leftCursor
9260: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9270: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
9280: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
9290: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
92a0: 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20  O_EQ ){.        
92b0: 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  chngToIN = 0;.  
92c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
92d0: 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62     chngToIN &= b
92e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
92f0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52    }..  /*.  ** R
9300: 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66  ecord the set of
9310: 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61 74   tables that sat
9320: 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 54 68  isfy case 2.  Th
9330: 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a 20  e set might be. 
9340: 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   ** empty..  */.
9350: 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78    pOrInfo->index
9360: 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c 65  able = indexable
9370: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
9380: 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c 65  ator = indexable
9390: 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b  ==0 ? 0 : WO_OR;
93a0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67  ..  /*.  ** chng
93b0: 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65 74  ToIN holds a set
93c0: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
93d0: 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79 20  *might* satisfy 
93e0: 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20 2a  case 1.  But.  *
93f0: 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f 20  * we have to do 
9400: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
9410: 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20  checking to see 
9420: 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c 79  if case 1 really
9430: 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66 69  .  ** is satisfi
9440: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68  ed..  **.  ** ch
9450: 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64  ngToIN will hold
9460: 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f 72   either 0, 1, or
9470: 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30 2d   2 bits.  The 0-
9480: 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a 20  bit case means. 
9490: 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20 69   ** that there i
94a0: 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74 79  s no possibility
94b0: 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67   of transforming
94c0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
94d0: 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f  nto an.  ** IN o
94e0: 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65 20  perator because 
94f0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  one or more term
9500: 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75  s in the OR clau
9510: 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20  se contain.  ** 
9520: 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
9530: 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c  than == on a col
9540: 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67 6c  umn in the singl
9550: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31 2d  e table.  The 1-
9560: 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65  bit.  ** case me
9570: 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20 74  ans that every t
9580: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c  erm of the OR cl
9590: 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20 66  ause is of the f
95a0: 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e  orm.  ** "table.
95b0: 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72  column=expr" for
95c0: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61 62   some single tab
95d0: 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69 74  le.  The one bit
95e0: 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20 2a   that is set.  *
95f0: 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e  * will correspon
9600: 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  d to the common 
9610: 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c  table.  We still
9620: 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 74   need to check t
9630: 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  o make.  ** sure
9640: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
9650: 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20   is used on all 
9660: 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62 69  terms.  The 2-bi
9670: 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a 20  t case is when. 
9680: 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72 6d   ** the all term
9690: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
96a0: 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  m "table1.column
96b0: 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e  =table2.column".
96c0: 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20    It.  ** might 
96d0: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  be possible to f
96e0: 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  orm an IN operat
96f0: 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20 74  or with either t
9700: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a  able1.column.  *
9710: 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75  * or table2.colu
9720: 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69 66  mn as the LHS if
9730: 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f   either is commo
9740: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
9750: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20 63  of.  ** the OR c
9760: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
9770: 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d 73   Note that terms
9780: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61   of the form "ta
9790: 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c  ble.column1=tabl
97a0: 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a  e.column2" (the.
97b0: 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20    ** same table 
97c0: 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f 66  on both sizes of
97d0: 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20   the ==) cannot 
97e0: 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20  be optimized..  
97f0: 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f 49  */.  if( chngToI
9800: 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54  N ){.    int okT
9810: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20  oChngToIN = 0;  
9820: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
9830: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20  e conversion to 
9840: 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  IN is valid */. 
9850: 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d     int iColumn =
9860: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
9870: 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20  Column index on 
9880: 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  lhs of IN operat
9890: 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  or */.    int iC
98a0: 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20  ursor = -1;     
98b0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72      /* Table cur
98c0: 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  sor common to al
98d0: 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  l terms */.    i
98e0: 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20  nt j = 0;       
98f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
9900: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20   counter */..   
9910: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
9920: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
9930: 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f  n that appears o
9940: 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  n one side or th
9950: 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f  e.    ** other o
9960: 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f  f the == operato
9970: 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74 65  r in every subte
9980: 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  rm.  That table 
9990: 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  and column.    *
99a0: 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  * will be record
99b0: 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61 6e  ed in iCursor an
99c0: 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72  d iColumn.  Ther
99d0: 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
99e0: 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 74  ny.    ** such t
99f0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
9a00: 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    Set okToChngTo
9a10: 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  IN if an appropr
9a20: 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a  iate table.    *
9a30: 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20  * and column is 
9a40: 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65 20  found but leave 
9a50: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c  okToChngToIN fal
9a60: 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  se if not found.
9a70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
9a80: 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54  j=0; j<2 && !okT
9a90: 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b  oChngToIN; j++){
9aa0: 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20 3d  .      pOrTerm =
9ab0: 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20   pOrWc->a;.     
9ac0: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
9ad0: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
9ae0: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
9af0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
9b00: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
9b10: 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==WO_EQ );.     
9b20: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
9b30: 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f  ags &= ~TERM_OR_
9b40: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
9b50: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
9b60: 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  sor==iCursor ){.
9b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
9b80: 73 20 69 73 20 74 68 65 20 32 2d 62 69 74 20 63  s is the 2-bit c
9b90: 61 73 65 20 61 6e 64 20 77 65 20 61 72 65 20 6f  ase and we are o
9ba0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65  n the second ite
9bb0: 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  ration and.     
9bc0: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
9bd0: 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68 65  term is from the
9be0: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
9bf0: 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73 20  .  So skip this 
9c00: 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  term. */.       
9c10: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20     assert( j==1 
9c20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
9c30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
9c40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63 68  .        if( (ch
9c50: 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b  ngToIN & getMask
9c60: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  (pMaskSet, pOrTe
9c70: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29  rm->leftCursor))
9c80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9c90: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75   /* This term mu
9ca0: 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  st be of the for
9cb0: 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65  m t1.a==t2.b whe
9cc0: 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a  re t2 is in the.
9cd0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e            ** chn
9ce0: 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31  gToIN set but t1
9cf0: 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74   is not.  This t
9d00: 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68  erm will be eith
9d10: 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20 20  er preceeded.   
9d20: 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c         ** or fol
9d30: 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72  lwed by an inver
9d40: 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d  ted copy (t2.b==
9d50: 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69  t1.a).  Skip thi
9d60: 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20  s term .        
9d70: 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73    ** and use its
9d80: 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20   inversion. */. 
9d90: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
9da0: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
9db0: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
9dc0: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  D );.          t
9dd0: 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d  estcase( pOrTerm
9de0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
9df0: 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
9e00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
9e10: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
9e20: 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45   (TERM_COPIED|TE
9e30: 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20  RM_VIRTUAL) );. 
9e40: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
9e50: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
9e60: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
9e70: 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  OrTerm->u.leftCo
9e80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43  lumn;.        iC
9e90: 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d  ursor = pOrTerm-
9ea0: 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20  >leftCursor;.   
9eb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9ec0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
9ed0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
9ee0: 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61 62  No candidate tab
9ef0: 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f  le+column was fo
9f00: 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f  und.  This can o
9f10: 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20  nly occur.      
9f20: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f    ** on the seco
9f30: 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  nd iteration */.
9f40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9f50: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
9f60: 61 73 73 65 72 74 28 20 28 63 68 6e 67 54 6f 49  assert( (chngToI
9f70: 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29 29 3d  N&(chngToIN-1))=
9f80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
9f90: 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d  sert( chngToIN==
9fa0: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
9fb0: 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  , iCursor) );.  
9fc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9fd0: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
9fe0: 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20  ase( j==1 );..  
9ff0: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 66      /* We have f
a000: 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74 65  ound a candidate
a010: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
a020: 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  n.  Check to see
a030: 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   if that.      *
a040: 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  * table and colu
a050: 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  mn is common to 
a060: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
a070: 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20  e OR clause */. 
a080: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
a090: 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  N = 1;.      for
a0a0: 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43  (; i>=0 && okToC
a0b0: 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f  hngToIN; i--, pO
a0c0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
a0d0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
a0e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
a0f0: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69  _EQ );.        i
a100: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
a110: 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20  Cursor!=iCursor 
a120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  ){.          pOr
a130: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
a140: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
a150: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a160: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
a170: 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
a180: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f  {.          okTo
a190: 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  ChngToIN = 0;.  
a1a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a1b0: 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65         int affLe
a1c0: 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20  ft, affRight;.  
a1d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
a1e0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
a1f0: 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75  e is also a colu
a200: 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  mn, then the aff
a210: 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20 20  inities.        
a220: 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67    ** of both rig
a230: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65  ht and left side
a240: 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20 74  s must be such t
a250: 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20  hat no type.    
a260: 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73        ** convers
a270: 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65  ions are require
a280: 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  d on the right. 
a290: 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a   (Ticket #2249).
a2a0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
a2b0: 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74 20         affRight 
a2c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
a2d0: 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70  inity(pOrTerm->p
a2e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
a2f0: 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66 74           affLeft
a300: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
a310: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
a320: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
a330: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66 66           if( aff
a340: 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66 52  Right!=0 && affR
a350: 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b  ight!=affLeft ){
a360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54  .            okT
a370: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
a380: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
a390: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 54              pOrT
a3a0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
a3b0: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
a3c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a3d0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
a3e0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
a3f0: 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54  point, okToChngT
a400: 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f  oIN is true if o
a410: 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61  riginal pTerm sa
a420: 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63  tisfies.    ** c
a430: 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20  ase 1.  In that 
a440: 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20  case, construct 
a450: 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  a new virtual te
a460: 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20 20  rm that is .    
a470: 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74  ** pTerm convert
a480: 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70  ed into an IN op
a490: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a 0a 20  erator..    **. 
a4a0: 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30 30 32 31     ** EV: R-0021
a4b0: 31 2d 31 35 31 30 30 0a 20 20 20 20 2a 2f 0a 20  1-15100.    */. 
a4c0: 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54     if( okToChngT
a4d0: 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70  oIN ){.      Exp
a4e0: 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20  r *pDup;        
a4f0: 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65      /* A transie
a500: 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78 70  nt duplicate exp
a510: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
a520: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a530: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52   = 0;   /* The R
a540: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
a550: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
a560: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20  xpr *pLeft = 0; 
a570: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53        /* The LHS
a580: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
a590: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  tor */.      Exp
a5a0: 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  r *pNew;        
a5b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
a5c0: 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  ete IN operator 
a5d0: 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  */..      for(i=
a5e0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20  pOrWc->nTerm-1, 
a5f0: 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61  pOrTerm=pOrWc->a
a600: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72  ; i>=0; i--, pOr
a610: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
a620: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77   if( (pOrTerm->w
a630: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
a640: 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  _OK)==0 ) contin
a650: 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ue;.        asse
a660: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
a670: 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b  erator==WO_EQ );
a680: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a690: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
a6a0: 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b  rsor==iCursor );
a6b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a6c0: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
a6d0: 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
a6e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  );.        pDup 
a6f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a700: 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45  (db, pOrTerm->pE
a710: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  xpr->pRight, 0);
a720: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d  .        pList =
a730: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a740: 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50 61 72  Append(pWC->pPar
a750: 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29  se, pList, pDup)
a760: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20  ;.        pLeft 
a770: 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  = pOrTerm->pExpr
a780: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d  ->pLeft;.      }
a790: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a7a0: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
a7b0: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
a7c0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
a7d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
a7e0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
a7f0: 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70  pParse, TK_IN, p
a800: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
a810: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
a820: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
a830: 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  ;.        transf
a840: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
a850: 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
a860: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
a870: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
a880: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
a890: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
a8a0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
a8b0: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e  st;.        idxN
a8c0: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
a8d0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
a8e0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
a8f0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
a900: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a910: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
a920: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
a930: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
a940: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ew);.        pTe
a950: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
a960: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
a970: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
a980: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
a990: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
a9a0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
a9b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a9c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a9d0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
a9e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a9f0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
aa00: 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a  r = WO_NOOP;  /*
aa10: 20 63 61 73 65 20 31 20 74 72 75 6d 70 73 20 63   case 1 trumps c
aa20: 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  ase 2 */.    }. 
aa30: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
aa40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
aa50: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21  PTIMIZATION && !
aa60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
aa70: 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  UERY */.../*.** 
aa80: 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69  The input to thi
aa90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
aaa0: 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74  WhereTerm struct
aab0: 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68  ure with only th
aac0: 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 65  e.** "pExpr" fie
aad0: 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54  ld filled in.  T
aae0: 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
aaf0: 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61  outine is to ana
ab00: 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65  lyze the.** sube
ab10: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f  xpression and po
ab20: 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f  pulate all the o
ab30: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74  ther fields of t
ab40: 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20  he WhereTerm.** 
ab50: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
ab60: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
ab70: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
ab80: 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58  m "<expr> <op> X
ab90: 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 74  " it gets commut
aba0: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  ed.** to the sta
abb0: 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 58  ndard form of "X
abc0: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a   <op> <expr>"..*
abd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
abe0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
abf0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
ac00: 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e   where both X an
ac10: 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d  d Y are.** colum
ac20: 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69  ns, then the ori
ac30: 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ginal expression
ac40: 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
ac50: 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a  d a new virtual.
ac60: 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  ** term of the f
ac70: 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20 69  orm "Y <op> X" i
ac80: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57  s added to the W
ac90: 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 0a  HERE clause and.
aca0: 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61  ** analyzed sepa
acb0: 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72 69  rately.  The ori
acc0: 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d 61  ginal term is ma
acd0: 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 43  rked with TERM_C
ace0: 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65  OPIED.** and the
acf0: 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61 72   new term is mar
ad00: 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44 59  ked with TERM_DY
ad10: 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65 20 69  NAMIC (because i
ad20: 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65  t's pExpr.** nee
ad30: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 77  ds to be freed w
ad40: 69 74 68 20 74 68 65 20 57 68 65 72 65 43 6c 61  ith the WhereCla
ad50: 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56 49  use) and TERM_VI
ad60: 52 54 55 41 4c 20 28 62 65 63 61 75 73 65 20 69  RTUAL (because i
ad70: 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74  t.** is a commut
ad80: 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72 69  ed copy of a pri
ad90: 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20 6f  or term.)  The o
ada0: 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61 73  riginal term has
adb0: 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64   nChild=1.** and
adc0: 20 74 68 65 20 63 6f 70 79 20 68 61 73 20 69 64   the copy has id
add0: 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20 74  xParent set to t
ade0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
adf0: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a  original term..*
ae00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
ae10: 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63  prAnalyze(.  Src
ae20: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
ae30: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
ae40: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
ae50: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
ae60: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
ae70: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
ae80: 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20    int idxTerm   
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
aea0: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d  ndex of the term
aeb0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
aec0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
aed0: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
aee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
aef0: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
af00: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  zed */.  WhereMa
af10: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
af20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
af30: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20   of table index 
af40: 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20  masks */.  Expr 
af50: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
af60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
af70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
af80: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
af90: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
afa0: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
afb0: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
afc0: 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72  tes of the pExpr
afd0: 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74  ->pLeft */.  Bit
afe0: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b000: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
b010: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74  f pExpr */.  Bit
b020: 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20  mask extraRight 
b030: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
b040: 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63   Extra dependenc
b050: 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e  ies on LEFT JOIN
b060: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72   */.  Expr *pStr
b070: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
b080: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
b090: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
b0a0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  tor */.  int isC
b0b0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  omplete = 0;    
b0c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
b0d0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e   of LIKE/GLOB en
b0e0: 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64  ds with wildcard
b0f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65   */.  int noCase
b100: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b110: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47         /* LIKE/G
b120: 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65  LOB distinguishe
b130: 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  s case */.  int 
b140: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b160: 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74  Top-level operat
b170: 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a  or.  pExpr->op *
b180: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
b190: 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b  e = pWC->pParse;
b1a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b1b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
b1c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b1d0: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a  e->db;        /*
b1e0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
b1f0: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64  tion */..  if( d
b200: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b210: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
b220: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
b230: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
b240: 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d   pMaskSet = pWC-
b250: 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45 78  >pMaskSet;.  pEx
b260: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
b270: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72  SkipCollate(pTer
b280: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 70 72 65  m->pExpr);.  pre
b290: 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61  reqLeft = exprTa
b2a0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
b2b0: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
b2c0: 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  ;.  op = pExpr->
b2d0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
b2e0: 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _IN ){.    asser
b2f0: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
b300: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45  ==0 );.    if( E
b310: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
b320: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
b330: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65  ct) ){.      pTe
b340: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
b350: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
b360: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
b370: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
b380: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
b390: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72       pTerm->prer
b3a0: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69  eqRight = exprLi
b3b0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
b3c0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
b3d0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
b3e0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
b3f0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  _ISNULL ){.    p
b400: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
b410: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
b420: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
b430: 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62  qRight = exprTab
b440: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
b450: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
b460: 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c  ;.  }.  prereqAl
b470: 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  l = exprTableUsa
b480: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
b490: 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  pr);.  if( ExprH
b4a0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
b4b0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
b4c0: 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20  {.    Bitmask x 
b4d0: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
b4e0: 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68  et, pExpr->iRigh
b4f0: 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20  tJoinTable);.   
b500: 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b   prereqAll |= x;
b510: 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74 20  .    extraRight 
b520: 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c  = x-1;  /* ON cl
b530: 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e  ause terms may n
b540: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
b550: 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  an index.       
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b570: 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65  ** on left table
b580: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
b590: 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a    Ticket #3015 *
b5a0: 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70  /.  }.  pTerm->p
b5b0: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
b5c0: 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c  qAll;.  pTerm->l
b5d0: 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  eftCursor = -1;.
b5e0: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
b5f0: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
b600: 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  eOperator = 0;. 
b610: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f   if( allowedOp(o
b620: 70 29 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72  p) && (pTerm->pr
b630: 65 72 65 71 52 69 67 68 74 20 26 20 70 72 65 72  ereqRight & prer
b640: 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20  eqLeft)==0 ){.  
b650: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
b660: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
b670: 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c  ollate(pExpr->pL
b680: 65 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a  eft);.    Expr *
b690: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
b6a0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
b6b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
b6c0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
b6d0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
b6e0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66        pTerm->lef
b6f0: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
b700: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
b710: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
b720: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
b730: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  umn;.      pTerm
b740: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70  ->eOperator = op
b750: 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a  eratorMask(op);.
b760: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52      }.    if( pR
b770: 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e  ight && pRight->
b780: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
b790: 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
b7a0: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78   *pNew;.      Ex
b7b0: 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  pr *pDup;.      
b7c0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
b7d0: 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ursor>=0 ){.    
b7e0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
b7f0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
b800: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b810: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
b820: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
b830: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b850: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75  prDelete(db, pDu
b860: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
b870: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
b880: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
b890: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
b8a0: 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45  rt(pWC, pDup, TE
b8b0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b8c0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
b8d0: 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20    if( idxNew==0 
b8e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
b8f0: 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61    pNew = &pWC->a
b900: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
b910: 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20    pNew->iParent 
b920: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
b930: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
b940: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
b950: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
b960: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld = 1;.        
b970: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
b980: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
b990: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b9a0: 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72      pDup = pExpr
b9b0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
b9c0: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
b9d0: 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74        exprCommut
b9e0: 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b  e(pParse, pDup);
b9f0: 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73  .      pLeft = s
ba00: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
ba10: 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c 65 66  llate(pDup->pLef
ba20: 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  t);.      pNew->
ba30: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
ba40: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
ba50: 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43 6f    pNew->u.leftCo
ba60: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
ba70: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65 73  olumn;.      tes
ba80: 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c 65  tcase( (prereqLe
ba90: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 29  ft | extraRight)
baa0: 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20 29   != prereqLeft )
bab0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
bac0: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
bad0: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
bae0: 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ght;.      pNew-
baf0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
bb00: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e  reqAll;.      pN
bb10: 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  ew->eOperator = 
bb20: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75  operatorMask(pDu
bb30: 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  p->op);.    }.  
bb40: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
bb50: 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f  E_OMIT_BETWEEN_O
bb60: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
bb70: 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68   If a term is th
bb80: 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  e BETWEEN operat
bb90: 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e  or, create two n
bba0: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
bbb0: 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e  .  ** that defin
bbc0: 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74  e the range that
bbd0: 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70   the BETWEEN imp
bbe0: 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78  lements.  For ex
bbf0: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
bc00: 20 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20        a BETWEEN 
bc10: 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a  b AND c.  **.  *
bc20: 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69  * is converted i
bc30: 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
bc40: 20 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62      (a BETWEEN b
bc50: 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d   AND c) AND (a>=
bc60: 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20  b) AND (a<=c).  
bc70: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20  **.  ** The two 
bc80: 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64  new terms are ad
bc90: 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ded onto the end
bca0: 20 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61   of the WhereCla
bcb0: 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a  use object..  **
bcc0: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61   The new terms a
bcd0: 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64  re "dynamic" and
bce0: 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66   are children of
bcf0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45   the original BE
bd00: 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e  TWEEN.  ** term.
bd10: 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61    That means tha
bd20: 74 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  t if the BETWEEN
bd30: 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20   term is coded, 
bd40: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  the children are
bd50: 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20  .  ** skipped.  
bd60: 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64  Or, if the child
bd70: 72 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65  ren are satisfie
bd80: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74  d by an index, t
bd90: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
bda0: 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73   BETWEEN term is
bdb0: 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
bdc0: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
bdd0: 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20  >op==TK_BETWEEN 
bde0: 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  && pWC->op==TK_A
bdf0: 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  ND ){.    ExprLi
be00: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
be10: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
be20: 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69  int i;.    stati
be30: 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d  c const u8 ops[]
be40: 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45   = {TK_GE, TK_LE
be50: 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  };.    assert( p
be60: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
be70: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
be80: 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f  xpr==2 );.    fo
be90: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
bea0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
beb0: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  ewExpr;.      in
bec0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
bed0: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
bee0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bef0: 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20  ops[i], .       
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bf20: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e  rDup(db, pExpr->
bf30: 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20  pLeft, 0),.     
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bf60: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  xprDup(db, pList
bf70: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29  ->a[i].pExpr, 0)
bf80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e  , 0);.      idxN
bf90: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
bfa0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
bfb0: 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55  Expr, TERM_VIRTU
bfc0: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
bfd0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
bfe0: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
bff0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
c000: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
c010: 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ew);.      pTerm
c020: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c030: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  rm];.      pWC->
c040: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
c050: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
c060: 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43   }.    pTerm->nC
c070: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65  hild = 2;.  }.#e
c080: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c090: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
c0a0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
c0b0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c0c0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
c0d0: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
c0e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
c0f0: 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e  UBQUERY).  /* An
c100: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
c110: 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66  t is composed of
c120: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62   two or more sub
c130: 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
c140: 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70  by.  ** an OR op
c150: 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65  erator..  */.  e
c160: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
c170: 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20  p==TK_OR ){.    
c180: 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d  assert( pWC->op=
c190: 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65  =TK_AND );.    e
c1a0: 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
c1b0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54  (pSrc, pWC, idxT
c1c0: 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  erm);.    pTerm 
c1d0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
c1e0: 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  m];.  }.#endif /
c1f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
c200: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
c210: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c220: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
c230: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64  IZATION.  /* Add
c240: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
c250: 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
c260: 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b  h space on a LIK
c270: 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f  E or GLOB.  ** o
c280: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
c290: 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72  ** A like patter
c2a0: 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78  n of the form "x
c2b0: 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73   LIKE 'abc%'" is
c2c0: 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f   changed into co
c2d0: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20  nstraints.  **. 
c2e0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d   **          x>=
c2f0: 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64  'abc' AND x<'abd
c300: 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62  ' AND x LIKE 'ab
c310: 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  c%'.  **.  ** Th
c320: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
c330: 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22   of the prefix "
c340: 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e  abc" is incremen
c350: 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a  ted to form the.
c360: 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e    ** termination
c370: 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22   condition "abd"
c380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43  ..  */.  if( pWC
c390: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20  ->op==TK_AND .  
c3a0: 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62   && isLikeOrGlob
c3b0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
c3c0: 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c  &pStr1, &isCompl
c3d0: 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20  ete, &noCase).  
c3e0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
c3f0: 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53  ft;       /* LHS
c400: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
c410: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78  erator */.    Ex
c420: 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20  pr *pStr2;      
c430: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72   /* Copy of pStr
c440: 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f  1 - RHS of LIKE/
c450: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
c460: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
c470: 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a  xpr1;.    Expr *
c480: 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69  pNewExpr2;.    i
c490: 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20  nt idxNew1;.    
c4a0: 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20  int idxNew2;.   
c4b0: 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e   Token sCollSeqN
c4c0: 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame;  /* Name of
c4d0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
c4e0: 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66  nce */..    pLef
c4f0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
c500: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
c510: 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69      pStr2 = sqli
c520: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c530: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  Str1, 0);.    if
c540: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
c550: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20  led ){.      u8 
c560: 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a  c, *pC;       /*
c570: 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   Last character 
c580: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
c590: 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20   wildcard */.   
c5a0: 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53     pC = (u8*)&pS
c5b0: 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71  tr2->u.zToken[sq
c5c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53  lite3Strlen30(pS
c5d0: 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31  tr2->u.zToken)-1
c5e0: 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43  ];.      c = *pC
c5f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
c600: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  se ){.        /*
c610: 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f   The point is to
c620: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c   increment the l
c630: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  ast character be
c640: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20  fore the first. 
c650: 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61         ** wildca
c660: 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69  rd.  But if we i
c670: 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68  ncrement '@', th
c680: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20  at will push it 
c690: 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
c6a0: 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72   ** alphabetic r
c6b0: 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20  ange where case 
c6c0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c  conversions will
c6d0: 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20   mess up the .  
c6e0: 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c        ** inequal
c6f0: 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74  ity.  To avoid t
c700: 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  his, make sure t
c710: 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66  o also run the f
c720: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c  ull.        ** L
c730: 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69  IKE on all candi
c740: 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  date expressions
c750: 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65   by clearing the
c760: 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67   isComplete flag
c770: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
c780: 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31      if( c=='A'-1
c790: 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   ) isComplete = 
c7a0: 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34  0;   /* EV: R-64
c7b0: 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20  339-08207 */... 
c7c0: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
c7d0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  e3UpperToLower[c
c7e0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
c7f0: 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20   *pC = c + 1;.  
c800: 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71    }.    sCollSeq
c810: 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20  Name.z = noCase 
c820: 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49  ? "NOCASE" : "BI
c830: 4e 41 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c  NARY";.    sColl
c840: 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20  SeqName.n = 6;. 
c850: 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73     pNewExpr1 = s
c860: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
c870: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
c880: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
c890: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
c8a0: 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20  , TK_GE, .      
c8b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c8c0: 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28  AddCollateToken(
c8d0: 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31  pParse,pNewExpr1
c8e0: 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c  ,&sCollSeqName),
c8f0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72  .           pStr
c900: 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  1, 0);.    idxNe
c910: 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w1 = whereClause
c920: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
c930: 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54  Expr1, TERM_VIRT
c940: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
c950: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c960: 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20   idxNew1==0 );. 
c970: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
c980: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
c990: 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  1);.    pNewExpr
c9a0: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  2 = sqlite3ExprD
c9b0: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
c9c0: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20  ;.    pNewExpr2 
c9d0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
c9e0: 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20  Parse, TK_LT,.  
c9f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ca00: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
ca10: 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45  ken(pParse,pNewE
ca20: 78 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61  xpr2,&sCollSeqNa
ca30: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
ca40: 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69  pStr2, 0);.    i
ca50: 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c  dxNew2 = whereCl
ca60: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
ca70: 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f  pNewExpr2, TERM_
ca80: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
ca90: 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
caa0: 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20  ase( idxNew2==0 
cab0: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
cac0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
cad0: 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72  xNew2);.    pTer
cae0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
caf0: 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  erm];.    if( is
cb00: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
cb10: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31    pWC->a[idxNew1
cb20: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
cb30: 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  erm;.      pWC->
cb40: 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65  a[idxNew2].iPare
cb50: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
cb60: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
cb70: 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 2;.    }.  }
cb80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
cb90: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
cba0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
cbb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cbc0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
cbd0: 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43  /* Add a WO_MATC
cbe0: 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d  H auxiliary term
cbf0: 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69   to the constrai
cc00: 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20  nt set if the.  
cc10: 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65  ** current expre
cc20: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
cc30: 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41  form:  column MA
cc40: 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54  TCH expr..  ** T
cc50: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
cc60: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78  is used by the x
cc70: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
cc80: 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61  s of.  ** virtua
cc90: 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e  l tables.  The n
cca0: 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69  ative query opti
ccb0: 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61  mizer does not a
ccc0: 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64  ttempt.  ** to d
ccd0: 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20  o anything with 
cce0: 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e  MATCH functions.
ccf0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61  .  */.  if( isMa
cd00: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70  tchOfColumn(pExp
cd10: 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  r) ){.    int id
cd20: 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a  xNew;.    Expr *
cd30: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
cd40: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
cd50: 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74  NewTerm;.    Bit
cd60: 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d  mask prereqColum
cd70: 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a  n, prereqExpr;..
cd80: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
cd90: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
cda0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
cdb0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
cdc0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
cdd0: 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20  .    prereqExpr 
cde0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
cdf0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
ce00: 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f  t);.    prereqCo
ce10: 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65  lumn = exprTable
ce20: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
ce30: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
ce40: 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72  (prereqExpr & pr
ce50: 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29  ereqColumn)==0 )
ce60: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
ce70: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  ewExpr;.      pN
ce80: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
ce90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
cea0: 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20  _MATCH, .       
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
ced0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69  3ExprDup(db, pRi
cee0: 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  ght, 0), 0);.   
cef0: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
cf00: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
cf10: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
cf20: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
cf30: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
cf40: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
cf50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
cf60: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
cf70: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
cf80: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
cf90: 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72  ght = prereqExpr
cfa0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
cfb0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
cfc0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
cfd0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
cfe0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
cff0: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
d000: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
d010: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43  erator = WO_MATC
d020: 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  H;.      pNewTer
d030: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
d040: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
d050: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
d060: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
d070: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
d080: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
d090: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
d0a0: 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
d0b0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
d0c0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
d0d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
d0e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d0f0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
d100: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
d110: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20  _ENABLE_STAT3.  
d120: 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73  /* When sqlite_s
d130: 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
d140: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
d150: 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20   an operator of 
d160: 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78  the.  ** form "x
d170: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61   IS NOT NULL" ca
d180: 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65  n sometimes be e
d190: 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66  valuated more ef
d1a0: 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61  ficiently.  ** a
d1b0: 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20  s "x>NULL" if x 
d1c0: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
d1d0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  R PRIMARY KEY.  
d1e0: 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20  So construct a. 
d1f0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d   ** virtual term
d200: 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20   of that form.. 
d210: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
d220: 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  at the virtual t
d230: 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67  erm must be tagg
d240: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55  ed with TERM_VNU
d250: 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54  LL.  This.  ** T
d260: 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69  ERM_VNULL tag wi
d270: 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20  ll suppress the 
d280: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
d290: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
d2a0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70    ** of the loop
d2b0: 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54  .  Without the T
d2c0: 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20  ERM_VNULL flag, 
d2d0: 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
d2e0: 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  ck at.  ** the s
d2f0: 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tart of the loop
d300: 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e   will prevent an
d310: 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62  y results from b
d320: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20  eing returned.. 
d330: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
d340: 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a  >op==TK_NOTNULL.
d350: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
d360: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
d370: 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  N.   && pExpr->p
d380: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Left->iColumn>=0
d390: 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  .  ){.    Expr *
d3a0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78  pNewExpr;.    Ex
d3b0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
d3c0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e  r->pLeft;.    in
d3d0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68  t idxNew;.    Wh
d3e0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
d3f0: 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72  m;..    pNewExpr
d400: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
d410: 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20  pParse, TK_GT,. 
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d440: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
d450: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d470: 20 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70       sqlite3PExp
d480: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c  r(pParse, TK_NUL
d490: 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b  L, 0, 0, 0), 0);
d4a0: 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77  ..    idxNew = w
d4b0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
d4c0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a  (pWC, pNewExpr,.
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45                TE
d4f0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
d500: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55  DYNAMIC|TERM_VNU
d510: 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78  LL);.    if( idx
d520: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
d530: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
d540: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
d550: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
d560: 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
d570: 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
d580: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
d590: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
d5a0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
d5b0: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
d5c0: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
d5d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
d5e0: 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e   WO_GT;.      pN
d5f0: 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20  ewTerm->iParent 
d600: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
d610: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
d620: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
d630: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
d640: 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   1;.      pTerm-
d650: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
d660: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
d670: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
d680: 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
d690: 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
d6a0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d6b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f  E_ENABLE_STAT */
d6c0: 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f  ..  /* Prevent O
d6d0: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  N clause terms o
d6e0: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72  f a LEFT JOIN fr
d6f0: 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f  om being used to
d700: 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69   drive.  ** an i
d710: 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20  ndex for tables 
d720: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
d730: 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
d740: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
d750: 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74  ht |= extraRight
d760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d770: 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65  function searche
d780: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
d790: 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20   list passed as 
d7a0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
d7b0: 65 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78  ent.** for an ex
d7c0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 79 70 65  pression of type
d7d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20   TK_COLUMN that 
d7e0: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 73 61  refers to the sa
d7f0: 6d 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a  me column and.**
d800: 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20 63   uses the same c
d810: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
d820: 65 20 61 73 20 74 68 65 20 69 43 6f 6c 27 74 68  e as the iCol'th
d830: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
d840: 20 70 49 64 78 2e 0a 2a 2a 20 41 72 67 75 6d 65   pIdx..** Argume
d850: 6e 74 20 69 42 61 73 65 20 69 73 20 74 68 65 20  nt iBase is the 
d860: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 75 73  cursor number us
d870: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
d880: 20 74 68 61 74 20 70 49 64 78 20 72 65 66 65 72   that pIdx refer
d890: 73 0a 2a 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49  s.** to..**.** I
d8a0: 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73  f such an expres
d8b0: 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69  sion is found, i
d8c0: 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  ts index in pLis
d8d0: 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e  t->a[] is return
d8e0: 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70  ed. If.** no exp
d8f0: 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
d900: 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
d910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d920: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20  findIndexCol(.  
d930: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
d960: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d970: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
d980: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
d990: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72  ion list to sear
d9a0: 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  ch */.  int iBas
d9b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
d9c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
d9d0: 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f  r for table asso
d9e0: 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
d9f0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
da00: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
da10: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
da20: 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f  o match column o
da30: 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  f */.  int iCol 
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
da60: 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74   of index to mat
da70: 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ch */.){.  int i
da80: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
da90: 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
daa0: 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66  Coll[iCol];..  f
dab0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
dac0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
dad0: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
dae0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
daf0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
db00: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
db10: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
db20: 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75       && p->iColu
db30: 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn==pIdx->aiColu
db40: 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26  mn[iCol].     &&
db50: 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73   p->iTable==iBas
db60: 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43  e.    ){.      C
db70: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
db80: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
db90: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  eq(pParse, pList
dba0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
dbb0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
dbc0: 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c  pColl) && 0==sql
dbd0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
dbe0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
dbf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
dc00: 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn i;.      }.  
dc10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
dc20: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n -1;.}../*.** T
dc30: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 74 65  his routine dete
dc40: 72 6d 69 6e 65 73 20 69 66 20 70 49 64 78 20 63  rmines if pIdx c
dc50: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 73  an be used to as
dc60: 73 69 73 74 20 69 6e 20 70 72 6f 63 65 73 73 69  sist in processi
dc70: 6e 67 20 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54  ng a.** DISTINCT
dc80: 20 71 75 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f   qualifier. In o
dc90: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 74  ther words, it t
dca0: 65 73 74 73 20 77 68 65 74 68 65 72 20 6f 72 20  ests whether or 
dcb0: 6e 6f 74 20 75 73 69 6e 67 20 74 68 69 73 0a 2a  not using this.*
dcc0: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
dcd0: 6f 75 74 65 72 20 6c 6f 6f 70 20 67 75 61 72 61  outer loop guara
dce0: 6e 74 65 65 73 20 74 68 61 74 20 72 6f 77 73 20  ntees that rows 
dcf0: 77 69 74 68 20 65 71 75 61 6c 20 76 61 6c 75 65  with equal value
dd00: 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70  s for.** all exp
dd10: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
dd20: 70 44 69 73 74 69 6e 63 74 20 6c 69 73 74 20 61  pDistinct list a
dd30: 72 65 20 64 65 6c 69 76 65 72 65 64 20 67 72 6f  re delivered gro
dd40: 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a  uped together..*
dd50: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
dd60: 2c 20 74 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a  , the query .**.
dd70: 2a 2a 20 20 20 53 45 4c 45 43 54 20 44 49 53 54  **   SELECT DIST
dd80: 49 4e 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  INCT a, b, c FRO
dd90: 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20  M tbl WHERE a = 
dda0: 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65  ?.**.** can bene
ddb0: 66 69 74 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64  fit from any ind
ddc0: 65 78 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62  ex on columns "b
ddd0: 22 20 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74  " and "c"..*/.st
dde0: 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69  atic int isDisti
ddf0: 6e 63 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73  nctIndex(.  Pars
de00: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
de10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
de20: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
de30: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
de40: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
de50: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
de60: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64   clause */.  Ind
de70: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de90: 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  The index being 
dea0: 63 6f 6e 73 69 64 65 72 65 64 20 2a 2f 0a 20 20  considered */.  
deb0: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
dee0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 70   for the table p
def0: 49 64 78 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45  Idx is on */.  E
df00: 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
df10: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct,            /
df20: 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 65  * The DISTINCT e
df30: 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20  xpressions */.  
df40: 69 6e 74 20 6e 45 71 43 6f 6c 20 20 20 20 20 20  int nEqCol      
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64  /* Number of ind
df70: 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20  ex columns with 
df80: 3d 3d 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61  == */.){.  Bitma
df90: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20  sk mask = 0;    
dfa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
dfb0: 73 6b 20 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65  sk of unaccounte
dfc0: 64 20 66 6f 72 20 70 44 69 73 74 69 6e 63 74 20  d for pDistinct 
dfd0: 65 78 70 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  exprs */.  int i
dfe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
e000: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
e010: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  */..  assert( pD
e020: 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20  istinct!=0 );.  
e030: 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 3d  if( pIdx->zName=
e040: 3d 30 20 7c 7c 20 70 44 69 73 74 69 6e 63 74 2d  =0 || pDistinct-
e050: 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 72 65  >nExpr>=BMS ) re
e060: 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61  turn 0;.  testca
e070: 73 65 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e  se( pDistinct->n
e080: 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 0a  Expr==BMS-1 );..
e090: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
e0a0: 68 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73  h all the expres
e0b0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 64 69 73  sions in the dis
e0c0: 74 69 6e 63 74 20 6c 69 73 74 2e 20 49 66 20 61  tinct list. If a
e0d0: 6e 79 20 6f 66 20 74 68 65 6d 0a 20 20 2a 2a 20  ny of them.  ** 
e0e0: 61 72 65 20 6e 6f 74 20 73 69 6d 70 6c 65 20 63  are not simple c
e0f0: 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73  olumn references
e100: 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
e110: 4f 74 68 65 72 77 69 73 65 2c 20 74 65 73 74 20  Otherwise, test 
e120: 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52  if the.  ** WHER
e130: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
e140: 73 20 61 20 22 63 6f 6c 3d 58 22 20 63 6c 61 75  s a "col=X" clau
e150: 73 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  se. If it does, 
e160: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
e170: 20 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   ** can be ignor
e180: 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e  ed. If it does n
e190: 6f 74 2c 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  ot, and the colu
e1a0: 6d 6e 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  mn does not belo
e1b0: 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73  ng to the.  ** s
e1c0: 61 6d 65 20 74 61 62 6c 65 20 61 73 20 69 6e 64  ame table as ind
e1d0: 65 78 20 70 49 64 78 2c 20 72 65 74 75 72 6e 20  ex pIdx, return 
e1e0: 65 61 72 6c 79 2e 20 46 69 6e 61 6c 6c 79 2c 20  early. Finally, 
e1f0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20  if there is no. 
e200: 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20 22 63 6f   ** matching "co
e210: 6c 3d 58 22 20 65 78 70 72 65 73 73 69 6f 6e 20  l=X" expression 
e220: 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  and the column i
e230: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  s on the same ta
e240: 62 6c 65 20 61 73 20 70 49 64 78 2c 0a 20 20 2a  ble as pIdx,.  *
e250: 2a 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 73  * set the corres
e260: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 76  ponding bit in v
e270: 61 72 69 61 62 6c 65 20 6d 61 73 6b 2e 0a 20 20  ariable mask..  
e280: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
e290: 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72  pDistinct->nExpr
e2a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  ; i++){.    Wher
e2b0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
e2c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
e2d0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
e2e0: 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b  te(pDistinct->a[
e2f0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
e300: 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  f( p->op!=TK_COL
e310: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
e320: 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
e330: 54 65 72 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61  Term(pWC, p->iTa
e340: 62 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c  ble, p->iColumn,
e350: 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
e360: 5f 45 51 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  _EQ, 0);.    if(
e370: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20   pTerm ){.      
e380: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
e390: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
e3a0: 6f 6c 6c 53 65 71 20 2a 70 31 20 3d 20 73 71 6c  ollSeq *p1 = sql
e3b0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
e3c0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
e3d0: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
e3e0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 43  pRight);.      C
e3f0: 6f 6c 6c 53 65 71 20 2a 70 32 20 3d 20 73 71 6c  ollSeq *p2 = sql
e400: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
e410: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
e420: 20 20 69 66 28 20 70 31 3d 3d 70 32 20 29 20 63    if( p1==p2 ) c
e430: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
e440: 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65     if( p->iTable
e450: 21 3d 62 61 73 65 20 29 20 72 65 74 75 72 6e 20  !=base ) return 
e460: 30 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28  0;.    mask |= (
e470: 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20  ((Bitmask)1) << 
e480: 69 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  i);.  }..  for(i
e490: 3d 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26  =nEqCol; mask &&
e4a0: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
e4b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
e4c0: 69 45 78 70 72 20 3d 20 66 69 6e 64 49 6e 64 65  iExpr = findInde
e4d0: 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69  xCol(pParse, pDi
e4e0: 73 74 69 6e 63 74 2c 20 62 61 73 65 2c 20 70 49  stinct, base, pI
e4f0: 64 78 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  dx, i);.    if( 
e500: 69 45 78 70 72 3c 30 20 29 20 62 72 65 61 6b 3b  iExpr<0 ) break;
e510: 0a 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28  .    mask &= ~((
e520: 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69  (Bitmask)1) << i
e530: 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Expr);.  }..  re
e540: 74 75 72 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a  turn (mask==0);.
e550: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
e560: 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
e570: 54 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e  TINCT expression
e580: 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
e590: 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
e5a0: 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61  nt.** is redunda
e5b0: 6e 74 2e 20 41 20 44 49 53 54 49 4e 43 54 20 6c  nt. A DISTINCT l
e5c0: 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ist is redundant
e5d0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
e5e0: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55   contains a.** U
e5f0: 4e 49 51 55 45 20 69 6e 64 65 78 20 74 68 61 74  NIQUE index that
e600: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
e610: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
e620: 68 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65  he query will be
e630: 20 64 69 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79   distinct.** any
e640: 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  way..*/.static i
e650: 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  nt isDistinctRed
e660: 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20  undant(.  Parse 
e670: 2a 70 50 61 72 73 65 2c 0a 20 20 53 72 63 4c 69  *pParse,.  SrcLi
e680: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20  st *pTabList,.  
e690: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
e6a0: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44  ,.  ExprList *pD
e6b0: 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62  istinct.){.  Tab
e6c0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
e6d0: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
e6e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e6f0: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
e700: 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49  t iBase;..  /* I
e710: 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20  f there is more 
e720: 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f  than one table o
e730: 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20  r sub-select in 
e740: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
e750: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65  of.  ** this que
e760: 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ry, then it will
e770: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
e780: 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68   to show that th
e790: 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a  e DISTINCT .  **
e7a0: 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e   clause is redun
e7b0: 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  dant. */.  if( p
e7c0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31  TabList->nSrc!=1
e7d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
e7e0: 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Base = pTabList-
e7f0: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
e800: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
e810: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
e820: 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
e830: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20   expressions is 
e840: 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e  an IPK column on
e850: 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68   table iBase, th
e860: 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20  en return .  ** 
e870: 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20  true. Note: The 
e880: 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73  (p->iTable==iBas
e890: 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  e) part of this 
e8a0: 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73  test may be fals
e8b0: 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  e if the.  ** cu
e8c0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20  rrent SELECT is 
e8d0: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
e8e0: 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
e8f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69  or(i=0; i<pDisti
e900: 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  nct->nExpr; i++)
e910: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
e920: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
e930: 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74  ollate(pDistinct
e940: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
e950: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
e960: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
e970: 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70  able==iBase && p
e980: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
e990: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
e9a0: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
e9b0: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  ll indices on th
e9c0: 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e  e table, checkin
e9d0: 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66  g each to see if
e9e0: 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74   it makes.  ** t
e9f0: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
ea00: 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e  ifier redundant.
ea10: 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a   It does so if:.
ea20: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54    **.  **   1. T
ea30: 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65  he index is itse
ea40: 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20  lf UNIQUE, and. 
ea50: 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c   **.  **   2. Al
ea60: 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  l of the columns
ea70: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72   in the index ar
ea80: 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66  e either part of
ea90: 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20   the pDistinct. 
eaa0: 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f   **      list, o
eab0: 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45  r else the WHERE
eac0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
ead0: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
eae0: 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a  orm "col=X",.  *
eaf0: 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69  *      where X i
eb00: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c  s a constant val
eb10: 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  ue. The collatio
eb20: 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74  n sequences of t
eb30: 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d  he.  **      com
eb40: 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65  parison and sele
eb50: 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69  ct-list expressi
eb60: 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74  ons must match t
eb70: 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65  hose of the inde
eb80: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33  x..  **.  **   3
eb90: 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69  . All of those i
eba0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  ndex columns for
ebb0: 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
ebc0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
ebd0: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  .  **      conta
ebe0: 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72  in a "col=X" ter
ebf0: 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f  m are subject to
ec00: 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
ec10: 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
ec20: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
ec30: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
ec40: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
ec50: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
ec60: 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20  rror==OE_None ) 
ec70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
ec80: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
ec90: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
eca0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
ecb0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
ecc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66  ;.      if( 0==f
ecd0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
ece0: 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d  se, iCol, ~(Bitm
ecf0: 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49  ask)0, WO_EQ, pI
ed00: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  dx) ){.        i
ed10: 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e  nt iIdxCol = fin
ed20: 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65  dIndexCol(pParse
ed30: 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61  , pDistinct, iBa
ed40: 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20  se, pIdx, i);.  
ed50: 20 20 20 20 20 20 69 66 28 20 69 49 64 78 43 6f        if( iIdxCo
ed60: 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f  l<0 || pTab->aCo
ed70: 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
ed80: 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  [i]].notNull==0 
ed90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
eda0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
edb0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
edc0: 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f  if( i==pIdx->nCo
edd0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lumn ){.      /*
ede0: 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c   This index impl
edf0: 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53  ies that the DIS
ee00: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
ee10: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
ee20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
ee30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
ee40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
ee50: 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65   Prepare a crude
ee60: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
ee70: 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   logarithm of th
ee80: 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a  e input value..*
ee90: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65  * The results ne
eea0: 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e  ed not be exact.
eeb0: 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75    This is only u
eec0: 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69  sed for estimati
eed0: 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20  ng.** the total 
eee0: 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69  cost of performi
eef0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69  ng operations wi
ef00: 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28  th O(logN) or O(
ef10: 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65  NlogN).** comple
ef20: 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e  xity.  Because N
ef30: 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73   is just a guess
ef40: 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74  , it is no great
ef50: 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c   tragedy if.** l
ef60: 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ogN is a little 
ef70: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64  off..*/.static d
ef80: 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75  ouble estLog(dou
ef90: 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65  ble N){.  double
efa0: 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75   logN = 1;.  dou
efb0: 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68  ble x = 10;.  wh
efc0: 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20  ile( N>x ){.    
efd0: 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78  logN += 1;.    x
efe0: 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65   *= 10;.  }.  re
eff0: 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a  turn logN;.}../*
f000: 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73  .** Two routines
f010: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68   for printing th
f020: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
f030: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
f040: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  fo.** structure.
f050: 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69    Used for testi
f060: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
f070: 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68   only.  If neith
f080: 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  er.** SQLITE_TES
f090: 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55  T or SQLITE_DEBU
f0a0: 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74  G are defined, t
f0b0: 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e  hen these routin
f0c0: 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73  es.** are no-ops
f0d0: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
f0e0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
f0f0: 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
f100: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
f110: 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
f120: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
f130: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
f140: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
f150: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
f160: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
f170: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
f180: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
f190: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
f1a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f1b0: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
f1c0: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
f1d0: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
f1e0: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
f1f0: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
f200: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
f210: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
f220: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
f230: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
f240: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
f250: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
f260: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
f270: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
f280: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
f290: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
f2a0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f2b0: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
f2c0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
f2d0: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
f2e0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
f2f0: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
f300: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
f310: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
f320: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
f330: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
f340: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
f350: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
f360: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
f370: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
f380: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
f390: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
f3a0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
f3b0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f3c0: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
f3d0: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
f3e0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
f3f0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
f400: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
f410: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
f420: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
f430: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
f440: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
f450: 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
f460: 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
f470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
f480: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
f490: 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
f4a0: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
f4b0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
f4c0: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
f4d0: 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
f4e0: 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
f4f0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
f500: 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
f510: 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
f520: 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65  edCost);.}.#else
f530: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
f540: 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
f550: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
f560: 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
f570: 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65  ../* .** Require
f580: 64 20 62 65 63 61 75 73 65 20 62 65 73 74 49 6e  d because bestIn
f590: 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 20  dex() is called 
f5a0: 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49  by bestOrClauseI
f5b0: 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69  ndex() .*/.stati
f5c0: 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78  c void bestIndex
f5d0: 28 57 68 65 72 65 42 65 73 74 49 64 78 2a 29 3b  (WhereBestIdx*);
f5e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
f5f0: 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
f600: 20 66 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e   find an scannin
f610: 67 20 73 74 72 61 74 65 67 79 20 74 68 61 74 20  g strategy that 
f620: 63 61 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  can be used .** 
f630: 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27  to optimize an '
f640: 4f 52 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74  OR' expression t
f650: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
f660: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a   WHERE clause. .
f670: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
f680: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f690: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
f6a0: 20 70 53 72 63 20 6d 61 79 20 62 65 20 65 69 74   pSrc may be eit
f6b0: 68 65 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72  her a.** regular
f6c0: 20 42 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72   B-Tree table or
f6d0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
f6e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f6f0: 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
f700: 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20  ex(WhereBestIdx 
f710: 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  *p){.#ifndef SQL
f720: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
f730: 4d 49 5a 41 54 49 4f 4e 0a 20 20 57 68 65 72 65  MIZATION.  Where
f740: 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d  Clause *pWC = p-
f750: 3e 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  >pWC;           
f760: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
f770: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
f780: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
f790: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 2f 2a  rc = p->pSrc; /*
f7a0: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
f7b0: 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
f7c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
f7d0: 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72  Cur = pSrc->iCur
f7e0: 73 6f 72 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  sor;      /* The
f7f0: 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
f800: 61 62 6c 65 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  able  */.  const
f810: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63   Bitmask maskSrc
f820: 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e   = getMask(pWC->
f830: 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
f840: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72    /* Bitmask for
f850: 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65   pSrc */.  Where
f860: 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43  Term * const pWC
f870: 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
f880: 43 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20  C->nTerm];      
f890: 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
f8a0: 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54  >a[] */.  WhereT
f8b0: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f8d0: 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
f8e0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
f8f0: 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  use */..  /* The
f900: 20 4f 52 2d 63 6c 61 75 73 65 20 6f 70 74 69 6d   OR-clause optim
f910: 69 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 6c  ization is disal
f920: 6c 6f 77 65 64 20 69 66 20 74 68 65 20 49 4e 44  lowed if the IND
f930: 45 58 45 44 20 42 59 20 6f 72 0a 20 20 2a 2a 20  EXED BY or.  ** 
f940: 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
f950: 73 65 73 20 61 72 65 20 75 73 65 64 20 6f 72 20  ses are used or 
f960: 69 66 20 74 68 65 20 57 48 45 52 45 5f 41 4e 44  if the WHERE_AND
f970: 5f 4f 4e 4c 59 20 62 69 74 20 69 73 20 73 65 74  _ONLY bit is set
f980: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  . */.  if( pSrc-
f990: 3e 6e 6f 74 49 6e 64 65 78 65 64 20 7c 7c 20 70  >notIndexed || p
f9a0: 53 72 63 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29  Src->pIndex!=0 )
f9b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
f9c0: 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 77 63 74  }.  if( pWC->wct
f9d0: 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
f9e0: 41 4e 44 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  AND_ONLY ){.    
f9f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
fa00: 2a 20 53 65 61 72 63 68 20 74 68 65 20 57 48 45  * Search the WHE
fa10: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
fa20: 66 6f 72 20 61 20 75 73 61 62 6c 65 20 57 4f 5f  for a usable WO_
fa30: 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f  OR term. */.  fo
fa40: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
fa50: 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
fa60: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
fa70: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fa80: 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20 20 20 26 26  ==WO_OR .     &&
fa90: 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   ((pTerm->prereq
faa0: 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63 29 20  All & ~maskSrc) 
fab0: 26 20 70 2d 3e 6e 6f 74 52 65 61 64 79 29 3d 3d  & p->notReady)==
fac0: 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
fad0: 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
fae0: 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53 72 63  exable & maskSrc
faf0: 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
fb00: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
fb10: 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
fb20: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
fb30: 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
fb40: 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
fb50: 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
fb60: 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
fb70: 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
fb80: 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
fb90: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 57 48    int flags = WH
fba0: 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
fbb0: 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f 74 61      double rTota
fbc0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 75  l = 0;.      dou
fbd0: 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20  ble nRow = 0;.  
fbe0: 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64      Bitmask used
fbf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 57 68 65 72   = 0;.      Wher
fc00: 65 42 65 73 74 49 64 78 20 73 42 4f 49 3b 0a 0a  eBestIdx sBOI;..
fc10: 20 20 20 20 20 20 73 42 4f 49 20 3d 20 2a 70 3b        sBOI = *p;
fc20: 0a 20 20 20 20 20 20 73 42 4f 49 2e 70 4f 72 64  .      sBOI.pOrd
fc30: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
fc40: 73 42 4f 49 2e 70 44 69 73 74 69 6e 63 74 20 3d  sBOI.pDistinct =
fc50: 20 30 3b 0a 20 20 20 20 20 20 73 42 4f 49 2e 70   0;.      sBOI.p
fc60: 70 49 64 78 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  pIdxInfo = 0;.  
fc70: 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d      for(pOrTerm=
fc80: 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72  pOrWC->a; pOrTer
fc90: 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54  m<pOrWCEnd; pOrT
fca0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
fcb0: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
fcc0: 20 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20   Multi-index OR 
fcd0: 74 65 73 74 69 6e 67 20 66 6f 72 20 74 65 72 6d  testing for term
fce0: 20 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c 6e 22   %d of %d....\n"
fcf0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 4f  , .          (pO
fd00: 72 54 65 72 6d 20 2d 20 70 4f 72 57 43 2d 3e 61  rTerm - pOrWC->a
fd10: 29 2c 20 28 70 54 65 72 6d 20 2d 20 70 57 43 2d  ), (pTerm - pWC-
fd20: 3e 61 29 0a 20 20 20 20 20 20 20 20 29 29 3b 0a  >a).        ));.
fd30: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
fd40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
fd50: 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20  WO_AND ){.      
fd60: 20 20 20 20 73 42 4f 49 2e 70 57 43 20 3d 20 26      sBOI.pWC = &
fd70: 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
fd80: 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
fd90: 20 20 20 62 65 73 74 49 6e 64 65 78 28 26 73 42     bestIndex(&sB
fda0: 4f 49 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  OI);.        }el
fdb0: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
fdc0: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
fdd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
fde0: 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43  ereClause tempWC
fdf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
fe00: 57 43 2e 70 50 61 72 73 65 20 3d 20 70 57 43 2d  WC.pParse = pWC-
fe10: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
fe20: 20 20 20 74 65 6d 70 57 43 2e 70 4d 61 73 6b 53     tempWC.pMaskS
fe30: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
fe40: 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  et;.          te
fe50: 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57  mpWC.pOuter = pW
fe60: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  C;.          tem
fe70: 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  pWC.op = TK_AND;
fe80: 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
fe90: 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20  C.a = pOrTerm;. 
fea0: 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
feb0: 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 0a  wctrlFlags = 0;.
fec0: 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
fed0: 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
fee0: 20 20 20 20 20 20 73 42 4f 49 2e 70 57 43 20 3d        sBOI.pWC =
fef0: 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
ff00: 20 20 20 20 62 65 73 74 49 6e 64 65 78 28 26 73      bestIndex(&s
ff10: 42 4f 49 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  BOI);.        }e
ff20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
ff30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
ff40: 20 7d 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61   }.        rTota
ff50: 6c 20 2b 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 72  l += sBOI.cost.r
ff60: 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 52  Cost;.        nR
ff70: 6f 77 20 2b 3d 20 73 42 4f 49 2e 63 6f 73 74 2e  ow += sBOI.cost.
ff80: 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20  plan.nRow;.     
ff90: 20 20 20 75 73 65 64 20 7c 3d 20 73 42 4f 49 2e     used |= sBOI.
ffa0: 63 6f 73 74 2e 75 73 65 64 3b 0a 20 20 20 20 20  cost.used;.     
ffb0: 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3e 3d 70     if( rTotal>=p
ffc0: 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 20 62  ->cost.rCost ) b
ffd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
ffe0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
fff0: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
10000 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65  clause, increase
10010 20 74 68 65 20 73 63 61 6e 20 63 6f 73 74 20 74   the scan cost t
10020 6f 20 61 63 63 6f 75 6e 74 20 0a 20 20 20 20 20  o account .     
10030 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 73 74   ** for the cost
10040 20 6f 66 20 74 68 65 20 73 6f 72 74 2e 20 2a 2f   of the sort. */
10050 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  .      if( p->pO
10060 72 64 65 72 42 79 21 3d 30 20 29 7b 0a 20 20 20  rderBy!=0 ){.   
10070 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
10080 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e  ("... sorting in
10090 63 72 65 61 73 65 73 20 4f 52 20 63 6f 73 74 20  creases OR cost 
100a0 25 2e 39 67 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  %.9g to %.9g\n",
100b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
100c0 20 20 20 20 20 72 54 6f 74 61 6c 2c 20 72 54 6f       rTotal, rTo
100d0 74 61 6c 2b 6e 52 6f 77 2a 65 73 74 4c 6f 67 28  tal+nRow*estLog(
100e0 6e 52 6f 77 29 29 29 3b 0a 20 20 20 20 20 20 20  nRow)));.       
100f0 20 72 54 6f 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a   rTotal += nRow*
10100 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20  estLog(nRow);.  
10110 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
10120 49 66 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  If the cost of s
10130 63 61 6e 6e 69 6e 67 20 75 73 69 6e 67 20 74 68  canning using th
10140 69 73 20 4f 52 20 74 65 72 6d 20 66 6f 72 20 6f  is OR term for o
10150 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 20  ptimization is. 
10160 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61       ** less tha
10170 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  n the current co
10180 73 74 20 73 74 6f 72 65 64 20 69 6e 20 70 43 6f  st stored in pCo
10190 73 74 2c 20 72 65 70 6c 61 63 65 20 74 68 65 20  st, replace the 
101a0 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20 20 2a  contents.      *
101b0 2a 20 6f 66 20 70 43 6f 73 74 2e 20 2a 2f 0a 20  * of pCost. */. 
101c0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
101d0 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d 69 6e 64 65  ("... multi-inde
101e0 78 20 4f 52 20 63 6f 73 74 3d 25 2e 39 67 20 6e  x OR cost=%.9g n
101f0 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c 20 72 54 6f  row=%.9g\n", rTo
10200 74 61 6c 2c 20 6e 52 6f 77 29 29 3b 0a 20 20 20  tal, nRow));.   
10210 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3c 70 2d     if( rTotal<p-
10220 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a 20  >cost.rCost ){. 
10230 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72         p->cost.r
10240 43 6f 73 74 20 3d 20 72 54 6f 74 61 6c 3b 0a 20  Cost = rTotal;. 
10250 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 75         p->cost.u
10260 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20 20  sed = used;.    
10270 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e      p->cost.plan
10280 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20  .nRow = nRow;.  
10290 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c        p->cost.pl
102a0 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 70 2d 3e 69  an.nOBSat = p->i
102b0 20 3f 20 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e   ? p->aLevel[p->
102c0 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  i-1].plan.nOBSat
102d0 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   : 0;.        p-
102e0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
102f0 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs = flags;.    
10300 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e      p->cost.plan
10310 2e 75 2e 70 54 65 72 6d 20 3d 20 70 54 65 72 6d  .u.pTerm = pTerm
10320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10330 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
10340 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
10350 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a  IMIZATION */.}..
10360 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10370 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
10380 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  DEX./*.** Return
10390 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
103a0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  RE clause term p
103b0 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72  Term is of a for
103c0 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f  m where it.** co
103d0 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68  uld be used with
103e0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63   an index to acc
103f0 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69  ess pSrc, assumi
10400 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
10410 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74  e.** index exist
10420 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
10430 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  t termCanDriveIn
10440 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d  dex(.  WhereTerm
10450 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *pTerm,        
10460 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
10470 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68  lause term to ch
10480 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eck */.  struct 
10490 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
104a0 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  rc,     /* Table
104b0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
104c0 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69  o access */.  Bi
104d0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
104f0 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20  Tables in outer 
10500 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69  loops of the joi
10510 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61  n */.){.  char a
10520 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  ff;.  if( pTerm-
10530 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72  >leftCursor!=pSr
10540 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74  c->iCursor ) ret
10550 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65  urn 0;.  if( pTe
10560 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
10570 4f 5f 45 51 20 29 20 72 65 74 75 72 6e 20 30 3b  O_EQ ) return 0;
10580 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70  .  if( (pTerm->p
10590 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
105a0 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74 75  Ready)!=0 ) retu
105b0 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53  rn 0;.  aff = pS
105c0 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  rc->pTab->aCol[p
105d0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
105e0 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
105f0 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
10600 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72  xAffinityOk(pTer
10610 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29  m->pExpr, aff) )
10620 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
10630 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
10640 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10650 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
10660 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  NDEX./*.** If th
10670 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72  e query plan for
10680 20 70 53 72 63 20 73 70 65 63 69 66 69 65 64 20   pSrc specified 
10690 69 6e 20 70 43 6f 73 74 20 69 73 20 61 20 66 75  in pCost is a fu
106a0 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a  ll table scan.**
106b0 20 61 6e 64 20 69 6e 64 65 78 69 6e 67 20 69 73   and indexing is
106c0 20 61 6c 6c 6f 77 73 20 28 69 66 20 74 68 65 72   allows (if ther
106d0 65 20 69 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45  e is no NOT INDE
106e0 58 45 44 20 63 6c 61 75 73 65 29 20 61 6e 64 20  XED clause) and 
106f0 69 74 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  it.** possible t
10700 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 74 72  o construct a tr
10710 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 74 68  ansient index th
10720 61 74 20 77 6f 75 6c 64 20 70 65 72 66 6f 72 6d  at would perform
10730 20 62 65 74 74 65 72 0a 2a 2a 20 74 68 61 6e 20   better.** than 
10740 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
10750 6e 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 20  n even when the 
10760 63 6f 73 74 20 6f 66 20 63 6f 6e 73 74 72 75 63  cost of construc
10770 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a  ting the index.*
10780 2a 20 69 73 20 74 61 6b 65 6e 20 69 6e 74 6f 20  * is taken into 
10790 61 63 63 6f 75 6e 74 2c 20 74 68 65 6e 20 61 6c  account, then al
107a0 74 65 72 20 74 68 65 20 71 75 65 72 79 20 70 6c  ter the query pl
107b0 61 6e 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  an to use the.**
107c0 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
107d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
107e0 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e   bestAutomaticIn
107f0 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78  dex(WhereBestIdx
10800 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
10810 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
10820 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
10830 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
10840 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
10850 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e  lause *pWC = p->
10860 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
10870 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
10880 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
10890 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
108a0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 2f  rc = p->pSrc;  /
108b0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
108c0 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
108d0 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 54 61   */.  double nTa
108e0 62 6c 65 52 6f 77 3b 20 20 20 20 20 20 20 20 20  bleRow;         
108f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10900 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  ows in the input
10910 20 74 61 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62   table */.  doub
10920 6c 65 20 6c 6f 67 4e 3b 20 20 20 20 20 20 20 20  le logN;        
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 20 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52    /* log(nTableR
10950 6f 77 29 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ow) */.  double 
10960 63 6f 73 74 54 65 6d 70 49 64 78 3b 20 20 20 20  costTempIdx;    
10970 20 20 20 20 20 2f 2a 20 70 65 72 2d 71 75 65 72       /* per-quer
10980 79 20 63 6f 73 74 20 6f 66 20 74 68 65 20 74 72  y cost of the tr
10990 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f  ansient index */
109a0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
109b0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  erm;           /
109c0 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
109d0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
109e0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
109f0 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20  rm *pWCEnd;     
10a00 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
10a10 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62  WC->a[] */.  Tab
10a20 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20  le *pTable;     
10a30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
10a40 65 20 74 68 74 20 6d 69 67 68 74 20 62 65 20 69  e tht might be i
10a50 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28  ndexed */..  if(
10a60 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
10a70 6f 6f 70 3c 3d 28 64 6f 75 62 6c 65 29 31 20 29  oop<=(double)1 )
10a80 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69  {.    /* There i
10a90 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 62 75  s no point in bu
10aa0 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  ilding an automa
10ab0 74 69 63 20 69 6e 64 65 78 20 66 6f 72 20 61 20  tic index for a 
10ac0 73 69 6e 67 6c 65 20 73 63 61 6e 20 2a 2f 0a 20  single scan */. 
10ad0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
10ae0 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62   if( (pParse->db
10af0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
10b00 5f 41 75 74 6f 49 6e 64 65 78 29 3d 3d 30 20 29  _AutoIndex)==0 )
10b10 7b 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74  {.    /* Automat
10b20 69 63 20 69 6e 64 69 63 65 73 20 61 72 65 20 64  ic indices are d
10b30 69 73 61 62 6c 65 64 20 61 74 20 72 75 6e 2d 74  isabled at run-t
10b40 69 6d 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ime */.    retur
10b50 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  n;.  }.  if( (p-
10b60 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
10b70 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
10b80 55 4c 4c 53 43 41 4e 29 21 3d 30 0a 20 20 20 26  ULLSCAN)!=0.   &
10b90 26 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e  & (p->cost.plan.
10ba0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10bb0 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30 0a 20  COVER_SCAN)==0. 
10bc0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c   ){.    /* We al
10bd0 72 65 61 64 79 20 68 61 76 65 20 73 6f 6d 65 20  ready have some 
10be0 6b 69 6e 64 20 6f 66 20 69 6e 64 65 78 20 69 6e  kind of index in
10bf0 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 71 75   use for this qu
10c00 65 72 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ery. */.    retu
10c10 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  rn;.  }.  if( pS
10c20 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  rc->viaCoroutine
10c30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 6e 6e 6f   ){.    /* Canno
10c40 74 20 69 6e 64 65 78 20 61 20 63 6f 2d 72 6f 75  t index a co-rou
10c50 74 69 6e 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  tine */.    retu
10c60 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  rn;.  }.  if( pS
10c70 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29  rc->notIndexed )
10c80 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54  {.    /* The NOT
10c90 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20   INDEXED clause 
10ca0 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 53  appears in the S
10cb0 51 4c 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  QL. */.    retur
10cc0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  n;.  }.  if( pSr
10cd0 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  c->isCorrelated 
10ce0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 6f  ){.    /* The so
10cf0 75 72 63 65 20 69 73 20 61 20 63 6f 72 72 65 6c  urce is a correl
10d00 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 20  ated sub-query. 
10d10 4e 6f 20 70 6f 69 6e 74 20 69 6e 20 69 6e 64 65  No point in inde
10d20 78 69 6e 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20  xing it. */.    
10d30 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61  return;.  }..  a
10d40 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
10d50 51 75 65 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f  QueryLoop >= (do
10d60 75 62 6c 65 29 31 20 29 3b 0a 20 20 70 54 61 62  uble)1 );.  pTab
10d70 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  le = pSrc->pTab;
10d80 0a 20 20 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70  .  nTableRow = p
10d90 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a  Table->nRowEst;.
10da0 20 20 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28    logN = estLog(
10db0 6e 54 61 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f  nTableRow);.  co
10dc0 73 74 54 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f  stTempIdx = 2*lo
10dd0 67 4e 2a 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50  gN*(nTableRow/pP
10de0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
10df0 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 63 6f 73   + 1);.  if( cos
10e00 74 54 65 6d 70 49 64 78 3e 3d 70 2d 3e 63 6f 73  tTempIdx>=p->cos
10e10 74 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f  t.rCost ){.    /
10e20 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 63 72  * The cost of cr
10e30 65 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73  eating the trans
10e40 69 65 6e 74 20 74 61 62 6c 65 20 77 6f 75 6c 64  ient table would
10e50 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
10e60 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
10e70 65 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  e full table sca
10e80 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  n */.    return;
10e90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
10ea0 68 20 66 6f 72 20 61 6e 79 20 65 71 75 61 6c 69  h for any equali
10eb0 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65  ty comparison te
10ec0 72 6d 20 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d  rm */.  pWCEnd =
10ed0 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
10ee0 65 72 6d 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72  erm];.  for(pTer
10ef0 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
10f00 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
10f10 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
10f20 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
10f30 6d 2c 20 70 53 72 63 2c 20 70 2d 3e 6e 6f 74 52  m, pSrc, p->notR
10f40 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 57  eady) ){.      W
10f50 48 45 52 45 54 52 41 43 45 28 28 22 61 75 74 6f  HERETRACE(("auto
10f60 2d 69 6e 64 65 78 20 72 65 64 75 63 65 73 20 63  -index reduces c
10f70 6f 73 74 20 66 72 6f 6d 20 25 2e 31 66 20 74 6f  ost from %.1f to
10f80 20 25 2e 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20   %.1f\n",.      
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
10fa0 3e 63 6f 73 74 2e 72 43 6f 73 74 2c 20 63 6f 73  >cost.rCost, cos
10fb0 74 54 65 6d 70 49 64 78 29 29 3b 0a 20 20 20 20  tTempIdx));.    
10fc0 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20    p->cost.rCost 
10fd0 3d 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 0a 20  = costTempIdx;. 
10fe0 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61       p->cost.pla
10ff0 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20  n.nRow = logN + 
11000 31 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74  1;.      p->cost
11010 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20  .plan.wsFlags = 
11020 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
11030 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e  ;.      p->cost.
11040 75 73 65 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72  used = pTerm->pr
11050 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
11060 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11070 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
11080 6e 65 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63  ne bestAutomatic
11090 49 6e 64 65 78 28 41 29 20 20 2f 2a 20 6e 6f 2d  Index(A)  /* no-
110a0 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  op */.#endif /* 
110b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
110c0 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
110d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
110e0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
110f0 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  NDEX./*.** Gener
11100 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73  ate code to cons
11110 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
11120 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75  object for an au
11130 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a  tomatic index.**
11140 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74   and to set up t
11150 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62  he WhereLevel ob
11160 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74  ject pLevel so t
11170 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hat the code gen
11180 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20  erator.** makes 
11190 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d  use of the autom
111a0 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  atic index..*/.s
111b0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74  tatic void const
111c0 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
111d0 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
111e0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
111f0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
11200 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
11210 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
11220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11230 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
11240 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
11250 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
11260 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
11270 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68  e term to get th
11280 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a  e next index */.
11290 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
112a0 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
112b0 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
112c0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
112d0 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  ailable */.  Whe
112e0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
112f0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11300 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65  e new index here
11310 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f   */.){.  int nCo
11320 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20  lumn;           
11330 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11340 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
11350 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64   constructed ind
11360 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
11370 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
11380 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
11390 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
113a0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
113b0 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b  ereTerm *pWCEnd;
113c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
113d0 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a   of pWC->a[] */.
113e0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11400 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20   Byte of memory 
11410 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64 78 20  needed for pIdx 
11420 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
11430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11440 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72   /* Object descr
11450 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69  ibing the transi
11460 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56  ent index */.  V
11470 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
11480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
11490 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
114a0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
114b0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
114c0 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  rInit;          
114d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
114e0 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  of the initializ
114f0 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d  ation bypass jum
11500 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  p */.  Table *pT
11510 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
11520 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
11530 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
11540 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
11550 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  info;          /
11560 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f  * Key informatio
11570 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  n for the index 
11580 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64 72  */   .  int addr
11590 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
115a0 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
115b0 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f  e index fill loo
115c0 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  p */.  int regRe
115d0 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
115e0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
115f0 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  olding an index 
11600 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
11610 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
11620 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
11630 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  n counter */.  i
11640 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11660 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11670 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20  int mxBitCol;   
11680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
11690 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e  aximum column in
116a0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a   pSrc->colUsed *
116b0 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
116c0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
116d0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
116e0 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f  uence to on a co
116f0 6c 75 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  lumn */.  Bitmas
11700 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20  k idxCols;      
11710 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
11720 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20  of columns used 
11730 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
11740 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43    Bitmask extraC
11750 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ols;          /*
11760 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74   Bitmap of addit
11770 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ional columns */
11780 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
11790 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65  code to skip ove
117a0 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61  r the creation a
117b0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  nd initializatio
117c0 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72  n of the.  ** tr
117d0 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e  ansient index on
117e0 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
117f0 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ent iterations o
11800 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  f the loop. */. 
11810 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
11820 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
11830 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74  =0 );.  addrInit
11840 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
11850 63 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  ce(pParse);..  /
11860 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
11870 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  er of columns th
11880 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64  at will be added
11890 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20   to the index.  
118a0 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d  ** and used to m
118b0 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73  atch WHERE claus
118c0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
118d0 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a  .  nColumn = 0;.
118e0 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d    pTable = pSrc-
118f0 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20  >pTab;.  pWCEnd 
11900 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e  = &pWC->a[pWC->n
11910 54 65 72 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73  Term];.  idxCols
11920 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
11930 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
11940 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
11950 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
11960 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
11970 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
11980 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
11990 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
119a0 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
119b0 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
119c0 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28  = iCol>=BMS ? ((
119d0 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
119e0 2d 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29  -1) : ((Bitmask)
119f0 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20  1)<<iCol;.      
11a00 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
11a10 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BMS );.      tes
11a20 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
11a30 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1 );.      if( 
11a40 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
11a50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11a60 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  nColumn++;.     
11a70 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
11a80 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
11a90 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
11aa0 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20   nColumn>0 );.  
11ab0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
11ac0 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f   = nColumn;..  /
11ad0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
11ae0 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  er of additional
11af0 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
11b00 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a  to create a.  **
11b10 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
11b20 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e    A "covering in
11b30 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78  dex" is an index
11b40 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
11b50 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  ll.  ** columns 
11b60 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20  that are needed 
11b70 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57  by the query.  W
11b80 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69  ith a covering i
11b90 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f  ndex, the.  ** o
11ba0 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65  riginal table ne
11bb0 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
11bc0 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d  accessed.  Autom
11bd0 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73  atic indices mus
11be0 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65  t.  ** be a cove
11bf0 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75  ring index becau
11c00 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  se the index wil
11c10 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
11c20 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69   if the.  ** ori
11c30 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e  ginal table chan
11c40 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ges and the inde
11c50 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e  x and table cann
11c60 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a  ot both be used.
11c70 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20    ** if they go 
11c80 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a  out of sync..  *
11c90 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20  /.  extraCols = 
11ca0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
11cb0 28 7e 69 64 78 43 6f 6c 73 20 7c 20 28 28 28 42  (~idxCols | (((B
11cc0 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
11cd0 31 29 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  1)));.  mxBitCol
11ce0 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   = (pTable->nCol
11cf0 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53   >= BMS-1) ? BMS
11d00 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  -1 : pTable->nCo
11d10 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  l;.  testcase( p
11d20 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
11d30 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  -1 );.  testcase
11d40 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
11d50 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69  BMS-2 );.  for(i
11d60 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
11d70 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
11d80 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74  traCols & (((Bit
11d90 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43  mask)1)<<i) ) nC
11da0 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69  olumn++;.  }.  i
11db0 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
11dc0 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   & (((Bitmask)1)
11dd0 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20  <<(BMS-1)) ){.  
11de0 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61    nColumn += pTa
11df0 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20  ble->nCol - BMS 
11e00 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65  + 1;.  }.  pLeve
11e10 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
11e20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
11e30 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
11e40 4e 4c 59 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20  NLY | WO_EQ;..  
11e50 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
11e60 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
11e70 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69   describe this i
11e80 6e 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20  ndex */.  nByte 
11e90 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b  = sizeof(Index);
11ea0 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
11eb0 75 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b  umn*sizeof(int);
11ec0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
11ed0 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74  Column */.  nByt
11ee0 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a  e += nColumn*siz
11ef0 65 6f 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a  eof(char*);   /*
11f00 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f   Index.azColl */
11f10 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
11f20 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  umn;            
11f30 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
11f40 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49  ortOrder */.  pI
11f50 64 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  dx = sqlite3DbMa
11f60 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
11f70 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  >db, nByte);.  i
11f80 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74  f( pIdx==0 ) ret
11f90 75 72 6e 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70  urn;.  pLevel->p
11fa0 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64  lan.u.pIdx = pId
11fb0 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  x;.  pIdx->azCol
11fc0 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64  l = (char**)&pId
11fd0 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69  x[1];.  pIdx->ai
11fe0 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
11ff0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  pIdx->azColl[nCo
12000 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn];.  pIdx->a
12010 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
12020 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  )&pIdx->aiColumn
12030 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64  [nColumn];.  pId
12040 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
12050 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
12060 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75  >nColumn = nColu
12070 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62  mn;.  pIdx->pTab
12080 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e  le = pTable;.  n
12090 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20   = 0;.  idxCols 
120a0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
120b0 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
120c0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
120d0 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
120e0 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
120f0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
12100 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
12110 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
12120 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
12130 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
12140 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42   iCol>=BMS ? ((B
12150 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
12160 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31  1) : ((Bitmask)1
12170 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69  )<<iCol;.      i
12180 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
12190 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
121a0 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
121b0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
121c0 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
121d0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49  Mask;.        pI
121e0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
121f0 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
12200 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
12210 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
12220 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
12230 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
12240 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
12250 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
12260 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57  >azColl[n] = ALW
12270 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f  AYS(pColl) ? pCo
12280 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e  ll->zName : "BIN
12290 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b  ARY";.        n+
122a0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
122b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
122c0 75 33 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70  u32)n==pLevel->p
122d0 6c 61 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  lan.nEq );..  /*
122e0 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20   Add additional 
122f0 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
12300 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d  o make the autom
12310 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a  atic index into.
12320 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20    ** a covering 
12330 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69  index */.  for(i
12340 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
12350 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
12360 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74  traCols & (((Bit
12370 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20  mask)1)<<i) ){. 
12380 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
12390 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
123a0 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
123b0 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
123c0 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
123d0 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
123e0 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69 74 6d  olUsed & (((Bitm
123f0 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29  ask)1)<<(BMS-1))
12400 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
12410 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
12420 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
12430 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
12440 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
12450 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
12460 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
12470 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
12480 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c   assert( n==nCol
12490 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65  umn );..  /* Cre
124a0 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ate the automati
124b0 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65  c index */.  pKe
124c0 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49  yinfo = sqlite3I
124d0 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
124e0 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73  se, pIdx);.  ass
124f0 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert( pLevel->iId
12500 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c  xCur>=0 );.  sql
12510 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
12520 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  , OP_OpenAutoind
12530 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ex, pLevel->iIdx
12540 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20  Cur, nColumn+1, 
12550 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
12560 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
12570 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyinfo, P4_KEYIN
12580 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56  FO_HANDOFF);.  V
12590 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
125a0 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d  for %s", pTable-
125b0 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
125c0 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74  Fill the automat
125d0 69 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f  ic index with co
125e0 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54  ntent */.  addrT
125f0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
12600 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
12610 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ind, pLevel->iTa
12620 62 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f  bCur);.  regReco
12630 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
12640 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
12650 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
12660 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
12670 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e  , pIdx, pLevel->
12680 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f  iTabCur, regReco
12690 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  rd, 1);.  sqlite
126a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
126b0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
126c0 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
126d0 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
126e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
126f0 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
12700 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
12710 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12720 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c   OP_Next, pLevel
12730 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54  ->iTabCur, addrT
12740 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  op+1);.  sqlite3
12750 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
12760 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
12770 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
12780 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
12790 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
127a0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
127b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
127c0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a   regRecord);.  .
127d0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77    /* Jump here w
127e0 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65  hen skipping the
127f0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
12800 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
12810 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
12820 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Init);.}.#endif 
12830 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
12840 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a  UTOMATIC_INDEX *
12850 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
12860 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12870 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  BLE./*.** Alloca
12880 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
12890 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
128a0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
128b0 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
128c0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
128d0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
128e0 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
128f0 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
12900 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68  ** by passing th
12910 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
12920 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
12930 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66  ion to sqlite3_f
12940 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
12950 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
12960 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64  nfo *allocateInd
12970 65 78 49 6e 66 6f 28 57 68 65 72 65 42 65 73 74  exInfo(WhereBest
12980 49 64 78 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  Idx *p){.  Parse
12990 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
129a0 61 72 73 65 3b 20 0a 20 20 57 68 65 72 65 43 6c  arse; .  WhereCl
129b0 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70  ause *pWC = p->p
129c0 57 43 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  WC;.  struct Src
129d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20  List_item *pSrc 
129e0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 45 78 70  = p->pSrc;.  Exp
129f0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
12a00 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
12a10 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
12a20 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74   nTerm;.  struct
12a30 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
12a40 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
12a50 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
12a60 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
12a70 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
12a80 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
12a90 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
12aa0 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
12ab0 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
12ac0 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72  pTerm;.  int nOr
12ad0 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33  derBy;.  sqlite3
12ae0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
12af0 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54  xInfo;..  WHERET
12b00 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69  RACE(("Recomputi
12b10 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f  ng index info fo
12b20 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63  r %s...\n", pSrc
12b30 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
12b40 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
12b50 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69   number of possi
12b60 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
12b70 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66   constraints ref
12b80 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  erring.  ** to t
12b90 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
12ba0 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65  e */.  for(i=nTe
12bb0 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  rm=0, pTerm=pWC-
12bc0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
12bd0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
12be0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
12bf0 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
12c00 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
12c10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
12c20 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  rt( (pTerm->eOpe
12c30 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f  rator&(pTerm->eO
12c40 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29  perator-1))==0 )
12c50 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
12c60 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12c70 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  ==WO_IN );.    t
12c80 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
12c90 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
12ca0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  NULL );.    if( 
12cb0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12cc0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e   & (WO_IN|WO_ISN
12cd0 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
12ce0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
12cf0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
12d00 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
12d10 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
12d20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
12d30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
12d40 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
12d50 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
12d60 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
12d70 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
12d80 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
12d90 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
12da0 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
12db0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
12dc0 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
12dd0 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
12de0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
12df0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
12e00 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
12e10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
12e20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
12e30 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
12e40 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
12e50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
12e60 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
12e70 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
12e80 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
12e90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
12ea0 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20      if( i==n){. 
12eb0 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
12ec0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
12ed0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
12ee0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12ef0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
12f00 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
12f10 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
12f20 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
12f30 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
12f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12f50 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
12f60 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
12f70 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
12f80 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
12fb0 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
12fc0 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49  erBy );.  if( pI
12fd0 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
12fe0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12ff0 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
13000 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f   memory");.    /
13010 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63  * (double)0 In c
13020 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  ase of SQLITE_OM
13030 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
13040 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  T... */.    retu
13050 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
13060 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
13070 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
13080 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13090 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
130a0 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66  ains.  ** many f
130b0 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
130c0 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
130d0 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
130e0 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20  Index from.  ** 
130f0 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20  changing them.  
13100 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  We have to do so
13110 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67  me funky casting
13120 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
13130 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f  * initialize tho
13140 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a  se fields..  */.
13150 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
13160 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
13170 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
13180 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70  pIdxInfo[1];.  p
13190 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
131a0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
131b0 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
131c0 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
131d0 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
131e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
131f0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
13200 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
13210 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74  rderBy];.  *(int
13220 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
13230 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
13240 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
13250 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
13260 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73   nOrderBy;.  *(s
13270 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
13280 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
13290 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
132a0 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f  straint = pIdxCo
132b0 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  ns;.  *(struct s
132c0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
132d0 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f  erby**)&pIdxInfo
132e0 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64  ->aOrderBy = pId
132f0 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  xOrderBy;.  *(st
13300 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
13310 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
13320 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
13330 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
13340 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13380 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
13390 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
133a0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
133b0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
133c0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
133d0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
133e0 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
133f0 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
13400 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
13410 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54  m->eOperator&(pT
13420 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31  erm->eOperator-1
13430 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  ))==0 );.    tes
13440 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
13450 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
13460 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
13470 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13480 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
13490 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
134a0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e  perator & (WO_IN
134b0 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  |WO_ISNULL) ) co
134c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
134d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
134e0 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
134f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
13500 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
13510 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
13520 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
13530 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
13540 65 74 20 3d 20 69 3b 0a 20 20 20 20 70 49 64 78  et = i;.    pIdx
13550 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38  Cons[j].op = (u8
13560 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
13570 72 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  r;.    /* The di
13580 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
13590 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
135a0 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
135b0 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
135c0 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
135d0 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
135e0 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
135f0 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
13600 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
13610 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
13620 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
13630 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
13640 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
13650 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
13660 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
13670 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
13680 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
13690 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
136a0 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
136b0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
136c0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
136d0 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
136e0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
136f0 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
13700 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
13710 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
13720 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
13730 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
13740 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
13750 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
13760 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
13770 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
13780 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _EQ|WO_LT|WO_LE|
13790 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d  WO_GT|WO_GE|WO_M
137a0 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b  ATCH) );.    j++
137b0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
137c0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
137d0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
137e0 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
137f0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
13800 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  IdxOrderBy[i].iC
13810 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
13820 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
13830 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20  OrderBy[i].desc 
13840 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
13850 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  .sortOrder;.  }.
13860 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e  .  return pIdxIn
13870 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  fo;.}../*.** The
13880 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   table object re
13890 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61  ference passed a
138a0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
138b0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
138c0 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72  nction.** must r
138d0 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75  epresent a virtu
138e0 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  al table. This f
138f0 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20  unction invokes 
13900 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  the xBestIndex()
13910 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  .** method of th
13920 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
13930 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33  with the sqlite3
13940 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e  _index_info poin
13950 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
13960 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
13970 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
13980 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
13990 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
139a0 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
139b0 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
139c0 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
139d0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
139e0 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
139f0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
13a00 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
13a10 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13a20 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
13a30 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
13a40 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
13a50 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
13a60 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
13a70 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
13a80 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
13a90 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
13aa0 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
13ab0 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
13ac0 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
13ad0 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
13ae0 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
13af0 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
13b00 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
13b10 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
13b20 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
13b30 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
13b40 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
13b50 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
13b60 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
13b70 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
13b80 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
13b90 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  ;..  WHERETRACE(
13ba0 28 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72  ("xBestIndex for
13bb0 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   %s\n", pTab->zN
13bc0 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49  ame));.  TRACE_I
13bd0 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
13be0 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
13bf0 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
13c00 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
13c10 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
13c20 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
13c30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
13c40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
13c50 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
13c60 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
13c70 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
13c80 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
13c90 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
13ca0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13cb0 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
13cc0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
13cd0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
13ce0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
13cf0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
13d00 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
13d10 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
13d20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
13d30 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
13d40 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
13d50 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
13d60 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
13d70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
13d80 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
13d90 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
13da0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
13db0 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
13dc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13dd0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13de0 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
13df0 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
13e00 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
13e10 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
13e20 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
13e30 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
13e40 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a  Parse->nErr;.}..
13e50 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
13e60 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f  he best index fo
13e70 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  r a virtual tabl
13e80 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73  e..**.** The bes
13e90 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75  t index is compu
13ea0 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  ted by the xBest
13eb0 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20  Index method of 
13ec0 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  the virtual.** t
13ed0 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68  able module.  Th
13ee0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  is routine is re
13ef0 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70  ally just a wrap
13f00 70 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70  per that sets up
13f10 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f  .** the sqlite3_
13f20 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
13f30 74 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65  ture that is use
13f40 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65  d to communicate
13f50 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e   with.** xBestIn
13f60 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20  dex..**.** In a 
13f70 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69  join, this routi
13f80 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c  ne might be call
13f90 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ed multiple time
13fa0 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d  s for the.** sam
13fb0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
13fc0 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
13fd0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
13fe0 72 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  re is created.**
13ff0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
14000 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e   on the first in
14010 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75  vocation and reu
14020 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65  sed on all subse
14030 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74  quent.** invocat
14040 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74  ions.  The sqlit
14050 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14060 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20  ructure is also 
14070 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64  used when.** cod
14080 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
14090 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72  o access the vir
140a0 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65  tual table.  The
140b0 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65   whereInfoDelete
140c0 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  () .** routine t
140d0 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65  akes care of fre
140e0 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  eing the sqlite3
140f0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
14100 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65  cture after.** e
14110 76 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e  verybody has fin
14120 69 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a  ished with it..*
14130 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
14140 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 57  stVirtualIndex(W
14150 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29 7b  hereBestIdx *p){
14160 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14170 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 20 20   = p->pParse;   
14180 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
14190 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
141a0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
141b0 3d 20 70 2d 3e 70 57 43 3b 20 20 20 20 20 20 2f  = p->pWC;      /
141c0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
141d0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
141e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
141f0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 2f 2a 20  c = p->pSrc; /* 
14200 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
14210 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
14220 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
14230 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
14240 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14250 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20  fo *pIdxInfo;.  
14260 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14270 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
14280 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
14290 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
142a0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
142b0 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
142c0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
142d0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
142e0 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 64 6f  t nOrderBy;.  do
142f0 75 62 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f  uble rCost;..  /
14300 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c  * Make sure wsFl
14310 61 67 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ags is initializ
14320 65 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20  ed to some sane 
14330 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65  value. Otherwise
14340 2c 20 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d  , if the .  ** m
14350 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74  alloc in allocat
14360 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69  eIndexInfo() fai
14370 6c 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ls and this func
14380 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61  tion returns lea
14390 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67  ving.  ** wsFlag
143a0 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61  s in an uninitia
143b0 6c 69 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65  lized state, the
143c0 20 63 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61   caller may beha
143d0 76 65 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79  ve unpredictably
143e0 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
143f0 26 70 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69 7a  &p->cost, 0, siz
14400 65 6f 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a 20  eof(p->cost));. 
14410 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73   p->cost.plan.ws
14420 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
14430 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f  RTUALTABLE;..  /
14440 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33  * If the sqlite3
14450 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
14460 63 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65  cture has not be
14470 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  en previously.  
14480 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
14490 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68   initialized, th
144a0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  en allocate and 
144b0 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f  initialize it no
144c0 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  w..  */.  pIdxIn
144d0 66 6f 20 3d 20 2a 70 2d 3e 70 70 49 64 78 49 6e  fo = *p->ppIdxIn
144e0 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  fo;.  if( pIdxIn
144f0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 2d  fo==0 ){.    *p-
14500 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64  >ppIdxInfo = pId
14510 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
14520 49 6e 64 65 78 49 6e 66 6f 28 70 29 3b 0a 20 20  IndexInfo(p);.  
14530 7d 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  }.  if( pIdxInfo
14540 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
14550 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  n;.  }..  /* At 
14560 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
14570 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14580 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
14590 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74  t pIdxInfo point
145a0 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68  s.  ** to will h
145b0 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ave been initial
145c0 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75 72  ized, either dur
145d0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
145e0 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20  invocation or.  
145f0 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70  ** during some p
14600 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  rior invocation.
14610 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61    Now we just ha
14620 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20  ve to customize 
14630 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73  the.  ** details
14640 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72   of pIdxInfo for
14650 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76   the current inv
14660 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73  ocation and pass
14670 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73   it to.  ** xBes
14680 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20  tIndex..  */..  
14690 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61  /* The module na
146a0 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  me must be defin
146b0 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69  ed. Also, by thi
146c0 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75  s point there mu
146d0 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69  st.  ** be a poi
146e0 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
146f0 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
14700 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a  e. Otherwise.  *
14710 2a 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  * sqlite3ViewGet
14720 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f  ColumnNames() wo
14730 75 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64 20  uld have picked 
14740 75 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20  up the error. . 
14750 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
14760 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20  ab->azModuleArg 
14770 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  && pTab->azModul
14780 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73  eArg[0] );.  ass
14790 65 72 74 28 20 73 71 6c 69 74 65 33 47 65 74 56  ert( sqlite3GetV
147a0 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
147b0 2c 20 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a  , pTab) );..  /*
147c0 20 53 65 74 20 74 68 65 20 61 43 6f 6e 73 74 72   Set the aConstr
147d0 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69  aint[].usable fi
147e0 65 6c 64 73 20 61 6e 64 20 69 6e 69 74 69 61 6c  elds and initial
147f0 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75  ize all .  ** ou
14800 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74  tput variables t
14810 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  o zero..  **.  *
14820 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e  * aConstraint[].
14830 75 73 61 62 6c 65 20 69 73 20 74 72 75 65 20 66  usable is true f
14840 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77  or constraints w
14850 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68  here the right-h
14860 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65 20 63 6f  and.  ** side co
14870 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65  ntains only refe
14880 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 73  rences to tables
14890 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
148a0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
148b0 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65   table.  In othe
148c0 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
148d0 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66  constraint is of
148e0 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
148f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63    **           c
14900 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20 2a  olumn = expr.  *
14910 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72  *.  ** and we ar
14920 65 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20 6a  e evaluating a j
14930 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  oin, then the co
14940 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75  nstraint on colu
14950 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79  mn is .  ** only
14960 20 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74 61   valid if all ta
14970 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20  bles referenced 
14980 69 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74 6f  in expr occur to
14990 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f   the left.  ** o
149a0 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  f the table cont
149b0 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20  aining column.. 
149c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 43 6f   **.  ** The aCo
149d0 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61 72 72 61  nstraints[] arra
149e0 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69  y contains entri
149f0 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74  es for all const
14a00 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74  raints.  ** on t
14a10 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
14a20 2e 20 20 54 68 61 74 20 77 61 79 20 77 65 20 6f  .  That way we o
14a30 6e 6c 79 20 68 61 76 65 20 74 6f 20 63 6f 6d 70  nly have to comp
14a40 75 74 65 20 69 74 20 6f 6e 63 65 0a 20 20 2a 2a  ute it once.  **
14a50 20 65 76 65 6e 20 74 68 6f 75 67 68 20 77 65 20   even though we 
14a60 6d 69 67 68 74 20 74 72 79 20 74 6f 20 70 69 63  might try to pic
14a70 6b 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  k the best index
14a80 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e   multiple times.
14a90 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 61  .  ** For each a
14aa0 74 74 65 6d 70 74 20 61 74 20 70 69 63 6b 69 6e  ttempt at pickin
14ab0 67 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  g an index, the 
14ac0 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20  order of tables 
14ad0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e  in the.  ** join
14ae0 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
14af0 65 6e 74 20 73 6f 20 77 65 20 68 61 76 65 20 74  ent so we have t
14b00 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20  o recompute the 
14b10 75 73 61 62 6c 65 20 66 6c 61 67 0a 20 20 2a 2a  usable flag.  **
14b20 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 2a 2f   each time..  */
14b30 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28  .  pIdxCons = *(
14b40 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14b50 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
14b60 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
14b70 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 55 73 61  nstraint;.  pUsa
14b80 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
14b90 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
14ba0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
14bb0 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
14bc0 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
14bd0 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d 20 70  ns++){.    j = p
14be0 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
14bf0 66 73 65 74 3b 0a 20 20 20 20 70 54 65 72 6d 20  fset;.    pTerm 
14c00 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
14c10 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
14c20 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65  le = (pTerm->pre
14c30 72 65 71 52 69 67 68 74 26 70 2d 3e 6e 6f 74 52  reqRight&p->notR
14c40 65 61 64 79 29 20 3f 20 30 20 3a 20 31 3b 0a 20  eady) ? 0 : 1;. 
14c50 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61   }.  memset(pUsa
14c60 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
14c70 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66  sage[0])*pIdxInf
14c80 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  o->nConstraint);
14c90 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
14ca0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
14cb0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
14cc0 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
14cd0 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70  idxStr);.  }.  p
14ce0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
14cf0 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
14d00 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70  >idxNum = 0;.  p
14d10 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
14d20 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
14d30 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
14d40 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
14d50 20 20 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32 29    /* ((double)2)
14d60 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49   In case of SQLI
14d70 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
14d80 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 70  _POINT... */.  p
14d90 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
14da0 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
14db0 42 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62  BIG_DBL / ((doub
14dc0 6c 65 29 32 29 3b 0a 20 20 6e 4f 72 64 65 72 42  le)2);.  nOrderB
14dd0 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  y = pIdxInfo->nO
14de0 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 70  rderBy;.  if( !p
14df0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
14e00 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64    pIdxInfo->nOrd
14e10 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erBy = 0;.  }.. 
14e20 20 69 66 28 20 76 74 61 62 42 65 73 74 49 6e 64   if( vtabBestInd
14e30 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ex(pParse, pTab,
14e40 20 70 49 64 78 49 6e 66 6f 29 20 29 7b 0a 20 20   pIdxInfo) ){.  
14e50 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
14e60 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
14e70 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14e80 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
14e90 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
14ea0 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d  traint;.  for(i=
14eb0 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
14ec0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
14ed0 7b 0a 20 20 20 20 69 66 28 20 70 55 73 61 67 65  {.    if( pUsage
14ee0 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
14ef0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74  ){.      p->cost
14f00 2e 75 73 65 64 20 7c 3d 20 70 57 43 2d 3e 61 5b  .used |= pWC->a[
14f10 70 49 64 78 43 6f 6e 73 5b 69 5d 2e 69 54 65 72  pIdxCons[i].iTer
14f20 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71 52  mOffset].prereqR
14f30 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
14f40 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
14f50 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
14f60 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20 73 65  ause, and the se
14f70 6c 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 74  lected virtual t
14f80 61 62 6c 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20  able index.  ** 
14f90 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79  does not satisfy
14fa0 20 69 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68   it, increase th
14fb0 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73 63  e cost of the sc
14fc0 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  an accordingly. 
14fd0 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74 63 68 65  This.  ** matche
14fe0 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
14ff0 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74 75 61 6c   for non-virtual
15000 20 74 61 62 6c 65 73 20 69 6e 20 62 65 73 74 42   tables in bestB
15010 74 72 65 65 49 6e 64 65 78 28 29 2e 0a 20 20 2a  treeIndex()..  *
15020 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70 49 64 78  /.  rCost = pIdx
15030 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
15040 6f 73 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  ost;.  if( p->pO
15050 72 64 65 72 42 79 20 26 26 20 70 49 64 78 49 6e  rderBy && pIdxIn
15060 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
15070 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43  med==0 ){.    rC
15080 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43  ost += estLog(rC
15090 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a  ost)*rCost;.  }.
150a0 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69  .  /* The cost i
150b0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
150c0 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
150d0 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28  SQLITE_BIG_DBL (
150e0 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20  the.  ** inital 
150f0 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43  value of lowestC
15100 6f 73 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70  ost in this loop
15110 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  . If it is, then
15120 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c   the.  ** (cost<
15130 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74  lowestCost) test
15140 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65   below will neve
15150 72 20 62 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20  r be true..  ** 
15160 0a 20 20 2a 2a 20 55 73 65 20 22 28 64 6f 75 62  .  ** Use "(doub
15170 6c 65 29 32 22 20 69 6e 73 74 65 61 64 20 6f 66  le)2" instead of
15180 20 22 32 2e 30 22 20 69 6e 20 63 61 73 65 20 4f   "2.0" in case O
15190 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
151a0 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64 65 66 69  NT .  ** is defi
151b0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
151c0 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f  (SQLITE_BIG_DBL/
151d0 28 28 64 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f  ((double)2))<rCo
151e0 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73  st ){.    p->cos
151f0 74 2e 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54  t.rCost = (SQLIT
15200 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62  E_BIG_DBL/((doub
15210 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  le)2));.  }else{
15220 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f  .    p->cost.rCo
15230 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 7d 0a  st = rCost;.  }.
15240 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75    p->cost.plan.u
15250 2e 70 56 74 61 62 49 64 78 20 3d 20 70 49 64 78  .pVtabIdx = pIdx
15260 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78  Info;.  if( pIdx
15270 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
15280 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  sumed ){.    p->
15290 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
152a0 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  s |= WHERE_ORDER
152b0 45 44 3b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e  ED;.    p->cost.
152c0 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 6e 4f  plan.nOBSat = nO
152d0 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b  rderBy;.  }else{
152e0 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61  .    p->cost.pla
152f0 6e 2e 6e 4f 42 53 61 74 20 3d 20 70 2d 3e 69 20  n.nOBSat = p->i 
15300 3f 20 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69  ? p->aLevel[p->i
15310 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20  -1].plan.nOBSat 
15320 3a 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f  : 0;.  }.  p->co
15330 73 74 2e 70 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b  st.plan.nEq = 0;
15340 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  .  pIdxInfo->nOr
15350 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
15360 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  ;..  /* Try to f
15370 69 6e 64 20 61 20 6d 6f 72 65 20 65 66 66 69 63  ind a more effic
15380 69 65 6e 74 20 61 63 63 65 73 73 20 70 61 74 74  ient access patt
15390 65 72 6e 20 62 79 20 75 73 69 6e 67 20 6d 75 6c  ern by using mul
153a0 74 69 70 6c 65 20 69 6e 64 65 78 65 73 0a 20 20  tiple indexes.  
153b0 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61  ** to optimize a
153c0 6e 20 4f 52 20 65 78 70 72 65 73 73 69 6f 6e 20  n OR expression 
153d0 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52 45  within the WHERE
153e0 20 63 6c 61 75 73 65 2e 20 0a 20 20 2a 2f 0a 20   clause. .  */. 
153f0 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
15400 65 78 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ex(p);.}.#endif 
15410 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
15420 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
15430 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
15440 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a  ABLE_STAT3./*.**
15450 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f   Estimate the lo
15460 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74  cation of a part
15470 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67  icular key among
15480 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a   all keys in an.
15490 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65  ** index.  Store
154a0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
154b0 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73  aStat as follows
154c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74  :.**.**    aStat
154d0 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [0]      Est. nu
154e0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73  mber of rows les
154f0 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a 20 20  s than pVal.**  
15500 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20    aStat[1]      
15510 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
15520 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 56 61  ows equal to pVa
15530 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  l.**.** Return S
15540 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
15550 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
15560 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  nt whereKeyStats
15570 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15580 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15590 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
155a0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  ection */.  Inde
155b0 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
155c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
155d0 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d   to consider dom
155e0 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71 6c 69  ain of */.  sqli
155f0 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c  te3_value *pVal,
15600 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
15610 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a   to consider */.
15620 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20    int roundUp,  
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15640 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75   Round up if tru
15650 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69  e.  Round down i
15660 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f  f false */.  tRo
15670 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20  wcnt *aStat     
15680 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15690 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68   stats written h
156a0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74 52 6f 77  ere */.){.  tRow
156b0 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65 78 53 61  cnt n;.  IndexSa
156c0 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 3b 0a 20  mple *aSample;. 
156d0 20 69 6e 74 20 69 2c 20 65 54 79 70 65 3b 0a 20   int i, eType;. 
156e0 20 69 6e 74 20 69 73 45 71 20 3d 20 30 3b 0a 20   int isEq = 0;. 
156f0 20 69 36 34 20 76 3b 0a 20 20 64 6f 75 62 6c 65   i64 v;.  double
15700 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73 73 65 72   r, rS;..  asser
15710 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30 20 7c 7c  t( roundUp==0 ||
15720 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29 3b 0a 20   roundUp==1 );. 
15730 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
15740 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 69 66  Sample>0 );.  if
15750 28 20 70 56 61 6c 3d 3d 30 20 29 20 72 65 74 75  ( pVal==0 ) retu
15760 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
15770 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 61 69 52  .  n = pIdx->aiR
15780 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61 53 61 6d  owEst[0];.  aSam
15790 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d  ple = pIdx->aSam
157a0 70 6c 65 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  ple;.  eType = s
157b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
157c0 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28 20  e(pVal);..  if( 
157d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e  eType==SQLITE_IN
157e0 54 45 47 45 52 20 29 7b 0a 20 20 20 20 76 20 3d  TEGER ){.    v =
157f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
15800 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20 20 20 20  nt64(pVal);.    
15810 72 20 3d 20 28 69 36 34 29 76 3b 0a 20 20 20 20  r = (i64)v;.    
15820 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
15830 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
15840 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
15850 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
15860 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  TE_NULL ) contin
15870 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  ue;.      if( aS
15880 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d  ample[i].eType>=
15890 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72  SQLITE_TEXT ) br
158a0 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61  eak;.      if( a
158b0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
158c0 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
158d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
158e0 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3e 3d 76  Sample[i].u.i>=v
158f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
15900 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  Eq = aSample[i].
15910 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20 20 20 20  u.i==v;.        
15920 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15930 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
15940 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15950 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
15960 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29  ==SQLITE_FLOAT )
15970 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  ;.        if( aS
15980 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72 20  ample[i].u.r>=r 
15990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 45  ){.          isE
159a0 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  q = aSample[i].u
159b0 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 20  .r==r;.         
159c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
159d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
159e0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70    }else if( eTyp
159f0 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20  e==SQLITE_FLOAT 
15a00 29 7b 0a 20 20 20 20 72 20 3d 20 73 71 6c 69 74  ){.    r = sqlit
15a10 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
15a20 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  pVal);.    for(i
15a30 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  =0; i<pIdx->nSam
15a40 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
15a50 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
15a60 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  eType==SQLITE_NU
15a70 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
15a80 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
15a90 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49 54  [i].eType>=SQLIT
15aa0 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b 0a  E_TEXT ) break;.
15ab0 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
15ac0 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
15ad0 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
15ae0 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65      rS = aSample
15af0 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20 20 20 7d  [i].u.r;.      }
15b00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 53  else{.        rS
15b10 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e   = aSample[i].u.
15b20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  i;.      }.     
15b30 20 69 66 28 20 72 53 3e 3d 72 20 29 7b 0a 20 20   if( rS>=r ){.  
15b40 20 20 20 20 20 20 69 73 45 71 20 3d 20 72 53 3d        isEq = rS=
15b50 3d 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  =r;.        brea
15b60 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
15b70 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79  .  }else if( eTy
15b80 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  pe==SQLITE_NULL 
15b90 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  ){.    i = 0;.  
15ba0 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 30 5d    if( aSample[0]
15bb0 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
15bc0 55 4c 4c 20 29 20 69 73 45 71 20 3d 20 31 3b 0a  ULL ) isEq = 1;.
15bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
15be0 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
15bf0 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70 65  TE_TEXT || eType
15c00 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b  ==SQLITE_BLOB );
15c10 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15c20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69  pIdx->nSample; i
15c30 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
15c40 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
15c50 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20  =SQLITE_TEXT || 
15c60 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
15c70 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b  ==SQLITE_BLOB ){
15c80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15c90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15ca0 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 53    if( i<pIdx->nS
15cb0 61 6d 70 6c 65 20 29 7b 20 20 20 20 20 20 0a 20  ample ){      . 
15cc0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
15cd0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
15ce0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
15cf0 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  oll;.      const
15d00 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69 66   u8 *z;.      if
15d10 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
15d20 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
15d30 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29  z = (const u8 *)
15d40 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
15d50 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  ob(pVal);.      
15d60 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    pColl = db->pD
15d70 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
15d80 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 2d 3e   assert( pColl->
15d90 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
15da0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
15db0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
15dc0 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
15dd0 65 71 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  eq(pParse, SQLIT
15de0 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64 78  E_UTF8, 0, *pIdx
15df0 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  ->azColl);.     
15e00 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
15e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
15e20 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
15e30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15e40 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75      z = (const u
15e50 38 20 2a 29 73 71 6c 69 74 65 33 56 61 6c 75 65  8 *)sqlite3Value
15e60 54 65 78 74 28 70 56 61 6c 2c 20 70 43 6f 6c 6c  Text(pVal, pColl
15e70 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  ->enc);.        
15e80 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20  if( !z ){.      
15e90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15ea0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
15eb0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
15ec0 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c 20 26 26  t( z && pColl &&
15ed0 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a   pColl->xCmp );.
15ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 20        }.      n 
15ef0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 42 79  = sqlite3ValueBy
15f00 74 65 73 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d  tes(pVal, pColl-
15f10 3e 65 6e 63 29 3b 0a 20 20 0a 20 20 20 20 20 20  >enc);.  .      
15f20 66 6f 72 28 3b 20 69 3c 70 49 64 78 2d 3e 6e 53  for(; i<pIdx->nS
15f30 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ample; i++){.   
15f40 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20       int c;.    
15f50 20 20 20 20 69 6e 74 20 65 53 61 6d 70 6c 65 74      int eSamplet
15f60 79 70 65 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  ype = aSample[i]
15f70 2e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .eType;.        
15f80 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65 3c  if( eSampletype<
15f90 65 54 79 70 65 20 29 20 63 6f 6e 74 69 6e 75 65  eType ) continue
15fa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 53  ;.        if( eS
15fb0 61 6d 70 6c 65 74 79 70 65 21 3d 65 54 79 70 65  ampletype!=eType
15fc0 20 29 20 62 72 65 61 6b 3b 0a 23 69 66 6e 64 65   ) break;.#ifnde
15fd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
15fe0 46 31 36 0a 20 20 20 20 20 20 20 20 69 66 28 20  F16.        if( 
15ff0 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49  pColl->enc!=SQLI
16000 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 20  TE_UTF8 ){.     
16010 20 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65       int nSample
16020 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
16030 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69   *zSample = sqli
16040 74 65 33 55 74 66 38 74 6f 31 36 28 0a 20 20 20  te3Utf8to16(.   
16050 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 70             db, p
16060 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d 70  Coll->enc, aSamp
16070 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70  le[i].u.z, aSamp
16080 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 26 6e 53  le[i].nByte, &nS
16090 61 6d 70 6c 65 0a 20 20 20 20 20 20 20 20 20 20  ample.          
160a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
160b0 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20   !zSample ){.   
160c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
160d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
160e0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  d );.           
160f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16100 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
16110 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
16120 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
16130 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61 6d 70 6c  l->pUser, nSampl
16140 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a  e, zSample, n, z
16150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
16160 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
16170 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 20 20 20  Sample);.       
16180 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
16190 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
161a0 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d    c = pColl->xCm
161b0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
161c0 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65  aSample[i].nByte
161d0 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a  , aSample[i].u.z
161e0 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  , n, z);.       
161f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
16200 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
16210 20 69 66 28 20 63 3d 3d 30 20 29 20 69 73 45 71   if( c==0 ) isEq
16220 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
16230 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
16240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16250 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
16260 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b   point, aSample[
16270 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20  i] is the first 
16280 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
16290 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a  reater than.  **
162a0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61   or equal to pVa
162b0 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64  l.  Or if i==pId
162c0 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e  x->nSample, then
162d0 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65   all samples are
162e0 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
162f0 70 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c  pVal.  If aSampl
16300 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e  e[i]==pVal, then
16310 20 69 73 45 71 3d 3d 31 2e 0a 20 20 2a 2f 0a 20   isEq==1..  */. 
16320 20 69 66 28 20 69 73 45 71 20 29 7b 0a 20 20 20   if( isEq ){.   
16330 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d   assert( i<pIdx-
16340 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20  >nSample );.    
16350 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70  aStat[0] = aSamp
16360 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 61  le[i].nLt;.    a
16370 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c  Stat[1] = aSampl
16380 65 5b 69 5d 2e 6e 45 71 3b 0a 20 20 7d 65 6c 73  e[i].nEq;.  }els
16390 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  e{.    tRowcnt i
163a0 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69  Lower, iUpper, i
163b0 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  Gap;.    if( i==
163c0 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
163d0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
163e0 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d  per = aSample[0]
163f0 2e 6e 4c 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  .nLt;.    }else{
16400 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20  .      iUpper = 
16410 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i>=pIdx->nSample
16420 20 3f 20 6e 20 3a 20 61 53 61 6d 70 6c 65 5b 69   ? n : aSample[i
16430 5d 2e 6e 4c 74 3b 0a 20 20 20 20 20 20 69 4c 6f  ].nLt;.      iLo
16440 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d  wer = aSample[i-
16450 31 5d 2e 6e 45 71 20 2b 20 61 53 61 6d 70 6c 65  1].nEq + aSample
16460 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d  [i-1].nLt;.    }
16470 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
16480 70 49 64 78 2d 3e 61 76 67 45 71 3b 0a 20 20 20  pIdx->avgEq;.   
16490 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70   if( iLower>=iUp
164a0 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61  per ){.      iGa
164b0 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 0;.    }else
164c0 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
164d0 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a  Upper - iLower;.
164e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f      }.    if( ro
164f0 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69  undUp ){.      i
16500 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33  Gap = (iGap*2)/3
16510 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16520 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33     iGap = iGap/3
16530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61  ;.    }.    aSta
16540 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20  t[0] = iLower + 
16550 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  iGap;.  }.  retu
16560 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16570 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16580 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f  _ENABLE_STAT3 */
16590 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
165a0 73 73 69 6f 6e 20 70 45 78 70 72 20 72 65 70 72  ssion pExpr repr
165b0 65 73 65 6e 74 73 20 61 20 6c 69 74 65 72 61 6c  esents a literal
165c0 20 76 61 6c 75 65 2c 20 73 65 74 20 2a 70 70 20   value, set *pp 
165d0 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61  to point to.** a
165e0 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
165f0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
16600 6e 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61  ning the same va
16610 6c 75 65 2c 20 77 69 74 68 20 61 66 66 69 6e 69  lue, with affini
16620 74 79 0a 2a 2a 20 61 66 66 20 61 70 70 6c 69 65  ty.** aff applie
16630 64 20 74 6f 20 69 74 2c 20 62 65 66 6f 72 65 20  d to it, before 
16640 72 65 74 75 72 6e 69 6e 67 2e 20 49 74 20 69 73  returning. It is
16650 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
16660 69 74 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63  ity of the .** c
16670 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
16680 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 69 73  lly release this
16690 20 73 74 72 75 63 74 75 72 65 20 62 79 20 70 61   structure by pa
166a0 73 73 69 6e 67 20 69 74 20 74 6f 20 0a 2a 2a 20  ssing it to .** 
166b0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
166c0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
166d0 20 63 75 72 72 65 6e 74 20 70 61 72 73 65 20 69   current parse i
166e0 73 20 61 20 72 65 63 6f 6d 70 69 6c 65 20 28 73  s a recompile (s
166f0 71 6c 69 74 65 33 52 65 70 72 65 70 61 72 65 28  qlite3Reprepare(
16700 29 29 20 61 6e 64 20 70 45 78 70 72 0a 2a 2a 20  )) and pExpr.** 
16710 69 73 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62  is an SQL variab
16720 6c 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  le that currentl
16730 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  y has a non-NULL
16740 20 76 61 6c 75 65 20 62 6f 75 6e 64 20 74 6f 20   value bound to 
16750 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65 20 61 6e  it,.** create an
16760 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
16770 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
16780 69 6e 67 20 74 68 69 73 20 76 61 6c 75 65 2c 20  ing this value, 
16790 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a 20 61 66  again with.** af
167a0 66 69 6e 69 74 79 20 61 66 66 20 61 70 70 6c 69  finity aff appli
167b0 65 64 20 74 6f 20 69 74 2c 20 69 6e 73 74 65 61  ed to it, instea
167c0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74  d..**.** If neit
167d0 68 65 72 20 6f 66 20 74 68 65 20 61 62 6f 76 65  her of the above
167e0 20 61 70 70 6c 79 2c 20 73 65 74 20 2a 70 70 20   apply, set *pp 
167f0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  to NULL..**.** I
16800 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
16810 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
16820 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
16830 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
16840 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
16850 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 73 74 61  ENABLE_STAT3.sta
16860 74 69 63 20 69 6e 74 20 76 61 6c 75 65 46 72 6f  tic int valueFro
16870 6d 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  mExpr(.  Parse *
16880 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20  pParse, .  Expr 
16890 2a 70 45 78 70 72 2c 20 0a 20 20 75 38 20 61 66  *pExpr, .  u8 af
168a0 66 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  f, .  sqlite3_va
168b0 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20 20 69 66  lue **pp.){.  if
168c0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
168d0 56 41 52 49 41 42 4c 45 0a 20 20 20 7c 7c 20 28  VARIABLE.   || (
168e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
168f0 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d  GISTER && pExpr-
16900 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  >op2==TK_VARIABL
16910 45 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  E).  ){.    int 
16920 69 56 61 72 20 3d 20 70 45 78 70 72 2d 3e 69 43  iVar = pExpr->iC
16930 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74  olumn;.    sqlit
16940 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
16950 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
16960 69 56 61 72 29 3b 0a 20 20 20 20 2a 70 70 20 3d  iVar);.    *pp =
16970 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 56   sqlite3VdbeGetV
16980 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65  alue(pParse->pRe
16990 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20 61  prepare, iVar, a
169a0 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ff);.    return 
169b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
169c0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
169d0 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
169e0 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
169f0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61 66 66  SQLITE_UTF8, aff
16a00 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  , pp);.}.#endif.
16a10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
16a20 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
16a30 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
16a40 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
16a50 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64   will be visited
16a60 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  .** by scanning 
16a70 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72  an index for a r
16a80 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20  ange of values. 
16a90 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61  The range may ha
16aa0 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62  ve an upper.** b
16ab0 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f  ound, a lower bo
16ac0 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68  und, or both. Th
16ad0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
16ae0 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68  erms that set th
16af0 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c  e upper.** and l
16b00 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20  ower bounds are 
16b10 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70  represented by p
16b20 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
16b30 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46   respectively. F
16b40 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61  or.** example, a
16b50 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64  ssuming that ind
16b60 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29  ex p is on t1(a)
16b70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
16b80 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
16b90 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
16ba0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16bb0 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20        |_____|   
16bc0 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20  |_____|.**      
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16be0 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20   |         |.** 
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55      pLower    pU
16c10 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69  pper.**.** If ei
16c20 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65  ther of the uppe
16c30 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64  r or lower bound
16c40 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
16c50 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61   then NULL is pa
16c60 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65  ssed in.** place
16c70 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
16c80 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e  nding WhereTerm.
16c90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20 70  .**.** The nEq p
16ca0 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
16cb0 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ed the index of 
16cc0 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
16cd0 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 0a   subject to the.
16ce0 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ** range constra
16cf0 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c  int. Or, equival
16d00 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65  ently, the numbe
16d10 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f  r of equality co
16d20 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70 74  nstraints.** opt
16d30 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72  imized by the pr
16d40 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61  oposed index sca
16d50 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n. For example, 
16d60 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
16d70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c 20   is.** on t1(a, 
16d80 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20  b), and the SQL 
16d90 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
16da0 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
16db0 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20  ERE a = ? AND b 
16dc0 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e  > ? AND b < ? ..
16dd0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
16de0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
16df0 64 20 74 68 65 20 76 61 6c 75 65 20 31 20 28 61  d the value 1 (a
16e00 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74  s the range rest
16e10 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a  ricted column,.*
16e20 2a 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f  * b, is the seco
16e30 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  nd left-most col
16e40 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
16e50 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75  ). Or, if the qu
16e60 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
16e70 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
16e80 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
16e90 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
16ea0 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70   nEq should be p
16eb0 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54  assed 0..**.** T
16ec0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
16ed0 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  e is an integer 
16ee0 64 69 76 69 73 6f 72 20 74 6f 20 72 65 64 75 63  divisor to reduc
16ef0 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 0a  e the estimated.
16f00 2a 2a 20 73 65 61 72 63 68 20 73 70 61 63 65 2e  ** search space.
16f10 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65    A return value
16f20 20 6f 66 20 31 20 6d 65 61 6e 73 20 74 68 61 74   of 1 means that
16f30 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
16f40 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20 68 65 6c  ts are.** no hel
16f50 70 20 61 74 20 61 6c 6c 2e 20 20 41 20 72 65 74  p at all.  A ret
16f60 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 20 6d  urn value of 2 m
16f70 65 61 6e 73 20 72 61 6e 67 65 20 63 6f 6e 73 74  eans range const
16f80 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 65 78  raints are.** ex
16f90 70 65 63 74 65 64 20 74 6f 20 72 65 64 75 63 65  pected to reduce
16fa0 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
16fb0 65 20 62 79 20 68 61 6c 66 2e 20 20 41 6e 64 20  e by half.  And 
16fc0 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a  so forth....**.*
16fd0 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65  * In the absence
16fe0 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33   of sqlite_stat3
16ff0 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 65   ANALYZE data, e
17000 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61  ach range inequa
17010 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73 20  lity.** reduces 
17020 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
17030 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
17040 34 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e 67  4.  Hence a sing
17050 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78  le constraint (x
17060 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  >?).** results i
17070 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 34 20  n a return of 4 
17080 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f 6e 73  and a range cons
17090 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e 44 20  traint (x>? AND 
170a0 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a 2a 20  x<?) results.** 
170b0 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 31  in a return of 1
170c0 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  6..*/.static int
170d0 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
170e0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
170f0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
17100 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
17110 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
17120 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
17130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17140 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 69 6e   index containin
17150 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70  g the range-comp
17160 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22 78 22  ared column; "x"
17170 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20   */.  int nEq,  
17180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
17190 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c  dex into p->aCol
171a0 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2d  [] of the range-
171b0 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 20  compared column 
171c0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
171d0 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
171e0 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
171f0 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
17200 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
17210 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
17220 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
17230 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
17240 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
17250 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
17260 4c 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70  L */.  double *p
17270 52 61 6e 67 65 44 69 76 20 20 20 2f 2a 20 4f 55  RangeDiv   /* OU
17280 54 3a 20 52 65 64 75 63 65 20 73 65 61 72 63 68  T: Reduce search
17290 20 73 70 61 63 65 20 62 79 20 74 68 69 73 20 64   space by this d
172a0 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  ivisor */.){.  i
172b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
172c0 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  K;..#ifdef SQLIT
172d0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 0a  E_ENABLE_STAT3..
172e0 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
172f0 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20  p->nSample ){.  
17300 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
17310 2a 70 52 61 6e 67 65 56 61 6c 3b 0a 20 20 20 20  *pRangeVal;.    
17320 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d  tRowcnt iLower =
17330 20 30 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   0;.    tRowcnt 
17340 69 55 70 70 65 72 20 3d 20 70 2d 3e 61 69 52 6f  iUpper = p->aiRo
17350 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 74 52 6f  wEst[0];.    tRo
17360 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 75  wcnt a[2];.    u
17370 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c  8 aff = p->pTabl
17380 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
17390 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79  umn[0]].affinity
173a0 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 77 65  ;..    if( pLowe
173b0 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  r ){.      Expr 
173c0 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d  *pExpr = pLower-
173d0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
173e0 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65        rc = value
173f0 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
17400 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52   pExpr, aff, &pR
17410 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 20 20  angeVal);.      
17420 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 2d 3e  assert( pLower->
17430 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54  eOperator==WO_GT
17440 20 7c 7c 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65   || pLower->eOpe
17450 72 61 74 6f 72 3d 3d 57 4f 5f 47 45 20 29 3b 0a  rator==WO_GE );.
17460 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17470 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26  LITE_OK.       &
17480 26 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  & whereKeyStats(
17490 70 50 61 72 73 65 2c 20 70 2c 20 70 52 61 6e 67  pParse, p, pRang
174a0 65 56 61 6c 2c 20 30 2c 20 61 29 3d 3d 53 51 4c  eVal, 0, a)==SQL
174b0 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a  ITE_OK.      ){.
174c0 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
174d0 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69   a[0];.        i
174e0 66 28 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72  f( pLower->eOper
174f0 61 74 6f 72 3d 3d 57 4f 5f 47 54 20 29 20 69 4c  ator==WO_GT ) iL
17500 6f 77 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20  ower += a[1];.  
17510 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
17520 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61  te3ValueFree(pRa
17530 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ngeVal);.    }. 
17540 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17550 45 5f 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29  E_OK && pUpper )
17560 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
17570 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
17580 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
17590 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f     rc = valueFro
175a0 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  mExpr(pParse, pE
175b0 78 70 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67  xpr, aff, &pRang
175c0 65 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  eVal);.      ass
175d0 65 72 74 28 20 70 55 70 70 65 72 2d 3e 65 4f 70  ert( pUpper->eOp
175e0 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 7c 7c  erator==WO_LT ||
175f0 20 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74   pUpper->eOperat
17600 6f 72 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  or==WO_LE );.   
17610 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17620 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77  E_OK.       && w
17630 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
17640 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61  rse, p, pRangeVa
17650 6c 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45  l, 1, a)==SQLITE
17660 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  _OK.      ){.   
17670 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b       iUpper = a[
17680 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
17690 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
176a0 72 3d 3d 57 4f 5f 4c 45 20 29 20 69 55 70 70 65  r==WO_LE ) iUppe
176b0 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20  r += a[1];.     
176c0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
176d0 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65  ValueFree(pRange
176e0 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
176f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17700 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
17710 55 70 70 65 72 3c 3d 69 4c 6f 77 65 72 20 29 7b  Upper<=iLower ){
17720 0a 20 20 20 20 20 20 20 20 2a 70 52 61 6e 67 65  .        *pRange
17730 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d  Div = (double)p-
17740 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
17750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17760 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20     *pRangeDiv = 
17770 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52 6f 77  (double)p->aiRow
17780 45 73 74 5b 30 5d 2f 28 64 6f 75 62 6c 65 29 28  Est[0]/(double)(
17790 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29  iUpper - iLower)
177a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
177b0 57 48 45 52 45 54 52 41 43 45 28 28 22 72 61 6e  WHERETRACE(("ran
177c0 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ge scan regions:
177d0 20 25 75 2e 2e 25 75 20 20 64 69 76 3d 25 67 5c   %u..%u  div=%g\
177e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
177f0 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65        (u32)iLowe
17800 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20  r, (u32)iUpper, 
17810 2a 70 52 61 6e 67 65 44 69 76 29 29 3b 0a 20 20  *pRangeDiv));.  
17820 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17830 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
17840 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
17850 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
17860 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
17870 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45  ETER(p);.  UNUSE
17880 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 45 71 29  D_PARAMETER(nEq)
17890 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
178a0 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
178b0 70 65 72 20 29 3b 0a 20 20 2a 70 52 61 6e 67 65  per );.  *pRange
178c0 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  Div = (double)1;
178d0 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26  .  if( pLower &&
178e0 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67   (pLower->wtFlag
178f0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
17900 3d 30 20 29 20 2a 70 52 61 6e 67 65 44 69 76 20  =0 ) *pRangeDiv 
17910 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b 0a 20 20  *= (double)4;.  
17920 69 66 28 20 70 55 70 70 65 72 20 29 20 2a 70 52  if( pUpper ) *pR
17930 61 6e 67 65 44 69 76 20 2a 3d 20 28 64 6f 75 62  angeDiv *= (doub
17940 6c 65 29 34 3b 0a 20 20 72 65 74 75 72 6e 20 72  le)4;.  return r
17950 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
17960 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
17970 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
17980 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
17990 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
179a0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
179b0 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
179c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
179d0 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
179e0 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
179f0 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
17a00 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
17a10 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
17a20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
17a30 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
17a40 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
17a50 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
17a60 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
17a70 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
17a80 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
17a90 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
17aa0 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
17ab0 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
17ac0 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
17ad0 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
17ae0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
17af0 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
17b00 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
17b10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17b20 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
17b30 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
17b40 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
17b50 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
17b60 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
17b70 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
17b80 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
17b90 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
17ba0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
17bb0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
17bc0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
17bd0 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
17be0 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
17bf0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
17c00 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
17c10 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
17c20 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
17c30 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
17c40 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
17c50 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
17c60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17c70 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
17c80 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
17c90 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
17ca0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
17cb0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
17cc0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
17cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17ce0 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
17cf0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
17d00 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
17d10 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
17d20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
17d30 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
17d40 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
17d50 6e 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a  nt */.  double *
17d60 70 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20  pnRow        /* 
17d70 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
17d80 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
17d90 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
17da0 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20  te3_value *pRhs 
17db0 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f  = 0;  /* VALUE o
17dc0 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
17dd0 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20  e of pTerm */.  
17de0 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
17df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
17e00 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
17e10 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
17e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17e30 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
17e40 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
17e50 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
17e60 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
17e70 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ics */..  assert
17e80 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
17e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
17ea0 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
17eb0 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
17ec0 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
17ed0 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  [0]].affinity;. 
17ee0 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
17ef0 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
17f00 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
17f10 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73 29 3b  pr, aff, &pRhs);
17f20 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
17f30 74 6f 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  to whereEqualSca
17f40 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d  nEst_cancel;.  }
17f50 65 6c 73 65 7b 0a 20 20 20 20 70 52 68 73 20 3d  else{.    pRhs =
17f60 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
17f70 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
17f80 7d 0a 20 20 69 66 28 20 70 52 68 73 3d 3d 30 20  }.  if( pRhs==0 
17f90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
17fa0 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72 63 20 3d  NOTFOUND;.  rc =
17fb0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
17fc0 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c 20  Parse, p, pRhs, 
17fd0 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, a);.  if( rc=
17fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17ff0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 65    WHERETRACE(("e
18000 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
18010 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e  ions: %d\n", (in
18020 74 29 61 5b 31 5d 29 29 3b 0a 20 20 20 20 2a 70  t)a[1]));.    *p
18030 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 7d  nRow = a[1];.  }
18040 0a 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45  .whereEqualScanE
18050 73 74 5f 63 61 6e 63 65 6c 3a 0a 20 20 73 71 6c  st_cancel:.  sql
18060 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52  ite3ValueFree(pR
18070 68 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  hs);.  return rc
18080 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ;.}.#endif /* de
18090 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
180a0 42 4c 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 23  BLE_STAT3) */..#
180b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
180c0 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20  BLE_STAT3./*.** 
180d0 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
180e0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
180f0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
18100 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
18110 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77   IN constraint w
18120 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68  here the right-h
18130 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
18140 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  IN operator.** i
18150 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  s a list of valu
18160 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  es.  Example:.**
18170 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45  .**        WHERE
18180 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a   x IN (1,2,3,4).
18190 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
181a0 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
181b0 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
181c0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
181d0 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
181e0 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
181f0 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
18200 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
18210 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
18220 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
18230 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
18240 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
18250 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
18260 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18270 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
18280 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
18290 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
182a0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
182b0 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
182c0 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
182d0 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
182e0 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
182f0 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
18300 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
18310 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
18320 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45  int whereInScanE
18330 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
18340 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
18350 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
18360 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
18370 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
18380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18390 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
183a0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
183b0 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
183c0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
183d0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69   /* The value li
183e0 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  st on the RHS of
183f0 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33   "x IN (v1,v2,v3
18400 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 64 6f 75 62  ,...)" */.  doub
18410 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  le *pnRow       
18420 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
18430 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
18440 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
18450 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18460 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  OK;         /* S
18470 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
18480 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 64 6f 75 62  n code */.  doub
18490 6c 65 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20  le nEst;        
184a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
184b0 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
184c0 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
184d0 20 64 6f 75 62 6c 65 20 6e 52 6f 77 45 73 74 20   double nRowEst 
184e0 3d 20 28 64 6f 75 62 6c 65 29 30 3b 20 2f 2a 20  = (double)0; /* 
184f0 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20  New estimate of 
18500 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
18510 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ws */.  int i;  
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
18540 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
18550 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
18560 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  );.  for(i=0; rc
18570 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
18580 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
18590 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20  ++){.    nEst = 
185a0 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  p->aiRowEst[0];.
185b0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71      rc = whereEq
185c0 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
185d0 65 2c 20 70 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  e, p, pList->a[i
185e0 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b  ].pExpr, &nEst);
185f0 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20  .    nRowEst += 
18600 6e 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nEst;.  }.  if( 
18610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18620 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74  .    if( nRowEst
18630 20 3e 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30   > p->aiRowEst[0
18640 5d 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d  ] ) nRowEst = p-
18650 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
18660 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45    *pnRow = nRowE
18670 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  st;.    WHERETRA
18680 43 45 28 28 22 49 4e 20 72 6f 77 20 65 73 74 69  CE(("IN row esti
18690 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c  mate: est=%g\n",
186a0 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a   nRowEst));.  }.
186b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
186c0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
186d0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
186e0 54 41 54 33 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TAT3) */../*.** 
186f0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
18700 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 74  column iCol of t
18710 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
18720 72 73 6f 72 20 69 54 61 62 20 77 69 6c 6c 20 61  rsor iTab will a
18730 70 70 65 61 72 0a 2a 2a 20 69 6e 20 73 6f 72 74  ppear.** in sort
18740 65 64 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69  ed order accordi
18750 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
18760 74 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2a  t query plan..**
18770 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  .** Return value
18780 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 20 20 20  s:.**.**    0   
18790 69 43 6f 6c 20 69 73 20 6e 6f 74 20 6f 72 64 65  iCol is not orde
187a0 72 65 64 0a 2a 2a 20 20 20 20 31 20 20 20 69 43  red.**    1   iC
187b0 6f 6c 20 68 61 73 20 6f 6e 6c 79 20 61 20 73 69  ol has only a si
187c0 6e 67 6c 65 20 76 61 6c 75 65 0a 2a 2a 20 20 20  ngle value.**   
187d0 20 32 20 20 20 69 43 6f 6c 20 69 73 20 69 6e 20   2   iCol is in 
187e0 41 53 43 20 6f 72 64 65 72 0a 2a 2a 20 20 20 20  ASC order.**    
187f0 33 20 20 20 69 43 6f 6c 20 69 73 20 69 6e 20 44  3   iCol is in D
18800 45 53 43 20 6f 72 64 65 72 0a 2a 2f 0a 73 74 61  ESC order.*/.sta
18810 74 69 63 20 69 6e 74 20 69 73 4f 72 64 65 72 65  tic int isOrdere
18820 64 43 6f 6c 75 6d 6e 28 0a 20 20 57 68 65 72 65  dColumn(.  Where
18830 42 65 73 74 49 64 78 20 2a 70 2c 0a 20 20 69 6e  BestIdx *p,.  in
18840 74 20 69 54 61 62 2c 0a 20 20 69 6e 74 20 69 43  t iTab,.  int iC
18850 6f 6c 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  ol.){.  int i, j
18860 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  ;.  WhereLevel *
18870 70 4c 65 76 65 6c 20 3d 20 26 70 2d 3e 61 4c 65  pLevel = &p->aLe
18880 76 65 6c 5b 70 2d 3e 69 2d 31 5d 3b 0a 20 20 49  vel[p->i-1];.  I
18890 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 75 38  ndex *pIdx;.  u8
188a0 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 66 6f   sortOrder;.  fo
188b0 72 28 69 3d 70 2d 3e 69 2d 31 3b 20 69 3e 3d 30  r(i=p->i-1; i>=0
188c0 3b 20 69 2d 2d 2c 20 70 4c 65 76 65 6c 2d 2d 29  ; i--, pLevel--)
188d0 7b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  {.    if( pLevel
188e0 2d 3e 69 54 61 62 43 75 72 21 3d 69 54 61 62 20  ->iTabCur!=iTab 
188f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
18900 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
18910 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
18920 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29 21 3d 30  E_ALL_UNIQUE)!=0
18930 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18940 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   1;.    }.    as
18950 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70  sert( (pLevel->p
18960 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
18970 45 52 45 5f 4f 52 44 45 52 45 44 29 21 3d 30 20  ERE_ORDERED)!=0 
18980 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49 64 78  );.    if( (pIdx
18990 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
189a0 75 2e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20  u.pIdx)!=0 ){.  
189b0 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
189c0 7b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 72  {.        sortOr
189d0 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  der = 0;.       
189e0 20 74 65 73 74 63 61 73 65 28 20 28 70 4c 65 76   testcase( (pLev
189f0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
18a00 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   & WHERE_REVERSE
18a10 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 65  )!=0 );.      }e
18a20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
18a30 20 6e 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   n = pIdx->nColu
18a40 6d 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  mn;.        for(
18a50 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a  j=0; j<n; j++){.
18a60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
18a70 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ol==pIdx->aiColu
18a80 6d 6e 5b 6a 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[j] ) break;. 
18a90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18aa0 20 69 66 28 20 6a 3e 3d 6e 20 29 20 72 65 74 75   if( j>=n ) retu
18ab0 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 73 6f  rn 0;.        so
18ac0 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e  rtOrder = pIdx->
18ad0 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
18ae0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
18af0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
18b00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
18b10 45 56 45 52 53 45 29 21 3d 30 20 29 3b 0a 20 20  EVERSE)!=0 );.  
18b20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
18b30 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 21  .      if( iCol!
18b40 3d 28 2d 31 29 20 29 20 72 65 74 75 72 6e 20 30  =(-1) ) return 0
18b50 3b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65  ;.      sortOrde
18b60 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 74 65 73  r = 0;.      tes
18b70 74 63 61 73 65 28 20 28 70 4c 65 76 65 6c 2d 3e  tcase( (pLevel->
18b80 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
18b90 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
18ba0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
18bb0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
18bc0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
18bd0 52 45 56 45 52 53 45 29 21 3d 30 20 29 7b 0a 20  REVERSE)!=0 ){. 
18be0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 6f 72       assert( sor
18bf0 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 73 6f 72  tOrder==0 || sor
18c00 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20  tOrder==1 );.   
18c10 20 20 20 74 65 73 74 63 61 73 65 28 20 73 6f 72     testcase( sor
18c20 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20  tOrder==1 );.   
18c30 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 31     sortOrder = 1
18c40 20 2d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20   - sortOrder;.  
18c50 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73    }.    return s
18c60 6f 72 74 4f 72 64 65 72 2b 32 3b 0a 20 20 7d 0a  ortOrder+2;.  }.
18c70 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
18c80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18c90 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49 64  e decides if pId
18ca0 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
18cb0 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
18cc0 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2c  ER BY.** clause,
18cd0 20 65 69 74 68 65 72 20 69 6e 20 77 68 6f 6c 65   either in whole
18ce0 20 6f 72 20 69 6e 20 70 61 72 74 2e 20 20 54 68   or in part.  Th
18cf0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
18d00 73 20 74 68 65 20 0a 2a 2a 20 63 75 6d 75 6c 61  s the .** cumula
18d10 74 69 76 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  tive number of t
18d20 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
18d30 52 20 42 59 20 63 6c 61 75 73 65 20 74 68 61 74  R BY clause that
18d40 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
18d50 2a 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 70  * by the index p
18d60 49 64 78 20 61 6e 64 20 6f 74 68 65 72 20 69 6e  Idx and other in
18d70 64 69 63 65 73 20 69 6e 20 6f 75 74 65 72 20 6c  dices in outer l
18d80 6f 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oops..**.** The 
18d90 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  table being quer
18da0 69 65 64 20 68 61 73 20 61 20 63 75 72 73 6f 72  ied has a cursor
18db0 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65   number of "base
18dc0 22 2e 20 20 70 49 64 78 20 69 73 20 74 68 65 0a  ".  pIdx is the.
18dd0 2a 2a 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  ** index that is
18de0 20 70 6f 73 74 75 6c 61 74 65 64 20 66 6f 72 20   postulated for 
18df0 75 73 65 20 74 6f 20 61 63 63 65 73 73 20 74 68  use to access th
18e00 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
18e10 68 65 20 2a 70 62 52 65 76 20 76 61 6c 75 65 20  he *pbRev value 
18e20 69 73 20 73 65 74 20 74 6f 20 30 20 6f 72 64 65  is set to 0 orde
18e30 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 1 depending on
18e40 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
18e50 2a 2a 20 70 49 64 78 20 73 68 6f 75 6c 64 20 62  ** pIdx should b
18e60 65 20 72 75 6e 20 69 6e 20 74 68 65 20 66 6f 72  e run in the for
18e70 77 61 72 64 20 6f 72 64 65 72 20 6f 72 20 69 6e  ward order or in
18e80 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e 0a   reverse order..
18e90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
18ea0 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20  SortingIndex(.  
18eb0 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 2c  WhereBestIdx *p,
18ec0 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65      /* Best inde
18ed0 78 20 73 65 61 72 63 68 20 63 6f 6e 74 65 78 74  x search context
18ee0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
18ef0 78 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x,        /* The
18f00 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74 65   index we are te
18f10 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  sting */.  int b
18f20 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ase,           /
18f30 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
18f40 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 6f  for the table to
18f50 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20   be sorted */.  
18f60 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
18f70 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
18f80 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65  for reverse-orde
18f90 72 20 73 63 61 6e 20 6f 66 20 70 49 64 78 20 2a  r scan of pIdx *
18fa0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18fd0 66 20 70 49 64 78 20 74 65 72 6d 73 20 75 73 65  f pIdx terms use
18fe0 64 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  d */.  int j;   
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19010 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
19020 20 73 61 74 69 73 66 69 65 64 20 2a 2f 0a 20 20   satisfied */.  
19030 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20  int sortOrder = 
19040 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
19050 20 30 3a 20 66 6f 72 77 61 72 64 2e 20 20 31 3a   0: forward.  1:
19060 20 62 61 63 6b 77 61 72 64 2e 20 20 32 3a 20 75   backward.  2: u
19070 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 69 6e 74 20  nknown */.  int 
19080 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
19090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
190a0 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
190b0 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  terms */.  struc
190c0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
190d0 2a 70 4f 42 49 74 65 6d 3b 2f 2a 20 41 20 74 65  *pOBItem;/* A te
190e0 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
190f0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  BY clause */.  T
19100 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64  able *pTab = pId
19110 78 2d 3e 70 54 61 62 6c 65 3b 20 20 20 2f 2a 20  x->pTable;   /* 
19120 54 61 62 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  Table that owns 
19130 69 6e 64 65 78 20 70 49 64 78 20 2a 2f 0a 20 20  index pIdx */.  
19140 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
19150 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  By;           /*
19160 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
19170 61 75 73 65 20 2a 2f 0a 20 20 50 61 72 73 65 20  ause */.  Parse 
19180 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
19190 72 73 65 3b 20 20 20 20 2f 2a 20 50 61 72 73 65  rse;    /* Parse
191a0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  r context */.  s
191b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
191c0 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20  rse->db;     /* 
191d0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
191e0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ion */.  int nPr
191f0 69 6f 72 53 61 74 3b 20 20 20 20 20 20 20 20 20  iorSat;         
19200 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
19210 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
19220 65 64 20 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70  ed by outer loop
19230 73 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 52  s */.  int seenR
19240 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
19250 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
19260 61 6e 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  an ORDER BY rowi
19270 64 20 74 65 72 6d 20 69 73 20 73 65 65 6e 20 2a  d term is seen *
19280 2f 0a 20 20 69 6e 74 20 75 6e 69 71 75 65 4e 6f  /.  int uniqueNo
19290 74 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  tNull;          
192a0 20 20 2f 2a 20 70 49 64 78 20 69 73 20 55 4e 49    /* pIdx is UNI
192b0 51 55 45 20 77 69 74 68 20 61 6c 6c 20 74 65 72  QUE with all ter
192c0 6d 73 20 61 72 65 20 4e 4f 54 20 4e 55 4c 4c 20  ms are NOT NULL 
192d0 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 69 3d 3d  */..  if( p->i==
192e0 30 20 29 7b 0a 20 20 20 20 6e 50 72 69 6f 72 53  0 ){.    nPriorS
192f0 61 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  at = 0;.  }else{
19300 0a 20 20 20 20 6e 50 72 69 6f 72 53 61 74 20 3d  .    nPriorSat =
19310 20 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d   p->aLevel[p->i-
19320 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a  1].plan.nOBSat;.
19330 20 20 20 20 69 66 28 20 28 70 2d 3e 61 4c 65 76      if( (p->aLev
19340 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e  el[p->i-1].plan.
19350 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
19360 4f 52 44 45 52 45 44 29 3d 3d 30 20 29 7b 0a 20  ORDERED)==0 ){. 
19370 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f       /* This loo
19380 70 20 63 61 6e 6e 6f 74 20 62 65 20 6f 72 64 65  p cannot be orde
19390 72 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 6e  red unless the n
193a0 65 78 74 20 6f 75 74 65 72 20 6c 6f 6f 70 20 69  ext outer loop i
193b0 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20  s.      ** also 
193c0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
193d0 20 72 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61   return nPriorSa
193e0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
193f0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
19400 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
19410 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29  _OrderByIdxJoin)
19420 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c   ){.      /* Onl
19430 79 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 6f 75  y look at the ou
19440 74 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 20 69 66  ter-most loop if
19450 20 74 68 65 20 4f 72 64 65 72 42 79 49 64 78 4a   the OrderByIdxJ
19460 6f 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74  oin.      ** opt
19470 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 64 69 73  imization is dis
19480 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 72  abled */.      r
19490 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b  eturn nPriorSat;
194a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 72  .    }.  }.  pOr
194b0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
194c0 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
194d0 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
194e0 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64  if( pIdx->bUnord
194f0 65 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 48  ered ){.    /* H
19500 61 73 68 20 69 6e 64 69 63 65 73 20 28 69 6e 64  ash indices (ind
19510 69 63 61 74 65 64 20 62 79 20 74 68 65 20 22 75  icated by the "u
19520 6e 6f 72 64 65 72 65 64 22 20 74 61 67 20 6f 6e  nordered" tag on
19530 20 73 71 6c 69 74 65 5f 73 74 61 74 31 29 20 63   sqlite_stat1) c
19540 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20  annot.    ** be 
19550 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  used for sorting
19560 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6e   */.    return n
19570 50 72 69 6f 72 53 61 74 3b 0a 20 20 7d 0a 20 20  PriorSat;.  }.  
19580 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  nTerm = pOrderBy
19590 2d 3e 6e 45 78 70 72 3b 0a 20 20 75 6e 69 71 75  ->nExpr;.  uniqu
195a0 65 4e 6f 74 4e 75 6c 6c 20 3d 20 70 49 64 78 2d  eNotNull = pIdx-
195b0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
195c0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  e;.  assert( nTe
195d0 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 72  rm>0 );..  /* Ar
195e0 67 75 6d 65 6e 74 20 70 49 64 78 20 6d 75 73 74  gument pIdx must
195f0 20 65 69 74 68 65 72 20 70 6f 69 6e 74 20 74 6f   either point to
19600 20 61 20 27 72 65 61 6c 27 20 6e 61 6d 65 64 20   a 'real' named 
19610 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2c  index structure,
19620 20 0a 20 20 2a 2a 20 6f 72 20 61 6e 20 69 6e 64   .  ** or an ind
19630 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c  ex structure all
19640 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74  ocated on the st
19650 61 63 6b 20 62 79 20 62 65 73 74 42 74 72 65 65  ack by bestBtree
19660 49 6e 64 65 78 28 29 20 74 6f 0a 20 20 2a 2a 20  Index() to.  ** 
19670 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
19680 77 69 64 20 69 6e 64 65 78 20 74 68 61 74 20 69  wid index that i
19690 73 20 70 61 72 74 20 6f 66 20 65 76 65 72 79 20  s part of every 
196a0 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  table.  */.  ass
196b0 65 72 74 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ert( pIdx->zName
196c0 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75   || (pIdx->nColu
196d0 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 61  mn==1 && pIdx->a
196e0 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d 31 29 20  iColumn[0]==-1) 
196f0 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74  );..  /* Match t
19700 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
19710 52 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69  R BY clause agai
19720 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  nst columns of. 
19730 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   ** the index.. 
19740 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
19750 61 74 20 69 6e 64 69 63 65 73 20 68 61 76 65 20  at indices have 
19760 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65  pIdx->nColumn re
19770 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c  gular columns pl
19780 75 73 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69  us.  ** one addi
19790 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f  tional column co
197a0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77  ntaining the row
197b0 69 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63  id.  The rowid c
197c0 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68  olumn.  ** of th
197d0 65 20 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20  e index is also 
197e0 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68  allowed to match
197f0 20 61 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44   against the ORD
19800 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73  ER BY.  ** claus
19810 65 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 6e 50  e..  */.  j = nP
19820 72 69 6f 72 53 61 74 3b 0a 20 20 66 6f 72 28 69  riorSat;.  for(i
19830 3d 30 2c 70 4f 42 49 74 65 6d 3d 26 70 4f 72 64  =0,pOBItem=&pOrd
19840 65 72 42 79 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54  erBy->a[j]; j<nT
19850 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d 3e  erm && i<=pIdx->
19860 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
19870 20 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72     Expr *pOBExpr
19880 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
19890 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
198a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 4f 42  the ORDER BY pOB
198b0 49 74 65 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  Item */.    Coll
198c0 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
198d0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
198e0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  ting sequence of
198f0 20 70 4f 42 45 78 70 72 20 2a 2f 0a 20 20 20 20   pOBExpr */.    
19900 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  int termSortOrde
19910 72 3b 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 20  r;      /* Sort 
19920 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 74  order for this t
19930 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  erm */.    int i
19940 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
19950 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
19960 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
19970 65 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77 69  ex.  -1 for rowi
19980 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 6f  d */.    int iSo
19990 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20  rtOrder;        
199a0 20 2f 2a 20 31 20 66 6f 72 20 44 45 53 43 2c 20   /* 1 for DESC, 
199b0 30 20 66 6f 72 20 41 53 43 20 6f 6e 20 74 68 65  0 for ASC on the
199c0 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d   i-th index term
199d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 45 71   */.    int isEq
199e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
199f0 2f 2a 20 53 75 62 6a 65 63 74 20 74 6f 20 61 6e  /* Subject to an
19a00 20 3d 3d 20 6f 72 20 49 53 20 4e 55 4c 4c 20 63   == or IS NULL c
19a10 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
19a20 20 69 6e 74 20 69 73 4d 61 74 63 68 3b 20 20 20   int isMatch;   
19a30 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
19a40 52 20 42 59 20 74 65 72 6d 20 6d 61 74 63 68 65  R BY term matche
19a50 73 20 74 68 65 20 69 6e 64 65 78 20 74 65 72 6d  s the index term
19a60 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
19a70 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
19a80 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
19a90 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
19aa0 72 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72  r i-th index ter
19ab0 6d 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  m */.    WhereTe
19ac0 72 6d 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b  rm *pConstraint;
19ad0 20 2f 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e 74   /* A constraint
19ae0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
19af0 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ause */..    /* 
19b00 49 66 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  If the next term
19b10 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
19b20 20 63 6c 61 75 73 65 20 72 65 66 65 72 73 20 74   clause refers t
19b30 6f 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  o anything other
19b40 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 61 20 63   than.    ** a c
19b50 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 22 62 61  olumn in the "ba
19b60 73 65 22 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  se" table, then 
19b70 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20  this index will 
19b80 6e 6f 74 20 62 65 20 6f 66 20 61 6e 79 0a 20 20  not be of any.  
19b90 20 20 2a 2a 20 66 75 72 74 68 65 72 20 75 73 65    ** further use
19ba0 20 69 6e 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   in handling the
19bb0 20 4f 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20   ORDER BY. */.  
19bc0 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
19bd0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
19be0 74 65 28 70 4f 42 49 74 65 6d 2d 3e 70 45 78 70  te(pOBItem->pExp
19bf0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 42 45  r);.    if( pOBE
19c00 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
19c10 4d 4e 20 7c 7c 20 70 4f 42 45 78 70 72 2d 3e 69  MN || pOBExpr->i
19c20 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20  Table!=base ){. 
19c30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19c40 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 63  }..    /* Find c
19c50 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64  olumn number and
19c60 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
19c70 6e 63 65 20 66 6f 72 20 74 68 65 20 6e 65 78 74  nce for the next
19c80 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 69 6e   entry.    ** in
19c90 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
19ca0 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d    if( pIdx->zNam
19cb0 65 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  e && i<pIdx->nCo
19cc0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43  lumn ){.      iC
19cd0 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
19ce0 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
19cf0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
19d00 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  dx->pTable->iPKe
19d10 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  y ){.        iCo
19d20 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
19d30 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72   }.      iSortOr
19d40 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  der = pIdx->aSor
19d50 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20  tOrder[i];.     
19d60 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61   zColl = pIdx->a
19d70 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
19d80 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30  assert( zColl!=0
19d90 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
19da0 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d       iColumn = -
19db0 31 3b 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72  1;.      iSortOr
19dc0 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  der = 0;.      z
19dd0 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Coll = 0;.    }.
19de0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
19df0 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
19e00 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f  mn number and co
19e10 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
19e20 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 69   of the.    ** i
19e30 6e 64 65 78 20 6d 61 74 63 68 20 74 68 65 20 63  ndex match the c
19e40 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64  olumn number and
19e50 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
19e60 6e 63 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52  nce of the ORDER
19e70 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73   BY.    ** claus
19e80 65 20 65 6e 74 72 79 2e 20 20 53 65 74 20 69 73  e entry.  Set is
19e90 4d 61 74 63 68 20 74 6f 20 31 20 69 66 20 74 68  Match to 1 if th
19ea0 65 79 20 62 6f 74 68 20 6d 61 74 63 68 2e 20 2a  ey both match. *
19eb0 2f 0a 20 20 20 20 69 66 28 20 70 4f 42 45 78 70  /.    if( pOBExp
19ec0 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  r->iColumn==iCol
19ed0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  umn ){.      if(
19ee0 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   zColl ){.      
19ef0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
19f00 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
19f10 72 73 65 2c 20 70 4f 42 49 74 65 6d 2d 3e 70 45  rse, pOBItem->pE
19f20 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
19f30 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
19f40 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
19f50 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63  ;.        isMatc
19f60 68 20 3d 20 73 71 6c 69 74 65 33 53 74 72 49 43  h = sqlite3StrIC
19f70 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
19f80 20 7a 43 6f 6c 6c 29 3d 3d 30 3b 0a 20 20 20 20   zColl)==0;.    
19f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19fa0 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20   isMatch = 1;.  
19fb0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
19fc0 0a 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d  .      isMatch =
19fd0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
19fe0 2a 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20  * termSortOrder 
19ff0 69 73 20 30 20 6f 72 20 31 20 66 6f 72 20 77 68  is 0 or 1 for wh
1a000 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1a010 20 61 63 63 65 73 73 20 6c 6f 6f 70 20 73 68 6f   access loop sho
1a020 75 6c 64 0a 20 20 20 20 2a 2a 20 72 75 6e 20 66  uld.    ** run f
1a030 6f 72 77 61 72 64 20 6f 72 20 62 61 63 6b 77 61  orward or backwa
1a040 72 64 73 20 28 72 65 73 70 65 63 74 69 76 65 6c  rds (respectivel
1a050 79 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  y) in order to s
1a060 61 74 69 73 66 79 20 74 68 69 73 20 0a 20 20 20  atisfy this .   
1a070 20 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20   ** term of the 
1a080 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1a090 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1a0a0 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  pOBItem->sortOrd
1a0b0 65 72 3d 3d 30 20 7c 7c 20 70 4f 42 49 74 65 6d  er==0 || pOBItem
1a0c0 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29  ->sortOrder==1 )
1a0d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
1a0e0 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 69  ortOrder==0 || i
1a0f0 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  SortOrder==1 );.
1a100 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72 64 65      termSortOrde
1a110 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72 20 5e  r = iSortOrder ^
1a120 20 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   pOBItem->sortOr
1a130 64 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  der;..    /* If 
1a140 58 20 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  X is the column 
1a150 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  in the index and
1a160 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a170 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 0a 20  , check to see. 
1a180 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61     ** if there a
1a190 72 65 20 61 6e 79 20 58 3d 20 6f 72 20 58 20 49  re any X= or X I
1a1a0 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  S NULL constrain
1a1b0 74 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ts in the WHERE 
1a1c0 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 70  clause. */.    p
1a1d0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 66 69 6e  Constraint = fin
1a1e0 64 54 65 72 6d 28 70 2d 3e 70 57 43 2c 20 62 61  dTerm(p->pWC, ba
1a1f0 73 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 70 2d 3e  se, iColumn, p->
1a200 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20  notReady,.      
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a220 20 20 20 20 20 57 4f 5f 45 51 7c 57 4f 5f 49 53       WO_EQ|WO_IS
1a230 4e 55 4c 4c 7c 57 4f 5f 49 4e 2c 20 70 49 64 78  NULL|WO_IN, pIdx
1a240 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73  );.    if( pCons
1a250 74 72 61 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  traint==0 ){.   
1a260 20 20 20 69 73 45 71 20 3d 20 30 3b 0a 20 20 20     isEq = 0;.   
1a270 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e 73   }else if( pCons
1a280 74 72 61 69 6e 74 2d 3e 65 4f 70 65 72 61 74 6f  traint->eOperato
1a290 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20  r==WO_IN ){.    
1a2a0 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 73    /* Constraints
1a2b0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 22 58   of the form: "X
1a2c0 20 49 4e 20 2e 2e 2e 22 20 63 61 6e 6e 6f 74 20   IN ..." cannot 
1a2d0 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
1a2e0 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a  ORDER BY.      *
1a2f0 2a 20 62 65 63 61 75 73 65 20 77 65 20 64 6f 20  * because we do 
1a300 6e 6f 74 20 6b 6e 6f 77 20 69 6e 20 77 68 61 74  not know in what
1a310 20 6f 72 64 65 72 20 74 68 65 20 76 61 6c 75 65   order the value
1a320 73 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  s on the RHS of 
1a330 74 68 65 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20  the IN.      ** 
1a340 6f 70 65 72 61 74 6f 72 20 77 69 6c 6c 20 6f 63  operator will oc
1a350 63 75 72 2e 20 2a 2f 0a 20 20 20 20 20 20 62 72  cur. */.      br
1a360 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
1a370 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  f( pConstraint->
1a380 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
1a390 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 6e  NULL ){.      un
1a3a0 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b  iqueNotNull = 0;
1a3b0 0a 20 20 20 20 20 20 69 73 45 71 20 3d 20 31 3b  .      isEq = 1;
1a3c0 20 20 2f 2a 20 22 58 20 49 53 20 4e 55 4c 4c 22    /* "X IS NULL"
1a3d0 20 6d 65 61 6e 73 20 58 20 68 61 73 20 6f 6e 6c   means X has onl
1a3e0 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65  y a single value
1a3f0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
1a400 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 70  ( pConstraint->p
1a410 72 65 72 65 71 52 69 67 68 74 3d 3d 30 20 29 7b  rereqRight==0 ){
1a420 0a 20 20 20 20 20 20 69 73 45 71 20 3d 20 31 3b  .      isEq = 1;
1a430 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
1a440 22 58 3d 63 6f 6e 73 74 61 6e 74 22 20 6d 65 61  "X=constant" mea
1a450 6e 73 20 58 20 68 61 73 20 6f 6e 6c 79 20 61 20  ns X has only a 
1a460 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 2a 2f 0a  single value */.
1a470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a480 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
1a490 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 70 45 78  pConstraint->pEx
1a4a0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
1a4b0 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70    if( pRight->op
1a4c0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
1a4d0 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
1a4e0 45 28 28 22 20 20 20 20 20 20 20 2e 2e 20 69 73  E(("       .. is
1a4f0 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28 74 61  OrderedColumn(ta
1a500 62 3d 25 64 2c 63 6f 6c 3d 25 64 29 22 2c 0a 20  b=%d,col=%d)",. 
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a520 20 20 20 70 52 69 67 68 74 2d 3e 69 54 61 62 6c     pRight->iTabl
1a530 65 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  e, pRight->iColu
1a540 6d 6e 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73  mn));.        is
1a550 45 71 20 3d 20 69 73 4f 72 64 65 72 65 64 43 6f  Eq = isOrderedCo
1a560 6c 75 6d 6e 28 70 2c 20 70 52 69 67 68 74 2d 3e  lumn(p, pRight->
1a570 69 54 61 62 6c 65 2c 20 70 52 69 67 68 74 2d 3e  iTable, pRight->
1a580 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1a590 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 20    WHERETRACE((" 
1a5a0 2d 3e 20 69 73 45 71 3d 25 64 5c 6e 22 2c 20 69  -> isEq=%d\n", i
1a5b0 73 45 71 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  sEq));..        
1a5c0 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 73 74 72  /* If the constr
1a5d0 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  aint is of the f
1a5e0 6f 72 6d 20 58 3d 59 20 77 68 65 72 65 20 59 20  orm X=Y where Y 
1a5f0 69 73 20 61 6e 20 6f 72 64 65 72 65 64 20 76 61  is an ordered va
1a600 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  lue.        ** i
1a610 6e 20 61 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 2c  n an outer loop,
1a620 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
1a630 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 6f  the sort order o
1a640 66 20 59 20 6d 61 74 63 68 65 73 20 74 68 65 0a  f Y matches the.
1a650 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 72 74 20          ** sort 
1a660 6f 72 64 65 72 20 72 65 71 75 69 72 65 64 20 66  order required f
1a670 6f 72 20 58 2e 20 2a 2f 0a 20 20 20 20 20 20 20  or X. */.       
1a680 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26 20   if( isMatch && 
1a690 69 73 45 71 3e 3d 32 20 26 26 20 69 73 45 71 21  isEq>=2 && isEq!
1a6a0 3d 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  =pOBItem->sortOr
1a6b0 64 65 72 2b 32 20 29 7b 0a 20 20 20 20 20 20 20  der+2 ){.       
1a6c0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 45     testcase( isE
1a6d0 71 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  q==2 );.        
1a6e0 20 20 74 65 73 74 63 61 73 65 28 20 69 73 45 71    testcase( isEq
1a6f0 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==3 );.         
1a700 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1a710 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1a720 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 30 3b         isEq = 0;
1a730 20 20 2f 2a 20 22 58 3d 65 78 70 72 22 20 70 6c    /* "X=expr" pl
1a740 61 63 65 73 20 6e 6f 20 6f 72 64 65 72 69 6e 67  aces no ordering
1a750 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
1a760 58 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  X */.      }.   
1a770 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 4d 61   }.    if( !isMa
1a780 74 63 68 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tch ){.      if(
1a790 20 69 73 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20   isEq==0 ){.    
1a7a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a7b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a7c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1a7d0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1a7e0 69 73 45 71 21 3d 31 20 29 7b 0a 20 20 20 20 20  isEq!=1 ){.     
1a7f0 20 69 66 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d   if( sortOrder==
1a800 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 72  2 ){.        sor
1a810 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72  tOrder = termSor
1a820 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 65  tOrder;.      }e
1a830 6c 73 65 20 69 66 28 20 74 65 72 6d 53 6f 72 74  lse if( termSort
1a840 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72  Order!=sortOrder
1a850 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1a860 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1a870 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 4f  .    j++;.    pO
1a880 42 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28  BItem++;.    if(
1a890 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20   iColumn<0 ){.  
1a8a0 20 20 20 20 73 65 65 6e 52 6f 77 69 64 20 3d 20      seenRowid = 
1a8b0 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
1a8c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
1a8d0 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  ab->aCol[iColumn
1a8e0 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 26 26 20  ].notNull==0 && 
1a8f0 69 73 45 71 21 3d 31 20 29 7b 0a 20 20 20 20 20  isEq!=1 ){.     
1a900 20 74 65 73 74 63 61 73 65 28 20 69 73 45 71 3d   testcase( isEq=
1a910 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1a920 63 61 73 65 28 20 69 73 45 71 3d 3d 32 20 29 3b  case( isEq==2 );
1a930 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a940 20 69 73 45 71 3d 3d 33 20 29 3b 0a 20 20 20 20   isEq==3 );.    
1a950 20 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20    uniqueNotNull 
1a960 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1a970 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
1a980 6e 6f 74 20 66 6f 75 6e 64 20 61 74 20 6c 65 61  not found at lea
1a990 73 74 20 6f 6e 65 20 4f 52 44 45 52 20 42 59 20  st one ORDER BY 
1a9a0 74 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65  term that matche
1a9b0 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  s the.  ** index
1a9c0 2c 20 74 68 65 6e 20 73 68 6f 77 20 6e 6f 20 70  , then show no p
1a9d0 72 6f 67 72 65 73 73 2e 20 2a 2f 0a 20 20 69 66  rogress. */.  if
1a9e0 28 20 70 4f 42 49 74 65 6d 3d 3d 26 70 4f 72 64  ( pOBItem==&pOrd
1a9f0 65 72 42 79 2d 3e 61 5b 6e 50 72 69 6f 72 53 61  erBy->a[nPriorSa
1aa00 74 5d 20 29 20 72 65 74 75 72 6e 20 6e 50 72 69  t] ) return nPri
1aa10 6f 72 53 61 74 3b 0a 0a 20 20 2f 2a 20 52 65 74  orSat;..  /* Ret
1aa20 75 72 6e 20 74 68 65 20 6e 65 63 65 73 73 61 72  urn the necessar
1aa30 79 20 73 63 61 6e 20 6f 72 64 65 72 20 62 61 63  y scan order bac
1aa40 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  k to the caller 
1aa50 2a 2f 0a 20 20 2a 70 62 52 65 76 20 3d 20 73 6f  */.  *pbRev = so
1aa60 72 74 4f 72 64 65 72 20 26 20 31 3b 0a 0a 20 20  rtOrder & 1;..  
1aa70 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
1aa80 61 6e 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77  an "ORDER BY row
1aa90 69 64 22 20 74 65 72 6d 20 74 68 61 74 20 6d 61  id" term that ma
1aaa0 74 63 68 65 64 2c 20 6f 72 20 69 74 20 69 73 20  tched, or it is 
1aab0 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62  only.  ** possib
1aac0 6c 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  le for a single 
1aad0 72 6f 77 20 66 72 6f 6d 20 74 68 69 73 20 74 61  row from this ta
1aae0 62 6c 65 20 74 6f 20 6d 61 74 63 68 2c 20 74 68  ble to match, th
1aaf0 65 6e 20 73 6b 69 70 20 6f 76 65 72 0a 20 20 2a  en skip over.  *
1ab00 2a 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c  * any additional
1ab10 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1ab20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69  dealing with thi
1ab30 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  s table..  */.  
1ab40 69 66 28 20 73 65 65 6e 52 6f 77 69 64 20 7c 7c  if( seenRowid ||
1ab50 20 28 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20   (uniqueNotNull 
1ab60 26 26 20 69 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c  && i>=pIdx->nCol
1ab70 75 6d 6e 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41  umn) ){.    /* A
1ab80 64 76 61 6e 63 65 20 6a 20 6f 76 65 72 20 61 64  dvance j over ad
1ab90 64 69 74 69 6f 6e 61 6c 20 4f 52 44 45 52 20 42  ditional ORDER B
1aba0 59 20 74 65 72 6d 73 20 61 73 73 6f 63 69 61 74  Y terms associat
1abb0 65 64 20 77 69 74 68 20 62 61 73 65 20 2a 2f 0a  ed with base */.
1abc0 20 20 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74      WhereMaskSet
1abd0 20 2a 70 4d 53 20 3d 20 70 2d 3e 70 57 43 2d 3e   *pMS = p->pWC->
1abe0 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20 42 69  pMaskSet;.    Bi
1abf0 74 6d 61 73 6b 20 6d 20 3d 20 7e 67 65 74 4d 61  tmask m = ~getMa
1ac00 73 6b 28 70 4d 53 2c 20 62 61 73 65 29 3b 0a 20  sk(pMS, base);. 
1ac10 20 20 20 77 68 69 6c 65 28 20 6a 3c 6e 54 65 72     while( j<nTer
1ac20 6d 20 26 26 20 28 65 78 70 72 54 61 62 6c 65 55  m && (exprTableU
1ac30 73 61 67 65 28 70 4d 53 2c 20 70 4f 72 64 65 72  sage(pMS, pOrder
1ac40 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 26  By->a[j].pExpr)&
1ac50 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a  m)==0 ){.      j
1ac60 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1ac70 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a  return j;.}../*.
1ac80 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73 74  ** Find the best
1ac90 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20   query plan for 
1aca0 61 63 63 65 73 73 69 6e 67 20 61 20 70 61 72 74  accessing a part
1acb0 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 57  icular table.  W
1acc0 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74  rite the.** best
1acd0 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20   query plan and 
1ace0 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68  its cost into th
1acf0 65 20 70 2d 3e 63 6f 73 74 2e 0a 2a 2a 0a 2a 2a  e p->cost..**.**
1ad00 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   The lowest cost
1ad10 20 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68 65   plan wins.  The
1ad20 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74 69   cost is an esti
1ad30 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75  mate of the amou
1ad40 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64  nt of.** CPU and
1ad50 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 65 64   disk I/O needed
1ad60 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
1ad70 72 65 71 75 65 73 74 65 64 20 72 65 73 75 6c 74  requested result
1ad80 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61  ..** Factors tha
1ad90 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74  t influence cost
1ada0 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
1adb0 20 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61     *  The estima
1adc0 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ted number of ro
1add0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
1ade0 72 65 74 72 69 65 76 65 64 2e 20 20 28 54 68 65  retrieved.  (The
1adf0 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72 20  .**       fewer 
1ae00 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a  the better.).**.
1ae10 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72  **    *  Whether
1ae20 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20   or not sorting 
1ae30 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a  must occur..**.*
1ae40 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20  *    *  Whether 
1ae50 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73  or not there mus
1ae60 74 20 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f  t be separate lo
1ae70 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20  okups in the.** 
1ae80 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20        index and 
1ae90 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
1aea0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
1aeb0 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44  e was an INDEXED
1aec0 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 72 63   BY clause (pSrc
1aed0 2d 3e 70 49 6e 64 65 78 29 20 61 74 74 61 63 68  ->pIndex) attach
1aee0 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
1aef0 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  in.** the SQL st
1af00 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68  atement, then th
1af10 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  is function only
1af20 20 63 6f 6e 73 69 64 65 72 73 20 70 6c 61 6e 73   considers plans
1af30 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 6e   using the .** n
1af40 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66 20 6e  amed index. If n
1af50 6f 20 73 75 63 68 20 70 6c 61 6e 20 69 73 20 66  o such plan is f
1af60 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 72  ound, then the r
1af70 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69 73 0a  eturned cost is.
1af80 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  ** SQLITE_BIG_DB
1af90 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20 69 73 20  L. If a plan is 
1afa0 66 6f 75 6e 64 20 74 68 61 74 20 75 73 65 73 20  found that uses 
1afb0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 2c  the named index,
1afc0 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 6f   .** then the co
1afd0 73 74 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  st is calculated
1afe0 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20 77 61   in the usual wa
1aff0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f  y..**.** If a NO
1b000 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
1b010 20 77 61 73 20 61 74 74 61 63 68 65 64 20 74 6f   was attached to
1b020 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 69   the table .** i
1b030 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
1b040 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e 6f 20  tement, then no 
1b050 69 6e 64 65 78 65 73 20 61 72 65 20 63 6f 6e 73  indexes are cons
1b060 69 64 65 72 65 64 2e 20 48 6f 77 65 76 65 72 2c  idered. However,
1b070 20 74 68 65 20 0a 2a 2a 20 73 65 6c 65 63 74 65   the .** selecte
1b080 64 20 70 6c 61 6e 20 6d 61 79 20 73 74 69 6c 6c  d plan may still
1b090 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   take advantage 
1b0a0 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
1b0b0 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1b0c0 79 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  y.** index..*/.s
1b0d0 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 42  tatic void bestB
1b0e0 74 72 65 65 49 6e 64 65 78 28 57 68 65 72 65 42  treeIndex(WhereB
1b0f0 65 73 74 49 64 78 20 2a 70 29 7b 0a 20 20 50 61  estIdx *p){.  Pa
1b100 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
1b110 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20 54 68 65  >pParse;  /* The
1b120 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1b130 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
1b140 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b  e *pWC = p->pWC;
1b150 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1b160 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
1b170 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1b180 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
1b190 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1b1a0 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
1b1b0 68 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  h */.  int iCur 
1b1c0 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b  = pSrc->iCursor;
1b1d0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1b1e0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
1b1f0 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a   be accessed */.
1b200 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
1b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b220 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
1b230 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
1b240 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1b250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b260 43 6f 70 79 20 6f 66 20 70 50 72 6f 62 65 2c 20  Copy of pProbe, 
1b270 6f 72 20 7a 65 72 6f 20 66 6f 72 20 49 50 4b 20  or zero for IPK 
1b280 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 65  index */.  int e
1b290 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20  qTermMask;      
1b2a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1b2b0 74 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20  t mask of valid 
1b2c0 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f  equality operato
1b2d0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 45  rs */.  int idxE
1b2e0 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20  qTermMask;      
1b2f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6d 61 73      /* Index mas
1b300 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c  k of valid equal
1b310 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  ity operators */
1b320 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20  .  Index sPk;   
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b340 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f  * A fake index o
1b350 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72  bject for the pr
1b360 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 74  imary key */.  t
1b370 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74 50  Rowcnt aiRowEstP
1b380 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54 68  k[2];      /* Th
1b390 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c  e aiRowEst[] val
1b3a0 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
1b3b0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 69  ndex */.  int ai
1b3c0 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
1b3d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
1b3e0 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
1b3f0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
1b400 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 4d 61  /.  int wsFlagMa
1b410 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1b420 2f 2a 20 41 6c 6c 6f 77 65 64 20 66 6c 61 67 73  /* Allowed flags
1b430 20 69 6e 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e   in p->cost.plan
1b440 2e 77 73 46 6c 61 67 20 2a 2f 0a 20 20 69 6e 74  .wsFlag */.  int
1b450 20 6e 50 72 69 6f 72 53 61 74 3b 20 20 20 20 20   nPriorSat;     
1b460 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
1b470 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
1b480 66 69 65 64 20 62 79 20 6f 75 74 65 72 20 6c 6f  fied by outer lo
1b490 6f 70 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  ops */.  int nOr
1b4a0 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20  derBy;          
1b4b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b4c0 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
1b4d0 20 2a 2f 0a 20 20 63 68 61 72 20 62 53 6f 72 74   */.  char bSort
1b4e0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
1b4f0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 72    /* Initializer
1b500 20 66 6f 72 20 62 53 6f 72 74 20 69 6e 20 69 6e   for bSort in in
1b510 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68  ner loop */.  ch
1b520 61 72 20 62 44 69 73 74 49 6e 69 74 3b 20 20 20  ar bDistInit;   
1b530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
1b540 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 62 44 69  tializer for bDi
1b550 73 74 20 69 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70  st in inner loop
1b560 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 49 6e 69 74 69   */...  /* Initi
1b570 61 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20 74  alize the cost t
1b580 6f 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20 76  o a worst-case v
1b590 61 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  alue */.  memset
1b5a0 28 26 70 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69  (&p->cost, 0, si
1b5b0 7a 65 6f 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a  zeof(p->cost));.
1b5c0 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20    p->cost.rCost 
1b5d0 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
1b5e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
1b5f0 53 72 63 20 74 61 62 6c 65 20 69 73 20 74 68 65  Src table is the
1b600 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
1b610 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e  a LEFT JOIN then
1b620 20 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a   we may not.  **
1b630 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 74 6f   use an index to
1b640 20 73 61 74 69 73 66 79 20 49 53 20 4e 55 4c 4c   satisfy IS NULL
1b650 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
1b660 74 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69  that table.  Thi
1b670 73 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73  s is.  ** becaus
1b680 65 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20  e columns might 
1b690 65 6e 64 20 75 70 20 62 65 69 6e 67 20 4e 55 4c  end up being NUL
1b6a0 4c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64  L if the table d
1b6b0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a  oes not match -.
1b6c0 20 20 2a 2a 20 61 20 63 69 72 63 75 6d 73 74 61    ** a circumsta
1b6d0 6e 63 65 20 77 68 69 63 68 20 74 68 65 20 69 6e  nce which the in
1b6e0 64 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20  dex cannot help 
1b6f0 75 73 20 64 69 73 63 6f 76 65 72 2e 20 20 54 69  us discover.  Ti
1b700 63 6b 65 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f  cket #2177..  */
1b710 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6a 6f 69  .  if( pSrc->joi
1b720 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20  ntype & JT_LEFT 
1b730 29 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d  ){.    idxEqTerm
1b740 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
1b750 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  IN;.  }else{.   
1b760 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d   idxEqTermMask =
1b770 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
1b780 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69  ISNULL;.  }..  i
1b790 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
1b7a0 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44  ){.    /* An IND
1b7b0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73  EXED BY clause s
1b7c0 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69  pecifies a parti
1b7d0 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75  cular index to u
1b7e0 73 65 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d  se */.    pIdx =
1b7f0 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
1b800 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 73 46 6c  pIndex;.    wsFl
1b810 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45  agMask = ~(WHERE
1b820 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
1b830 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20  ROWID_RANGE);.  
1b840 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69    eqTermMask = i
1b850 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20  dxEqTermMask;.  
1b860 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1b870 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
1b880 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
1b890 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
1b8a0 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
1b8b0 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
1b8c0 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
1b8d0 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
1b8e0 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
1b8f0 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
1b900 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
1b910 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
1b920 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
1b930 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
1b940 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
1b950 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
1b960 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
1b970 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
1b980 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1b990 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
1b9a0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
1b9b0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
1b9c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
1b9d0 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f  x));.    sPk.nCo
1b9e0 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50  lumn = 1;.    sP
1b9f0 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69  k.aiColumn = &ai
1ba00 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50  ColumnPk;.    sP
1ba10 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52  k.aiRowEst = aiR
1ba20 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b  owEstPk;.    sPk
1ba30 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65  .onError = OE_Re
1ba40 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70  place;.    sPk.p
1ba50 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
1ba60 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  ab;.    aiRowEst
1ba70 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54  Pk[0] = pSrc->pT
1ba80 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20  ab->nRowEst;.   
1ba90 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d   aiRowEstPk[1] =
1baa0 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d   1;.    pFirst =
1bab0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
1bac0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72  dex;.    if( pSr
1bad0 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  c->notIndexed==0
1bae0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1baf0 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66   real indices of
1bb00 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f   the table are o
1bb10 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69  nly considered i
1bb20 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e  f the.      ** N
1bb30 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69  OT INDEXED quali
1bb40 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  fier is omitted 
1bb50 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c  from the FROM cl
1bb60 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50  ause */.      sP
1bb70 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74  k.pNext = pFirst
1bb80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f  ;.    }.    pPro
1bb90 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 20 20 77  be = &sPk;.    w
1bba0 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 0a 20  sFlagMask = ~(. 
1bbb0 20 20 20 20 20 20 20 57 48 45 52 45 5f 43 4f 4c         WHERE_COL
1bbc0 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c  UMN_IN|WHERE_COL
1bbd0 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c  UMN_EQ|WHERE_COL
1bbe0 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43  UMN_NULL|WHERE_C
1bbf0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 0a 20 20 20 20  OLUMN_RANGE.    
1bc00 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  );.    eqTermMas
1bc10 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b  k = WO_EQ|WO_IN;
1bc20 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20  .    pIdx = 0;. 
1bc30 20 7d 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   }..  nOrderBy =
1bc40 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70   p->pOrderBy ? p
1bc50 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1bc60 72 20 3a 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  r : 0;.  if( p->
1bc70 69 20 29 7b 0a 20 20 20 20 6e 50 72 69 6f 72 53  i ){.    nPriorS
1bc80 61 74 20 3d 20 70 2d 3e 61 4c 65 76 65 6c 5b 70  at = p->aLevel[p
1bc90 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53  ->i-1].plan.nOBS
1bca0 61 74 3b 0a 20 20 20 20 62 53 6f 72 74 49 6e 69  at;.    bSortIni
1bcb0 74 20 3d 20 6e 50 72 69 6f 72 53 61 74 3c 6e 4f  t = nPriorSat<nO
1bcc0 72 64 65 72 42 79 3b 0a 20 20 20 20 62 44 69 73  rderBy;.    bDis
1bcd0 74 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  tInit = 0;.  }el
1bce0 73 65 7b 0a 20 20 20 20 6e 50 72 69 6f 72 53 61  se{.    nPriorSa
1bcf0 74 20 3d 20 30 3b 0a 20 20 20 20 62 53 6f 72 74  t = 0;.    bSort
1bd00 49 6e 69 74 20 3d 20 6e 4f 72 64 65 72 42 79 3e  Init = nOrderBy>
1bd10 30 3b 0a 20 20 20 20 62 44 69 73 74 49 6e 69 74  0;.    bDistInit
1bd20 20 3d 20 70 2d 3e 70 44 69 73 74 69 6e 63 74 21   = p->pDistinct!
1bd30 3d 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  =0;.  }..  /* Lo
1bd40 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
1bd50 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ces looking for 
1bd60 74 68 65 20 62 65 73 74 20 6f 6e 65 20 74 6f 20  the best one to 
1bd70 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  use.  */.  for(;
1bd80 20 70 50 72 6f 62 65 3b 20 70 49 64 78 3d 70 50   pProbe; pIdx=pP
1bd90 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65  robe=pProbe->pNe
1bda0 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 74  xt){.    const t
1bdb0 52 6f 77 63 6e 74 20 2a 20 63 6f 6e 73 74 20 61  Rowcnt * const a
1bdc0 69 52 6f 77 45 73 74 20 3d 20 70 50 72 6f 62 65  iRowEst = pProbe
1bdd0 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 20 20  ->aiRowEst;.    
1bde0 57 68 65 72 65 43 6f 73 74 20 70 63 3b 20 20 20  WhereCost pc;   
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1be00 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 70 50 72  ost of using pPr
1be10 6f 62 65 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  obe */.    doubl
1be20 65 20 6c 6f 67 31 30 4e 20 3d 20 28 64 6f 75 62  e log10N = (doub
1be30 6c 65 29 31 3b 20 20 2f 2a 20 62 61 73 65 2d 31  le)1;  /* base-1
1be40 30 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 6e  0 logarithm of n
1be50 52 6f 77 20 28 69 6e 65 78 61 63 74 29 20 2a 2f  Row (inexact) */
1be60 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
1be70 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
1be80 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 62   are populated b
1be90 61 73 65 64 20 6f 6e 20 74 68 65 20 70 72 6f 70  ased on the prop
1bea0 65 72 74 69 65 73 20 6f 66 0a 20 20 20 20 2a 2a  erties of.    **
1beb0 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61   index being eva
1bec0 6c 75 61 74 65 64 2e 20 54 68 65 79 20 61 72 65  luated. They are
1bed0 20 74 68 65 6e 20 75 73 65 64 20 74 6f 20 64 65   then used to de
1bee0 74 65 72 6d 69 6e 65 20 74 68 65 20 65 78 70 65  termine the expe
1bef0 63 74 65 64 0a 20 20 20 20 2a 2a 20 63 6f 73 74  cted.    ** cost
1bf00 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
1bf10 6f 77 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  ows returned..  
1bf20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 70 63 2e    **.    **  pc.
1bf30 70 6c 61 6e 2e 6e 45 71 3a 20 0a 20 20 20 20 2a  plan.nEq: .    *
1bf40 2a 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 65  *    Number of e
1bf50 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 74 68  quality terms th
1bf60 61 74 20 63 61 6e 20 62 65 20 69 6d 70 6c 65 6d  at can be implem
1bf70 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  ented using the 
1bf80 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20 20  index..    **   
1bf90 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1bfa0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
1bfb0 6e 69 74 69 61 6c 20 66 69 65 6c 64 73 20 69 6e  nitial fields in
1bfc0 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 0a   the index that.
1bfd0 20 20 20 20 2a 2a 20 20 20 20 61 72 65 20 75 73      **    are us
1bfe0 65 64 20 69 6e 20 3d 3d 20 6f 72 20 49 4e 20 6f  ed in == or IN o
1bff0 72 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  r NOT NULL const
1c000 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 57 48  raints of the WH
1c010 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20 20  ERE clause..    
1c020 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 49 6e 4d 75  **.    **  nInMu
1c030 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 54  l:  .    **    T
1c040 68 65 20 22 69 6e 2d 6d 75 6c 74 69 70 6c 69 65  he "in-multiplie
1c050 72 22 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65  r". This is an e
1c060 73 74 69 6d 61 74 65 20 6f 66 20 68 6f 77 20 6d  stimate of how m
1c070 61 6e 79 20 73 65 65 6b 20 6f 70 65 72 61 74 69  any seek operati
1c080 6f 6e 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 53  ons .    **    S
1c090 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72 66 6f  QLite must perfo
1c0a0 72 6d 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20  rm on the index 
1c0b0 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 46 6f 72  in question. For
1c0c0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1c0d0 20 0a 20 20 20 20 2a 2a 20 20 20 20 57 48 45 52   .    **    WHER
1c0e0 45 20 63 6c 61 75 73 65 20 69 73 3a 0a 20 20 20  E clause is:.   
1c0f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1c100 57 48 45 52 45 20 61 20 49 4e 20 28 31 2c 20 32  WHERE a IN (1, 2
1c110 2c 20 33 29 20 41 4e 44 20 62 20 49 4e 20 28 34  , 3) AND b IN (4
1c120 2c 20 35 2c 20 36 29 0a 20 20 20 20 2a 2a 0a 20  , 5, 6).    **. 
1c130 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20     **    SQLite 
1c140 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 39 20 6c  must perform 9 l
1c150 6f 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 69 6e 64  ookups on an ind
1c160 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 73 6f  ex on (a, b), so
1c170 20 6e 49 6e 4d 75 6c 20 69 73 20 0a 20 20 20 20   nInMul is .    
1c180 2a 2a 20 20 20 20 73 65 74 20 74 6f 20 39 2e 20  **    set to 9. 
1c190 47 69 76 65 6e 20 74 68 65 20 73 61 6d 65 20 73  Given the same s
1c1a0 63 68 65 6d 61 20 61 6e 64 20 65 69 74 68 65 72  chema and either
1c1b0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1c1c0 67 20 57 48 45 52 45 20 0a 20 20 20 20 2a 2a 20  g WHERE .    ** 
1c1d0 20 20 20 63 6c 61 75 73 65 73 3a 0a 20 20 20 20     clauses:.    
1c1e0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57  **.    **      W
1c1f0 48 45 52 45 20 61 20 3d 20 20 31 0a 20 20 20 20  HERE a =  1.    
1c200 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
1c210 3e 3d 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20 20  >= 2.    **.    
1c220 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69 73 20  **    nInMul is 
1c230 73 65 74 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2a  set to 1..    **
1c240 0a 20 20 20 20 2a 2a 20 20 20 20 49 66 20 74 68  .    **    If th
1c250 65 72 65 20 65 78 69 73 74 73 20 61 20 57 48 45  ere exists a WHE
1c260 52 45 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  RE term of the f
1c270 6f 72 6d 20 22 78 20 49 4e 20 28 53 45 4c 45 43  orm "x IN (SELEC
1c280 54 20 2e 2e 2e 29 22 2c 20 74 68 65 6e 20 0a 20  T ...)", then . 
1c290 20 20 20 2a 2a 20 20 20 20 74 68 65 20 73 75 62     **    the sub
1c2a0 2d 73 65 6c 65 63 74 20 69 73 20 61 73 73 75 6d  -select is assum
1c2b0 65 64 20 74 6f 20 72 65 74 75 72 6e 20 32 35 20  ed to return 25 
1c2c0 72 6f 77 73 20 66 6f 72 20 74 68 65 20 70 75 72  rows for the pur
1c2d0 70 6f 73 65 73 20 6f 66 20 0a 20 20 20 20 2a 2a  poses of .    **
1c2e0 20 20 20 20 64 65 74 65 72 6d 69 6e 69 6e 67 20      determining 
1c2f0 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20  nInMul..    **. 
1c300 20 20 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20 20     **  bInEst:  
1c310 0a 20 20 20 20 2a 2a 20 20 20 20 53 65 74 20 74  .    **    Set t
1c320 6f 20 74 72 75 65 20 69 66 20 74 68 65 72 65 20  o true if there 
1c330 77 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  was at least one
1c340 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
1c350 2e 2e 29 22 20 74 65 72 6d 20 75 73 65 64 20 0a  ..)" term used .
1c360 20 20 20 20 2a 2a 20 20 20 20 69 6e 20 64 65 74      **    in det
1c370 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ermining the val
1c380 75 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e 20 20 4e  ue of nInMul.  N
1c390 6f 74 65 20 74 68 61 74 20 74 68 65 20 52 48 53  ote that the RHS
1c3a0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 20   of the.    **  
1c3b0 20 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75    IN operator mu
1c3c0 73 74 20 62 65 20 61 20 53 45 4c 45 43 54 2c 20  st be a SELECT, 
1c3d0 6e 6f 74 20 61 20 76 61 6c 75 65 20 6c 69 73 74  not a value list
1c3e0 2c 20 66 6f 72 20 74 68 69 73 20 76 61 72 69 61  , for this varia
1c3f0 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 74 6f  ble.    **    to
1c400 20 62 65 20 74 72 75 65 2e 0a 20 20 20 20 2a 2a   be true..    **
1c410 0a 20 20 20 20 2a 2a 20 20 72 61 6e 67 65 44 69  .    **  rangeDi
1c420 76 3a 0a 20 20 20 20 2a 2a 20 20 20 20 41 6e 20  v:.    **    An 
1c430 65 73 74 69 6d 61 74 65 20 6f 66 20 61 20 64 69  estimate of a di
1c440 76 69 73 6f 72 20 62 79 20 77 68 69 63 68 20 74  visor by which t
1c450 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
1c460 72 63 68 20 73 70 61 63 65 20 64 75 65 0a 20 20  rch space due.  
1c470 20 20 2a 2a 20 20 20 20 74 6f 20 69 6e 65 71 75    **    to inequ
1c480 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1c490 73 2e 20 20 49 6e 20 74 68 65 20 61 62 73 65 6e  s.  In the absen
1c4a0 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  ce of sqlite_sta
1c4b0 74 33 20 41 4e 41 4c 59 5a 45 0a 20 20 20 20 2a  t3 ANALYZE.    *
1c4c0 2a 20 20 20 20 64 61 74 61 2c 20 61 20 73 69 6e  *    data, a sin
1c4d0 67 6c 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72  gle inequality r
1c4e0 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
1c4f0 68 20 73 70 61 63 65 20 74 6f 20 31 2f 34 72 64  h space to 1/4rd
1c500 20 69 74 73 0a 20 20 20 20 2a 2a 20 20 20 20 6f   its.    **    o
1c510 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 28 72 61  riginal size (ra
1c520 6e 67 65 44 69 76 3d 3d 34 29 2e 20 20 54 77 6f  ngeDiv==4).  Two
1c530 20 69 6e 65 71 75 61 6c 69 74 69 65 73 20 72 65   inequalities re
1c540 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68 0a  duce the search.
1c550 20 20 20 20 2a 2a 20 20 20 20 73 70 61 63 65 20      **    space 
1c560 74 6f 20 31 2f 31 36 74 68 20 6f 66 20 69 74 73  to 1/16th of its
1c570 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 28   original size (
1c580 72 61 6e 67 65 44 69 76 3d 3d 31 36 29 2e 0a 20  rangeDiv==16).. 
1c590 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 53     **.    **  bS
1c5a0 6f 72 74 3a 20 20 20 0a 20 20 20 20 2a 2a 20 20  ort:   .    **  
1c5b0 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20    Boolean. True 
1c5c0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
1c5d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
1c5e0 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65  hat will require
1c5f0 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 65   an .    **    e
1c600 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 28 69 2e  xternal sort (i.
1c610 65 2e 20 73 63 61 6e 6e 69 6e 67 20 74 68 65 20  e. scanning the 
1c620 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61 6c  index being eval
1c630 75 61 74 65 64 20 77 69 6c 6c 20 6e 6f 74 20 0a  uated will not .
1c640 20 20 20 20 2a 2a 20 20 20 20 63 6f 72 72 65 63      **    correc
1c650 74 6c 79 20 6f 72 64 65 72 20 72 65 63 6f 72 64  tly order record
1c660 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s)..    **.    *
1c670 2a 20 20 62 44 69 73 74 3a 0a 20 20 20 20 2a 2a  *  bDist:.    **
1c680 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75      Boolean. Tru
1c690 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  e if there is a 
1c6a0 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20  DISTINCT clause 
1c6b0 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72  that will requir
1c6c0 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20  e an .    **    
1c6d0 65 78 74 65 72 6e 61 6c 20 62 74 72 65 65 2e 0a  external btree..
1c6e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62      **.    **  b
1c6f0 4c 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a 2a 20  Lookup: .    ** 
1c700 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65     Boolean. True
1c710 20 69 66 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b   if a table look
1c720 75 70 20 69 73 20 72 65 71 75 69 72 65 64 20 66  up is required f
1c730 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 65 6e  or each index en
1c740 74 72 79 0a 20 20 20 20 2a 2a 20 20 20 20 76 69  try.    **    vi
1c750 73 69 74 65 64 2e 20 20 49 6e 20 6f 74 68 65 72  sited.  In other
1c760 20 77 6f 72 64 73 2c 20 74 72 75 65 20 69 66 20   words, true if 
1c770 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6f  this is not a co
1c780 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  vering index..  
1c790 20 20 2a 2a 20 20 20 20 54 68 69 73 20 69 73 20    **    This is 
1c7a0 61 6c 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72  always false for
1c7b0 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61   the rowid prima
1c7c0 72 79 20 6b 65 79 20 69 6e 64 65 78 20 6f 66 20  ry key index of 
1c7d0 61 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  a table..    ** 
1c7e0 20 20 20 46 6f 72 20 6f 74 68 65 72 20 69 6e 64     For other ind
1c7f0 65 78 65 73 2c 20 69 74 20 69 73 20 74 72 75 65  exes, it is true
1c800 20 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68 65 20   unless all the 
1c810 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
1c820 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 75  able.    **    u
1c830 73 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  sed by the SELEC
1c840 54 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  T statement are 
1c850 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69  present in the i
1c860 6e 64 65 78 20 28 73 75 63 68 20 61 6e 0a 20 20  ndex (such an.  
1c870 20 20 2a 2a 20 20 20 20 69 6e 64 65 78 20 69 73    **    index is
1c880 20 73 6f 6d 65 74 69 6d 65 73 20 64 65 73 63 72   sometimes descr
1c890 69 62 65 64 20 61 73 20 61 20 63 6f 76 65 72 69  ibed as a coveri
1c8a0 6e 67 20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a  ng index)..    *
1c8b0 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
1c8c0 2c 20 67 69 76 65 6e 20 74 68 65 20 69 6e 64 65  , given the inde
1c8d0 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
1c8e0 20 73 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 66   second of the f
1c8f0 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a  ollowing .    **
1c900 20 20 20 20 74 77 6f 20 71 75 65 72 69 65 73 20      two queries 
1c910 72 65 71 75 69 72 65 73 20 74 61 62 6c 65 20 62  requires table b
1c920 2d 74 72 65 65 20 6c 6f 6f 6b 75 70 73 20 69 6e  -tree lookups in
1c930 20 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20 74   order to find t
1c940 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  he value.    ** 
1c950 20 20 20 6f 66 20 63 6f 6c 75 6d 6e 20 63 2c 20     of column c, 
1c960 62 75 74 20 74 68 65 20 66 69 72 73 74 20 64 6f  but the first do
1c970 65 73 20 6e 6f 74 20 62 65 63 61 75 73 65 20 63  es not because c
1c980 6f 6c 75 6d 6e 73 20 61 20 61 6e 64 20 62 20 61  olumns a and b a
1c990 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 62 6f 74  re.    **    bot
1c9a0 68 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  h available in t
1c9b0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
1c9c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1c9d0 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20      SELECT a, b 
1c9e0 20 20 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52     FROM tbl WHER
1c9f0 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2a 20  E a = 1;.    ** 
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45              SELE
1ca10 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  CT a, b, c FROM 
1ca20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b  tbl WHERE a = 1;
1ca30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1ca40 62 49 6e 45 73 74 20 3d 20 30 3b 20 20 20 20 20  bInEst = 0;     
1ca50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1ca60 65 20 69 66 20 22 78 20 49 4e 20 28 53 45 4c 45  e if "x IN (SELE
1ca70 43 54 2e 2e 2e 29 22 20 73 65 65 6e 20 2a 2f 0a  CT...)" seen */.
1ca80 20 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c 20 3d      int nInMul =
1ca90 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1caa0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
1cab0 69 73 74 69 6e 63 74 20 65 71 75 61 6c 69 74 69  istinct equaliti
1cac0 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 2a 2f 0a  es to lookup */.
1cad0 20 20 20 20 64 6f 75 62 6c 65 20 72 61 6e 67 65      double range
1cae0 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  Div = (double)1;
1caf0 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 72    /* Estimated r
1cb00 65 64 75 63 74 69 6f 6e 20 69 6e 20 73 65 61 72  eduction in sear
1cb10 63 68 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ch space */.    
1cb20 69 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30 3b 20  int nBound = 0; 
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb40 20 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e 67 65   Number of range
1cb50 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 65 65   constraints see
1cb60 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62 53  n */.    char bS
1cb70 6f 72 74 20 3d 20 62 53 6f 72 74 49 6e 69 74 3b  ort = bSortInit;
1cb80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1cb90 66 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20  f external sort 
1cba0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
1cbb0 63 68 61 72 20 62 44 69 73 74 20 3d 20 62 44 69  char bDist = bDi
1cbc0 73 74 49 6e 69 74 3b 20 20 20 20 20 20 20 2f 2a  stInit;       /*
1cbd0 20 54 72 75 65 20 69 66 20 69 6e 64 65 78 20 63   True if index c
1cbe0 61 6e 6e 6f 74 20 68 65 6c 70 20 77 69 74 68 20  annot help with 
1cbf0 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20  DISTINCT */.    
1cc00 63 68 61 72 20 62 4c 6f 6f 6b 75 70 20 3d 20 30  char bLookup = 0
1cc10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1cc20 20 54 72 75 65 20 69 66 20 6e 6f 74 20 61 20 63   True if not a c
1cc30 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
1cc40 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1cc50 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
1cc60 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
1cc70 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
1cc80 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66 64 65   clause */.#ifde
1cc90 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1cca0 53 54 41 54 33 0a 20 20 20 20 57 68 65 72 65 54  STAT3.    WhereT
1ccb0 65 72 6d 20 2a 70 46 69 72 73 74 54 65 72 6d 20  erm *pFirstTerm 
1ccc0 3d 20 30 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  = 0;    /* First
1ccd0 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 74   term matching t
1cce0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65 6e 64  he index */.#end
1ccf0 69 66 0a 0a 20 20 20 20 57 48 45 52 45 54 52 41  if..    WHERETRA
1cd00 43 45 28 28 0a 20 20 20 20 20 20 22 20 20 20 25  CE((.      "   %
1cd10 73 28 25 73 29 3a 5c 6e 22 2c 0a 20 20 20 20 20  s(%s):\n",.     
1cd20 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61   pSrc->pTab->zNa
1cd30 6d 65 2c 20 28 70 49 64 78 20 3f 20 70 49 64 78  me, (pIdx ? pIdx
1cd40 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29  ->zName : "ipk")
1cd50 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 6d 65 6d  .    ));.    mem
1cd60 73 65 74 28 26 70 63 2c 20 30 2c 20 73 69 7a 65  set(&pc, 0, size
1cd70 6f 66 28 70 63 29 29 3b 0a 20 20 20 20 70 63 2e  of(pc));.    pc.
1cd80 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 6e 50  plan.nOBSat = nP
1cd90 72 69 6f 72 53 61 74 3b 0a 0a 20 20 20 20 2f 2a  riorSat;..    /*
1cda0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76   Determine the v
1cdb0 61 6c 75 65 73 20 6f 66 20 70 63 2e 70 6c 61 6e  alues of pc.plan
1cdc0 2e 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75 6c 20  .nEq and nInMul 
1cdd0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 63 2e 70 6c  */.    for(pc.pl
1cde0 61 6e 2e 6e 45 71 3d 30 3b 20 70 63 2e 70 6c 61  an.nEq=0; pc.pla
1cdf0 6e 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43  n.nEq<pProbe->nC
1ce00 6f 6c 75 6d 6e 3b 20 70 63 2e 70 6c 61 6e 2e 6e  olumn; pc.plan.n
1ce10 45 71 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  Eq++){.      int
1ce20 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43   j = pProbe->aiC
1ce30 6f 6c 75 6d 6e 5b 70 63 2e 70 6c 61 6e 2e 6e 45  olumn[pc.plan.nE
1ce40 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  q];.      pTerm 
1ce50 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1ce60 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52  iCur, j, p->notR
1ce70 65 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b  eady, eqTermMask
1ce80 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 69  , pIdx);.      i
1ce90 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
1cea0 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c  eak;.      pc.pl
1ceb0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 28 57  an.wsFlags |= (W
1cec0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
1ced0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3b 0a  HERE_ROWID_EQ);.
1cee0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1cef0 70 54 65 72 6d 2d 3e 70 57 43 21 3d 70 57 43 20  pTerm->pWC!=pWC 
1cf00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
1cf10 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1cf20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
1cf30 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1cf40 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
1cf50 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46       pc.plan.wsF
1cf60 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
1cf70 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20  LUMN_IN;.       
1cf80 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1cf90 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1cfa0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1cfb0 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
1cfc0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20  (SELECT ...)":  
1cfd0 41 73 73 75 6d 65 20 74 68 65 20 53 45 4c 45 43  Assume the SELEC
1cfe0 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
1cff0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e  s */.          n
1d000 49 6e 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20 20 20  InMul *= 25;.   
1d010 20 20 20 20 20 20 20 62 49 6e 45 73 74 20 3d 20         bInEst = 
1d020 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1d030 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
1d040 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45  r->x.pList && pE
1d050 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
1d060 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
1d070 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75    /* "x IN (valu
1d080 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20  e, value, ...)" 
1d090 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e  */.          nIn
1d0a0 4d 75 6c 20 2a 3d 20 70 45 78 70 72 2d 3e 78 2e  Mul *= pExpr->x.
1d0b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
1d0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1d0d0 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  lse if( pTerm->e
1d0e0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
1d0f0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
1d100 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
1d110 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
1d120 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 23 69  NULL;.      }.#i
1d130 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1d140 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 20 20 69  LE_STAT3.      i
1d150 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d 3d  f( pc.plan.nEq==
1d160 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 53 61  0 && pProbe->aSa
1d170 6d 70 6c 65 20 29 20 70 46 69 72 73 74 54 65 72  mple ) pFirstTer
1d180 6d 20 3d 20 70 54 65 72 6d 3b 0a 23 65 6e 64 69  m = pTerm;.#endi
1d190 66 0a 20 20 20 20 20 20 70 63 2e 75 73 65 64 20  f.      pc.used 
1d1a0 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  |= pTerm->prereq
1d1b0 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 0a 20  Right;.    }. . 
1d1c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
1d1d0 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  ex being conside
1d1e0 72 65 64 20 69 73 20 55 4e 49 51 55 45 2c 20 61  red is UNIQUE, a
1d1f0 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  nd there is an e
1d200 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20  quality .    ** 
1d210 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 61  constraint for a
1d220 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ll columns in th
1d230 65 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 74 68  e index, then th
1d240 69 73 20 73 65 61 72 63 68 20 77 69 6c 6c 20 66  is search will f
1d250 69 6e 64 0a 20 20 20 20 2a 2a 20 61 74 20 6d 6f  ind.    ** at mo
1d260 73 74 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e  st a single row.
1d270 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 65   In this case se
1d280 74 20 74 68 65 20 57 48 45 52 45 5f 55 4e 49 51  t the WHERE_UNIQ
1d290 55 45 20 66 6c 61 67 20 74 6f 20 0a 20 20 20 20  UE flag to .    
1d2a0 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68 69 73  ** indicate this
1d2b0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1d2c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74      **.    ** Ot
1d2d0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1d2e0 73 65 61 72 63 68 20 6d 61 79 20 66 69 6e 64 20  search may find 
1d2f0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f  more than one ro
1d300 77 2c 20 74 65 73 74 20 74 6f 20 73 65 65 20 69  w, test to see i
1d310 66 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69  f.    ** there i
1d320 73 20 61 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  s a range constr
1d330 61 69 6e 74 20 6f 6e 20 69 6e 64 65 78 65 64 20  aint on indexed 
1d340 63 6f 6c 75 6d 6e 20 28 70 63 2e 70 6c 61 6e 2e  column (pc.plan.
1d350 6e 45 71 2b 31 29 20 74 68 61 74 20 63 61 6e 20  nEq+1) that can 
1d360 62 65 20 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6d  be .    ** optim
1d370 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 69  ized using the i
1d380 6e 64 65 78 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ndex. .    */.  
1d390 20 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 45    if( pc.plan.nE
1d3a0 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q==pProbe->nColu
1d3b0 6d 6e 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e  mn && pProbe->on
1d3c0 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
1d3d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1d3e0 28 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  ( pc.plan.wsFlag
1d3f0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1d400 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IN );.      tes
1d410 74 63 61 73 65 28 20 70 63 2e 70 6c 61 6e 2e 77  tcase( pc.plan.w
1d420 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
1d430 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20  OLUMN_NULL );.  
1d440 20 20 20 20 69 66 28 20 28 70 63 2e 70 6c 61 6e      if( (pc.plan
1d450 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
1d460 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1d470 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d  E_COLUMN_NULL))=
1d480 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63  =0 ){.        pc
1d490 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
1d4a0 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20   WHERE_UNIQUE;. 
1d4b0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 3d         if( p->i=
1d4c0 3d 30 20 7c 7c 20 28 70 2d 3e 61 4c 65 76 65 6c  =0 || (p->aLevel
1d4d0 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 77 73  [p->i-1].plan.ws
1d4e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c  Flags & WHERE_AL
1d4f0 4c 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a  L_UNIQUE)!=0 ){.
1d500 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61            pc.pla
1d510 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  n.wsFlags |= WHE
1d520 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 3b 0a 20  RE_ALL_UNIQUE;. 
1d530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d540 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1d550 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
1d560 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  d==0 ){.      in
1d570 74 20 6a 3b 0a 20 20 20 20 20 20 6a 20 3d 20 28  t j;.      j = (
1d580 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 70 50 72  pc.plan.nEq==pPr
1d590 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d  obe->nColumn ? -
1d5a0 31 20 3a 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  1 : pProbe->aiCo
1d5b0 6c 75 6d 6e 5b 70 63 2e 70 6c 61 6e 2e 6e 45 71  lumn[pc.plan.nEq
1d5c0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 69  ]);.      if( fi
1d5d0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
1d5e0 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79  , j, p->notReady
1d5f0 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  , WO_LT|WO_LE|WO
1d600 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29  _GT|WO_GE, pIdx)
1d610 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
1d620 65 54 65 72 6d 20 2a 70 54 6f 70 2c 20 2a 70 42  eTerm *pTop, *pB
1d630 74 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 70  tm;.        pTop
1d640 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
1d650 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74   iCur, j, p->not
1d660 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
1d670 4c 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  LE, pIdx);.     
1d680 20 20 20 70 42 74 6d 20 3d 20 66 69 6e 64 54 65     pBtm = findTe
1d690 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
1d6a0 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 57 4f   p->notReady, WO
1d6b0 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29  _GT|WO_GE, pIdx)
1d6c0 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 52  ;.        whereR
1d6d0 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72  angeScanEst(pPar
1d6e0 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 63 2e 70  se, pProbe, pc.p
1d6f0 6c 61 6e 2e 6e 45 71 2c 20 70 42 74 6d 2c 20 70  lan.nEq, pBtm, p
1d700 54 6f 70 2c 20 26 72 61 6e 67 65 44 69 76 29 3b  Top, &rangeDiv);
1d710 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
1d720 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  p ){.          n
1d730 42 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20  Bound = 1;.     
1d740 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46       pc.plan.wsF
1d750 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
1d760 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  P_LIMIT;.       
1d770 20 20 20 70 63 2e 75 73 65 64 20 7c 3d 20 70 54     pc.used |= pT
1d780 6f 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  op->prereqRight;
1d790 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
1d7a0 61 73 65 28 20 70 54 6f 70 2d 3e 70 57 43 21 3d  ase( pTop->pWC!=
1d7b0 70 57 43 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  pWC );.        }
1d7c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
1d7d0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  m ){.          n
1d7e0 42 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20  Bound++;.       
1d7f0 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61     pc.plan.wsFla
1d800 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f  gs |= WHERE_BTM_
1d810 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20  LIMIT;.         
1d820 20 70 63 2e 75 73 65 64 20 7c 3d 20 70 42 74 6d   pc.used |= pBtm
1d830 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
1d840 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1d850 65 28 20 70 42 74 6d 2d 3e 70 57 43 21 3d 70 57  e( pBtm->pWC!=pW
1d860 43 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  C );.        }. 
1d870 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77         pc.plan.w
1d880 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52 45  sFlags |= (WHERE
1d890 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
1d8a0 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
1d8b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d8c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1d8d0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
1d8e0 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 69  clause and the i
1d8f0 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69  ndex being consi
1d900 64 65 72 65 64 20 77 69 6c 6c 0a 20 20 20 20 2a  dered will.    *
1d910 2a 20 6e 61 74 75 72 61 6c 6c 79 20 73 63 61 6e  * naturally scan
1d920 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71   rows in the req
1d930 75 69 72 65 64 20 6f 72 64 65 72 2c 20 73 65 74  uired order, set
1d940 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
1d950 20 66 6c 61 67 73 0a 20 20 20 20 2a 2a 20 69 6e   flags.    ** in
1d960 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73   pc.plan.wsFlags
1d970 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1d980 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1d990 52 20 42 59 20 63 6c 61 75 73 65 20 62 75 74 0a  R BY clause but.
1d9a0 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
1d9b0 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20   will scan rows 
1d9c0 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  in a different o
1d9d0 72 64 65 72 2c 20 73 65 74 20 74 68 65 20 62 53  rder, set the bS
1d9e0 6f 72 74 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  ort.    ** varia
1d9f0 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ble.  */.    if(
1da00 20 62 53 6f 72 74 20 26 26 20 28 70 53 72 63 2d   bSort && (pSrc-
1da10 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
1da20 45 46 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  EFT)==0 ){.     
1da30 20 69 6e 74 20 62 52 65 76 20 3d 20 32 3b 0a 20   int bRev = 2;. 
1da40 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1da50 28 22 20 20 20 20 20 20 2d 2d 3e 20 62 65 66 6f  ("      --> befo
1da60 72 65 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65  re isSortingInde
1da70 78 3a 20 6e 50 72 69 6f 72 53 61 74 3d 25 64 5c  x: nPriorSat=%d\
1da80 6e 22 2c 6e 50 72 69 6f 72 53 61 74 29 29 3b 0a  n",nPriorSat));.
1da90 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f        pc.plan.nO
1daa0 42 53 61 74 20 3d 20 69 73 53 6f 72 74 69 6e 67  BSat = isSorting
1dab0 49 6e 64 65 78 28 70 2c 20 70 50 72 6f 62 65 2c  Index(p, pProbe,
1dac0 20 69 43 75 72 2c 20 26 62 52 65 76 29 3b 0a 20   iCur, &bRev);. 
1dad0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1dae0 28 22 20 20 20 20 20 20 2d 2d 3e 20 61 66 74 65  ("      --> afte
1daf0 72 20 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65  r  isSortingInde
1db00 78 3a 20 62 52 65 76 3d 25 64 20 6e 4f 42 53 61  x: bRev=%d nOBSa
1db10 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
1db20 20 20 20 20 20 20 20 20 20 20 20 62 52 65 76 2c             bRev,
1db30 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 29   pc.plan.nOBSat)
1db40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 72  );.      if( nPr
1db50 69 6f 72 53 61 74 3c 70 63 2e 70 6c 61 6e 2e 6e  iorSat<pc.plan.n
1db60 4f 42 53 61 74 20 7c 7c 20 28 70 63 2e 70 6c 61  OBSat || (pc.pla
1db70 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1db80 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a  E_UNIQUE)!=0 ){.
1db90 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e          pc.plan.
1dba0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1dbb0 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20  _ORDERED;.      
1dbc0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64  }.      if( nOrd
1dbd0 65 72 42 79 3d 3d 70 63 2e 70 6c 61 6e 2e 6e 4f  erBy==pc.plan.nO
1dbe0 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20 20 20  BSat ){.        
1dbf0 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  bSort = 0;.     
1dc00 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61     pc.plan.wsFla
1dc10 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49  gs |= WHERE_ROWI
1dc20 44 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f  D_RANGE|WHERE_CO
1dc30 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20  LUMN_RANGE;.    
1dc40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 52    }.      if( bR
1dc50 65 76 20 26 20 31 20 29 20 70 63 2e 70 6c 61 6e  ev & 1 ) pc.plan
1dc60 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1dc70 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 7d  E_REVERSE;.    }
1dc80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1dc90 65 20 69 73 20 61 20 44 49 53 54 49 4e 43 54 20  e is a DISTINCT 
1dca0 71 75 61 6c 69 66 69 65 72 20 61 6e 64 20 74 68  qualifier and th
1dcb0 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20 73 63  is index will sc
1dcc0 61 6e 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 2a  an rows in.    *
1dcd0 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 44  * order of the D
1dce0 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
1dcf0 6f 6e 73 2c 20 63 6c 65 61 72 20 62 44 69 73 74  ons, clear bDist
1dd00 20 61 6e 64 20 73 65 74 20 74 68 65 20 61 70 70   and set the app
1dd10 72 6f 70 72 69 61 74 65 0a 20 20 20 20 2a 2a 20  ropriate.    ** 
1dd20 66 6c 61 67 73 20 69 6e 20 70 63 2e 70 6c 61 6e  flags in pc.plan
1dd30 2e 77 73 46 6c 61 67 73 2e 20 2a 2f 0a 20 20 20  .wsFlags. */.   
1dd40 20 69 66 28 20 62 44 69 73 74 0a 20 20 20 20 20   if( bDist.     
1dd50 26 26 20 69 73 44 69 73 74 69 6e 63 74 49 6e 64  && isDistinctInd
1dd60 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
1dd70 70 50 72 6f 62 65 2c 20 69 43 75 72 2c 20 70 2d  pProbe, iCur, p-
1dd80 3e 70 44 69 73 74 69 6e 63 74 2c 20 70 63 2e 70  >pDistinct, pc.p
1dd90 6c 61 6e 2e 6e 45 71 29 0a 20 20 20 20 20 26 26  lan.nEq).     &&
1dda0 20 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67   (pc.plan.wsFlag
1ddb0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1ddc0 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  _IN)==0.    ){. 
1ddd0 20 20 20 20 20 62 44 69 73 74 20 3d 20 30 3b 0a       bDist = 0;.
1dde0 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
1ddf0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  Flags |= WHERE_R
1de00 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48 45 52 45  OWID_RANGE|WHERE
1de10 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
1de20 45 52 45 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20  ERE_DISTINCT;.  
1de30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63    }..    /* If c
1de40 75 72 72 65 6e 74 6c 79 20 63 61 6c 63 75 6c 61  urrently calcula
1de50 74 69 6e 67 20 74 68 65 20 63 6f 73 74 20 6f 66  ting the cost of
1de60 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20   using an index 
1de70 28 6e 6f 74 20 74 68 65 20 49 50 4b 0a 20 20 20  (not the IPK.   
1de80 20 2a 2a 20 69 6e 64 65 78 29 2c 20 64 65 74 65   ** index), dete
1de90 72 6d 69 6e 65 20 69 66 20 61 6c 6c 20 72 65 71  rmine if all req
1dea0 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 64 61 74  uired column dat
1deb0 61 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65  a may be obtaine
1dec0 64 20 77 69 74 68 6f 75 74 20 0a 20 20 20 20 2a  d without .    *
1ded0 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 61 69 6e  * using the main
1dee0 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 69 66 20   table (i.e. if 
1def0 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 20 63  the index is a c
1df00 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20 69  overing.    ** i
1df10 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 71 75  ndex for this qu
1df20 65 72 79 29 2e 20 49 66 20 69 74 20 69 73 2c 20  ery). If it is, 
1df30 73 65 74 20 74 68 65 20 57 48 45 52 45 5f 49 44  set the WHERE_ID
1df40 58 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 6e 0a 20  X_ONLY flag in. 
1df50 20 20 20 2a 2a 20 70 63 2e 70 6c 61 6e 2e 77 73     ** pc.plan.ws
1df60 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73 65  Flags. Otherwise
1df70 2c 20 73 65 74 20 74 68 65 20 62 4c 6f 6f 6b 75  , set the bLooku
1df80 70 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 72  p variable to tr
1df90 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ue.  */.    if( 
1dfa0 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 42 69  pIdx ){.      Bi
1dfb0 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e  tmask m = pSrc->
1dfc0 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69  colUsed;.      i
1dfd0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
1dfe0 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
1dff0 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
1e000 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78      int x = pIdx
1e010 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
1e020 20 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53         if( x<BMS
1e030 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
1e040 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b  m &= ~(((Bitmask
1e050 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20  )1)<<x);.       
1e060 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1e070 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
1e080 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46       pc.plan.wsF
1e090 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
1e0a0 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  X_ONLY;.      }e
1e0b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4c 6f  lse{.        bLo
1e0c0 6f 6b 75 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  okup = 1;.      
1e0d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  }.    }..    /*.
1e0e0 20 20 20 20 2a 2a 20 45 73 74 69 6d 61 74 65 20      ** Estimate 
1e0f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1e100 77 73 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 46  ws of output.  F
1e110 6f 72 20 61 6e 20 22 78 20 49 4e 20 28 53 45 4c  or an "x IN (SEL
1e120 45 43 54 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  ECT...)".    ** 
1e130 63 6f 6e 73 74 72 61 69 6e 74 2c 20 64 6f 20 6e  constraint, do n
1e140 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d  ot let the estim
1e150 61 74 65 20 65 78 63 65 65 64 20 68 61 6c 66 20  ate exceed half 
1e160 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20  the rows in the 
1e170 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
1e180 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d    pc.plan.nRow =
1e190 20 28 64 6f 75 62 6c 65 29 28 61 69 52 6f 77 45   (double)(aiRowE
1e1a0 73 74 5b 70 63 2e 70 6c 61 6e 2e 6e 45 71 5d 20  st[pc.plan.nEq] 
1e1b0 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 69  * nInMul);.    i
1e1c0 66 28 20 62 49 6e 45 73 74 20 26 26 20 70 63 2e  f( bInEst && pc.
1e1d0 70 6c 61 6e 2e 6e 52 6f 77 2a 32 3e 61 69 52 6f  plan.nRow*2>aiRo
1e1e0 77 45 73 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  wEst[0] ){.     
1e1f0 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20   pc.plan.nRow = 
1e200 61 69 52 6f 77 45 73 74 5b 30 5d 2f 32 3b 0a 20  aiRowEst[0]/2;. 
1e210 20 20 20 20 20 6e 49 6e 4d 75 6c 20 3d 20 28 69       nInMul = (i
1e220 6e 74 29 28 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77  nt)(pc.plan.nRow
1e230 20 2f 20 61 69 52 6f 77 45 73 74 5b 70 63 2e 70   / aiRowEst[pc.p
1e240 6c 61 6e 2e 6e 45 71 5d 29 3b 0a 20 20 20 20 7d  lan.nEq]);.    }
1e250 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e260 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20  ENABLE_STAT3.   
1e270 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 73 74   /* If the const
1e280 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20  raint is of the 
1e290 66 6f 72 6d 20 78 3d 56 41 4c 55 45 20 6f 72 20  form x=VALUE or 
1e2a0 78 20 49 4e 20 28 45 31 2c 45 32 2c 2e 2e 2e 29  x IN (E1,E2,...)
1e2b0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 77 65 20 64  .    ** and we d
1e2c0 6f 20 6e 6f 74 20 74 68 69 6e 6b 20 74 68 61 74  o not think that
1e2d0 20 76 61 6c 75 65 73 20 6f 66 20 78 20 61 72 65   values of x are
1e2e0 20 75 6e 69 71 75 65 20 61 6e 64 20 69 66 20 68   unique and if h
1e2f0 69 73 74 6f 67 72 61 6d 0a 20 20 20 20 2a 2a 20  istogram.    ** 
1e300 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
1e310 65 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 78 2c 20  e for column x, 
1e320 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 62 65  then it might be
1e330 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a   possible.    **
1e340 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72   to get a better
1e350 20 65 73 74 69 6d 61 74 65 20 6f 6e 20 74 68 65   estimate on the
1e360 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1e370 62 61 73 65 64 20 6f 6e 0a 20 20 20 20 2a 2a 20  based on.    ** 
1e380 56 41 4c 55 45 20 61 6e 64 20 68 6f 77 20 63 6f  VALUE and how co
1e390 6d 6d 6f 6e 20 74 68 61 74 20 76 61 6c 75 65 20  mmon that value 
1e3a0 69 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  is according to 
1e3b0 74 68 65 20 68 69 73 74 6f 67 72 61 6d 2e 0a 20  the histogram.. 
1e3c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63     */.    if( pc
1e3d0 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 28 64 6f 75 62  .plan.nRow>(doub
1e3e0 6c 65 29 31 20 26 26 20 70 63 2e 70 6c 61 6e 2e  le)1 && pc.plan.
1e3f0 6e 45 71 3d 3d 31 0a 20 20 20 20 20 26 26 20 70  nEq==1.     && p
1e400 46 69 72 73 74 54 65 72 6d 21 3d 30 20 26 26 20  FirstTerm!=0 && 
1e410 61 69 52 6f 77 45 73 74 5b 31 5d 3e 31 20 29 7b  aiRowEst[1]>1 ){
1e420 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1e430 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65  pFirstTerm->eOpe
1e440 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
1e450 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29  O_ISNULL|WO_IN))
1e460 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
1e470 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70   pFirstTerm->eOp
1e480 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
1e490 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20  WO_ISNULL) ){.  
1e4a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e4b0 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65  pFirstTerm->eOpe
1e4c0 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a  rator==WO_EQ );.
1e4d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e4e0 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f  ( pFirstTerm->eO
1e4f0 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55  perator==WO_ISNU
1e500 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68  LL );.        wh
1e510 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
1e520 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20  pParse, pProbe, 
1e530 70 46 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70  pFirstTerm->pExp
1e540 72 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20 20  r->pRight,.     
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e560 20 20 20 20 20 26 70 63 2e 70 6c 61 6e 2e 6e 52       &pc.plan.nR
1e570 6f 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ow);.      }else
1e580 20 69 66 28 20 62 49 6e 45 73 74 3d 3d 30 20 29   if( bInEst==0 )
1e590 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1e5a0 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f  ( pFirstTerm->eO
1e5b0 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
1e5c0 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 49  ;.        whereI
1e5d0 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  nScanEst(pParse,
1e5e0 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73 74 54   pProbe, pFirstT
1e5f0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c  erm->pExpr->x.pL
1e600 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ist,.           
1e610 20 20 20 20 20 20 20 20 20 20 20 20 26 70 63 2e              &pc.
1e620 70 6c 61 6e 2e 6e 52 6f 77 29 3b 0a 20 20 20 20  plan.nRow);.    
1e630 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
1e640 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
1e650 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 20 20 20 20  E_STAT3 */..    
1e660 2f 2a 20 41 64 6a 75 73 74 20 74 68 65 20 6e 75  /* Adjust the nu
1e670 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
1e680 6f 77 73 20 61 6e 64 20 64 6f 77 6e 77 61 72 64  ows and downward
1e690 20 74 6f 20 72 65 66 6c 65 63 74 20 72 6f 77 73   to reflect rows
1e6a0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65  .    ** that are
1e6b0 20 65 78 63 6c 75 64 65 64 20 62 79 20 72 61 6e   excluded by ran
1e6c0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ge constraints..
1e6d0 20 20 20 20 2a 2f 0a 20 20 20 20 70 63 2e 70 6c      */.    pc.pl
1e6e0 61 6e 2e 6e 52 6f 77 20 3d 20 70 63 2e 70 6c 61  an.nRow = pc.pla
1e6f0 6e 2e 6e 52 6f 77 2f 72 61 6e 67 65 44 69 76 3b  n.nRow/rangeDiv;
1e700 0a 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e  .    if( pc.plan
1e710 2e 6e 52 6f 77 3c 31 20 29 20 70 63 2e 70 6c 61  .nRow<1 ) pc.pla
1e720 6e 2e 6e 52 6f 77 20 3d 20 31 3b 0a 0a 20 20 20  n.nRow = 1;..   
1e730 20 2f 2a 20 45 78 70 65 72 69 6d 65 6e 74 73 20   /* Experiments 
1e740 72 75 6e 20 6f 6e 20 72 65 61 6c 20 53 51 4c 69  run on real SQLi
1e750 74 65 20 64 61 74 61 62 61 73 65 73 20 73 68 6f  te databases sho
1e760 77 20 74 68 61 74 20 74 68 65 20 74 69 6d 65 20  w that the time 
1e770 6e 65 65 64 65 64 0a 20 20 20 20 2a 2a 20 74 6f  needed.    ** to
1e780 20 64 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61   do a binary sea
1e790 72 63 68 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  rch to locate a 
1e7a0 72 6f 77 20 69 6e 20 61 20 74 61 62 6c 65 20 6f  row in a table o
1e7b0 72 20 69 6e 64 65 78 20 69 73 20 72 6f 75 67 68  r index is rough
1e7c0 6c 79 0a 20 20 20 20 2a 2a 20 6c 6f 67 31 30 28  ly.    ** log10(
1e7d0 4e 29 20 74 69 6d 65 73 20 74 68 65 20 74 69 6d  N) times the tim
1e7e0 65 20 74 6f 20 6d 6f 76 65 20 66 72 6f 6d 20 6f  e to move from o
1e7f0 6e 65 20 72 6f 77 20 74 6f 20 74 68 65 20 6e 65  ne row to the ne
1e800 78 74 20 72 6f 77 20 77 69 74 68 69 6e 0a 20 20  xt row within.  
1e810 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 6f 72 20    ** a table or 
1e820 69 6e 64 65 78 2e 20 20 54 68 65 20 61 63 74 75  index.  The actu
1e830 61 6c 20 74 69 6d 65 73 20 63 61 6e 20 76 61 72  al times can var
1e840 79 2c 20 77 69 74 68 20 74 68 65 20 73 69 7a 65  y, with the size
1e850 20 6f 66 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72   of.    ** recor
1e860 64 73 20 62 65 69 6e 67 20 61 6e 20 69 6d 70 6f  ds being an impo
1e870 72 74 61 6e 74 20 66 61 63 74 6f 72 2e 20 20 42  rtant factor.  B
1e880 6f 74 68 20 6d 6f 76 65 73 20 61 6e 64 20 73 65  oth moves and se
1e890 61 72 63 68 65 73 20 61 72 65 0a 20 20 20 20 2a  arches are.    *
1e8a0 2a 20 73 6c 6f 77 65 72 20 77 69 74 68 20 6c 61  * slower with la
1e8b0 72 67 65 72 20 72 65 63 6f 72 64 73 2c 20 70 72  rger records, pr
1e8c0 65 73 75 6d 61 62 6c 79 20 62 65 63 61 75 73 65  esumably because
1e8d0 20 66 65 77 65 72 20 72 65 63 6f 72 64 73 20 66   fewer records f
1e8e0 69 74 0a 20 20 20 20 2a 2a 20 6f 6e 20 6f 6e 65  it.    ** on one
1e8f0 20 70 61 67 65 20 61 6e 64 20 68 65 6e 63 65 20   page and hence 
1e900 6d 6f 72 65 20 70 61 67 65 73 20 68 61 76 65 20  more pages have 
1e910 74 6f 20 62 65 20 66 65 74 63 68 65 64 2e 0a 20  to be fetched.. 
1e920 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1e930 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
1e940 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
1e950 73 74 61 74 31 20 61 6e 64 20 73 71 6c 69 74 65  stat1 and sqlite
1e960 5f 73 74 61 74 33 20 74 61 62 6c 65 73 20 64 6f  _stat3 tables do
1e970 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 67 69 76 65  .    ** not give
1e980 20 75 73 20 64 61 74 61 20 6f 6e 20 74 68 65 20   us data on the 
1e990 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f  relative sizes o
1e9a0 66 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  f table and inde
1e9b0 78 20 72 65 63 6f 72 64 73 2e 0a 20 20 20 20 2a  x records..    *
1e9c0 2a 20 53 6f 20 74 68 69 73 20 63 6f 6d 70 75 74  * So this comput
1e9d0 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 61  ation assumes ta
1e9e0 62 6c 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  ble records are 
1e9f0 61 62 6f 75 74 20 74 77 69 63 65 20 61 73 20 62  about twice as b
1ea00 69 67 0a 20 20 20 20 2a 2a 20 61 73 20 69 6e 64  ig.    ** as ind
1ea10 65 78 20 72 65 63 6f 72 64 73 0a 20 20 20 20 2a  ex records.    *
1ea20 2f 0a 20 20 20 20 69 66 28 20 28 70 63 2e 70 6c  /.    if( (pc.pl
1ea30 61 6e 2e 77 73 46 6c 61 67 73 26 7e 28 57 48 45  an.wsFlags&~(WHE
1ea40 52 45 5f 52 45 56 45 52 53 45 7c 57 48 45 52 45  RE_REVERSE|WHERE
1ea50 5f 4f 52 44 45 52 45 44 29 29 3d 3d 57 48 45 52  _ORDERED))==WHER
1ea60 45 5f 49 44 58 5f 4f 4e 4c 59 0a 20 20 20 20 20  E_IDX_ONLY.     
1ea70 26 26 20 28 70 57 43 2d 3e 77 63 74 72 6c 46 6c  && (pWC->wctrlFl
1ea80 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
1ea90 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a  ASS_DESIRED)==0.
1eaa0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47       && sqlite3G
1eab0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
1eac0 43 69 73 0a 20 20 20 20 20 26 26 20 4f 70 74 69  Cis.     && Opti
1ead0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
1eae0 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
1eaf0 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29  TE_CoverIdxScan)
1eb00 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
1eb10 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   This index is n
1eb20 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 69 6e  ot useful for in
1eb30 64 65 78 69 6e 67 2c 20 62 75 74 20 69 74 20 69  dexing, but it i
1eb40 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
1eb50 65 78 2e 0a 20 20 20 20 20 20 2a 2a 20 41 20 66  ex..      ** A f
1eb60 75 6c 6c 2d 73 63 61 6e 20 6f 66 20 74 68 65 20  ull-scan of the 
1eb70 69 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 61  index might be a
1eb80 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 20 74   little faster t
1eb90 68 61 6e 20 61 20 66 75 6c 6c 2d 73 63 61 6e 0a  han a full-scan.
1eba0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
1ebb0 74 61 62 6c 65 2c 20 73 6f 20 67 69 76 65 20 74  table, so give t
1ebc0 68 69 73 20 63 61 73 65 20 61 20 63 6f 73 74 20  his case a cost 
1ebd0 73 6c 69 67 68 74 6c 79 20 6c 65 73 73 20 74 68  slightly less th
1ebe0 61 6e 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  an a table.     
1ebf0 20 2a 2a 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20   ** scan. */.   
1ec00 20 20 20 70 63 2e 72 43 6f 73 74 20 3d 20 61 69     pc.rCost = ai
1ec10 52 6f 77 45 73 74 5b 30 5d 2a 33 20 2b 20 70 50  RowEst[0]*3 + pP
1ec20 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  robe->nColumn;. 
1ec30 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46       pc.plan.wsF
1ec40 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
1ec50 56 45 52 5f 53 43 41 4e 7c 57 48 45 52 45 5f 43  VER_SCAN|WHERE_C
1ec60 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20  OLUMN_RANGE;.   
1ec70 20 7d 65 6c 73 65 20 69 66 28 20 28 70 63 2e 70   }else if( (pc.p
1ec80 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1ec90 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
1eca0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
1ecb0 20 54 68 65 20 63 6f 73 74 20 6f 66 20 61 20 66   The cost of a f
1ecc0 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69  ull table scan i
1ecd0 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6d 6f  s a number of mo
1ece0 76 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 65 71  ve operations eq
1ecf0 75 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ual.      ** to 
1ed00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1ed10 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
1ed20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1ed30 2a 2a 20 57 65 20 61 64 64 20 61 6e 20 61 64 64  ** We add an add
1ed40 69 74 69 6f 6e 61 6c 20 34 78 20 70 65 6e 61 6c  itional 4x penal
1ed50 74 79 20 74 6f 20 66 75 6c 6c 20 74 61 62 6c 65  ty to full table
1ed60 20 73 63 61 6e 73 2e 20 20 54 68 69 73 20 63 61   scans.  This ca
1ed70 75 73 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  uses.      ** th
1ed80 65 20 63 6f 73 74 20 66 75 6e 63 74 69 6f 6e 20  e cost function 
1ed90 74 6f 20 65 72 72 20 6f 6e 20 74 68 65 20 73 69  to err on the si
1eda0 64 65 20 6f 66 20 63 68 6f 6f 73 69 6e 67 20 61  de of choosing a
1edb0 6e 20 69 6e 64 65 78 20 6f 76 65 72 0a 20 20 20  n index over.   
1edc0 20 20 20 2a 2a 20 63 68 6f 6f 73 69 6e 67 20 61     ** choosing a
1edd0 20 66 75 6c 6c 20 73 63 61 6e 2e 20 20 54 68 69   full scan.  Thi
1ede0 73 20 34 78 20 66 75 6c 6c 2d 73 63 61 6e 20 70  s 4x full-scan p
1edf0 65 6e 61 6c 74 79 20 69 73 20 61 6e 20 61 72 67  enalty is an arg
1ee00 75 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64  uable.      ** d
1ee10 65 63 69 73 69 6f 6e 20 61 6e 64 20 6f 6e 65 20  ecision and one 
1ee20 77 68 69 63 68 20 77 65 20 65 78 70 65 63 74 20  which we expect 
1ee30 74 6f 20 72 65 76 69 73 69 74 20 69 6e 20 74 68  to revisit in th
1ee40 65 20 66 75 74 75 72 65 2e 20 20 42 75 74 0a 20  e future.  But. 
1ee50 20 20 20 20 20 2a 2a 20 69 74 20 73 65 65 6d 73       ** it seems
1ee60 20 74 6f 20 62 65 20 77 6f 72 6b 69 6e 67 20 77   to be working w
1ee70 65 6c 6c 20 65 6e 6f 75 67 68 20 61 74 20 74 68  ell enough at th
1ee80 65 20 6d 6f 6d 65 6e 74 2e 0a 20 20 20 20 20 20  e moment..      
1ee90 2a 2f 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73  */.      pc.rCos
1eea0 74 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a  t = aiRowEst[0]*
1eeb0 34 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  4;.      pc.plan
1eec0 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  .wsFlags &= ~WHE
1eed0 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
1eee0 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20     if( pIdx ){. 
1eef0 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77         pc.plan.w
1ef00 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
1ef10 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20  _ORDERED;.      
1ef20 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74    pc.plan.nOBSat
1ef30 20 3d 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20   = nPriorSat;.  
1ef40 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1ef50 0a 20 20 20 20 20 20 6c 6f 67 31 30 4e 20 3d 20  .      log10N = 
1ef60 65 73 74 4c 6f 67 28 61 69 52 6f 77 45 73 74 5b  estLog(aiRowEst[
1ef70 30 5d 29 3b 0a 20 20 20 20 20 20 70 63 2e 72 43  0]);.      pc.rC
1ef80 6f 73 74 20 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52  ost = pc.plan.nR
1ef90 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ow;.      if( pI
1efa0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  dx ){.        if
1efb0 28 20 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20 20  ( bLookup ){.   
1efc0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e         /* For an
1efd0 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 66 6f   index lookup fo
1efe0 6c 6c 6f 77 65 64 20 62 79 20 61 20 74 61 62 6c  llowed by a tabl
1eff0 65 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20 20  e lookup:.      
1f000 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c      **    nInMul
1f010 20 69 6e 64 65 78 20 73 65 61 72 63 68 65 73 20   index searches 
1f020 74 6f 20 66 69 6e 64 20 74 68 65 20 73 74 61 72  to find the star
1f030 74 20 6f 66 20 65 61 63 68 20 69 6e 64 65 78 20  t of each index 
1f040 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20  range.          
1f050 2a 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73  **  + nRow steps
1f060 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64   through the ind
1f070 65 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ex.          ** 
1f080 20 2b 20 6e 52 6f 77 20 74 61 62 6c 65 20 73 65   + nRow table se
1f090 61 72 63 68 65 73 20 74 6f 20 6c 6f 6f 6b 75 70  arches to lookup
1f0a0 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
1f0b0 20 75 73 69 6e 67 20 74 68 65 20 72 6f 77 69 64   using the rowid
1f0c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1f0d0 20 20 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74          pc.rCost
1f0e0 20 2b 3d 20 28 6e 49 6e 4d 75 6c 20 2b 20 70 63   += (nInMul + pc
1f0f0 2e 70 6c 61 6e 2e 6e 52 6f 77 29 2a 6c 6f 67 31  .plan.nRow)*log1
1f100 30 4e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0N;.        }els
1f110 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1f120 46 6f 72 20 61 20 63 6f 76 65 72 69 6e 67 20 69  For a covering i
1f130 6e 64 65 78 3a 0a 20 20 20 20 20 20 20 20 20 20  ndex:.          
1f140 2a 2a 20 20 20 20 20 6e 49 6e 4d 75 6c 20 69 6e  **     nInMul in
1f150 64 65 78 20 73 65 61 72 63 68 65 73 20 74 6f 20  dex searches to 
1f160 66 69 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c  find the initial
1f170 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 20 20   entry .        
1f180 20 20 2a 2a 20 20 20 2b 20 6e 52 6f 77 20 73 74    **   + nRow st
1f190 65 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  eps through the 
1f1a0 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20  index.          
1f1b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e  */.          pc.
1f1c0 72 43 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a  rCost += nInMul*
1f1d0 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20 20  log10N;.        
1f1e0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1f1f0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20         /* For a 
1f200 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1f210 79 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20 20  y lookup:.      
1f220 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 74 20    **    nInMult 
1f230 74 61 62 6c 65 20 73 65 61 72 63 68 65 73 20 74  table searches t
1f240 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 69 74 69  o find the initi
1f250 61 6c 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  al entry for eac
1f260 68 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20  h range.        
1f270 2a 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73  **  + nRow steps
1f280 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 61 62   through the tab
1f290 6c 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  le.        */.  
1f2a0 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20 2b        pc.rCost +
1f2b0 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b  = nInMul*log10N;
1f2c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f2d0 20 20 20 20 2f 2a 20 41 64 64 20 69 6e 20 74 68      /* Add in th
1f2e0 65 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74  e estimated cost
1f2f0 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20   of sorting the 
1f300 72 65 73 75 6c 74 2e 20 20 41 63 74 75 61 6c 20  result.  Actual 
1f310 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a 20 20 20  experimental.   
1f320 20 2a 2a 20 6d 65 61 73 75 72 65 6d 65 6e 74 73   ** measurements
1f330 20 6f 66 20 73 6f 72 74 69 6e 67 20 70 65 72 66   of sorting perf
1f340 6f 72 6d 61 6e 63 65 20 69 6e 20 53 51 4c 69 74  ormance in SQLit
1f350 65 20 73 68 6f 77 20 74 68 61 74 20 73 6f 72 74  e show that sort
1f360 69 6e 67 20 74 69 6d 65 0a 20 20 20 20 2a 2a 20  ing time.    ** 
1f370 61 64 64 73 20 43 2a 4e 2a 6c 6f 67 31 30 28 4e  adds C*N*log10(N
1f380 29 20 74 6f 20 74 68 65 20 63 6f 73 74 2c 20 77  ) to the cost, w
1f390 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
1f3a0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20  mber of rows to 
1f3b0 62 65 20 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65  be .    ** sorte
1f3c0 64 20 61 6e 64 20 43 20 69 73 20 61 20 66 61 63  d and C is a fac
1f3d0 74 6f 72 20 62 65 74 77 65 65 6e 20 31 2e 39 35  tor between 1.95
1f3e0 20 61 6e 64 20 34 2e 33 2e 20 20 57 65 20 77 69   and 4.3.  We wi
1f3f0 6c 6c 20 73 70 6c 69 74 20 74 68 65 0a 20 20 20  ll split the.   
1f400 20 2a 2a 20 64 69 66 66 65 72 65 6e 63 65 20 61   ** difference a
1f410 6e 64 20 73 65 6c 65 63 74 20 43 20 6f 66 20 33  nd select C of 3
1f420 2e 30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  .0..    */.    i
1f430 66 28 20 62 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( bSort ){.    
1f440 20 20 64 6f 75 62 6c 65 20 6d 20 3d 20 65 73 74    double m = est
1f450 4c 6f 67 28 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77  Log(pc.plan.nRow
1f460 2a 28 6e 4f 72 64 65 72 42 79 20 2d 20 70 63 2e  *(nOrderBy - pc.
1f470 70 6c 61 6e 2e 6e 4f 42 53 61 74 29 2f 6e 4f 72  plan.nOBSat)/nOr
1f480 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 6d 20  derBy);.      m 
1f490 2a 3d 20 28 64 6f 75 62 6c 65 29 28 70 63 2e 70  *= (double)(pc.p
1f4a0 6c 61 6e 2e 6e 4f 42 53 61 74 20 3f 20 32 20 3a  lan.nOBSat ? 2 :
1f4b0 20 33 29 3b 0a 20 20 20 20 20 20 70 63 2e 72 43   3);.      pc.rC
1f4c0 6f 73 74 20 2b 3d 20 70 63 2e 70 6c 61 6e 2e 6e  ost += pc.plan.n
1f4d0 52 6f 77 2a 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  Row*m;.    }.   
1f4e0 20 69 66 28 20 62 44 69 73 74 20 29 7b 0a 20 20   if( bDist ){.  
1f4f0 20 20 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20      pc.rCost += 
1f500 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a 65 73 74  pc.plan.nRow*est
1f510 4c 6f 67 28 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77  Log(pc.plan.nRow
1f520 29 2a 33 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  )*3;.    }..    
1f530 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20 75 73  /**** Cost of us
1f540 69 6e 67 20 74 68 69 73 20 69 6e 64 65 78 20 68  ing this index h
1f550 61 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f 6d 70  as now been comp
1f560 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20  uted ****/..    
1f570 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1f580 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74  additional const
1f590 72 61 69 6e 74 73 20 6f 6e 20 74 68 69 73 20 74  raints on this t
1f5a0 61 62 6c 65 20 74 68 61 74 20 63 61 6e 6e 6f 74  able that cannot
1f5b0 0a 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20  .    ** be used 
1f5c0 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
1f5d0 20 69 6e 64 65 78 2c 20 62 75 74 20 77 68 69 63   index, but whic
1f5e0 68 20 6d 69 67 68 74 20 6c 6f 77 65 72 20 74 68  h might lower th
1f5f0 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20  e number.    ** 
1f600 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20  of output rows, 
1f610 61 64 6a 75 73 74 20 74 68 65 20 6e 52 6f 77 20  adjust the nRow 
1f620 76 61 6c 75 65 20 61 63 63 6f 72 64 69 6e 67 6c  value accordingl
1f630 79 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 0a 20  y.  This only . 
1f640 20 20 20 2a 2a 20 6d 61 74 74 65 72 73 20 69 66     ** matters if
1f650 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64   the current ind
1f660 65 78 20 69 73 20 74 68 65 20 6c 65 61 73 74 20  ex is the least 
1f670 63 6f 73 74 6c 79 2c 20 73 6f 20 64 6f 20 6e 6f  costly, so do no
1f680 74 20 62 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  t bother.    ** 
1f690 77 69 74 68 20 74 68 69 73 20 73 74 65 70 20 69  with this step i
1f6a0 66 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f  f we already kno
1f6b0 77 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c  w this index wil
1f6c0 6c 20 6e 6f 74 20 62 65 20 63 68 6f 73 65 6e 2e  l not be chosen.
1f6d0 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 6e 65  .    ** Also, ne
1f6e0 76 65 72 20 72 65 64 75 63 65 20 74 68 65 20 6f  ver reduce the o
1f6f0 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 20  utput row count 
1f700 62 65 6c 6f 77 20 32 20 75 73 69 6e 67 20 74 68  below 2 using th
1f710 69 73 20 73 74 65 70 2e 0a 20 20 20 20 2a 2a 0a  is step..    **.
1f720 20 20 20 20 2a 2a 20 49 74 20 69 73 20 63 72 69      ** It is cri
1f730 74 69 63 61 6c 20 74 68 61 74 20 74 68 65 20 6e  tical that the n
1f740 6f 74 56 61 6c 69 64 20 6d 61 73 6b 20 62 65 20  otValid mask be 
1f750 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61  used here instea
1f760 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  d of.    ** the 
1f770 6e 6f 74 52 65 61 64 79 20 6d 61 73 6b 2e 20 20  notReady mask.  
1f780 57 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61  When computing a
1f790 6e 20 22 6f 70 74 69 6d 61 6c 22 20 69 6e 64 65  n "optimal" inde
1f7a0 78 2c 20 74 68 65 20 6e 6f 74 52 65 61 64 79 0a  x, the notReady.
1f7b0 20 20 20 20 2a 2a 20 6d 61 73 6b 20 77 69 6c 6c      ** mask will
1f7c0 20 6f 6e 6c 79 20 68 61 76 65 20 6f 6e 65 20 62   only have one b
1f7d0 69 74 20 73 65 74 20 2d 20 74 68 65 20 62 69 74  it set - the bit
1f7e0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1f7f0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
1f800 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b  he notValid mask
1f810 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  , on the other h
1f820 61 6e 64 2c 20 61 6c 77 61 79 73 20 68 61 73 20  and, always has 
1f830 61 6c 6c 20 62 69 74 73 20 73 65 74 20 66 6f 72  all bits set for
1f840 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74  .    ** tables t
1f850 68 61 74 20 61 72 65 20 6e 6f 74 20 69 6e 20 6f  hat are not in o
1f860 75 74 65 72 20 6c 6f 6f 70 73 2e 20 20 49 66 20  uter loops.  If 
1f870 6e 6f 74 52 65 61 64 79 20 69 73 20 75 73 65 64  notReady is used
1f880 20 68 65 72 65 20 69 6e 73 74 65 61 64 0a 20 20   here instead.  
1f890 20 20 2a 2a 20 6f 66 20 6e 6f 74 56 61 6c 69 64    ** of notValid
1f8a0 2c 20 74 68 65 6e 20 61 20 6f 70 74 69 6d 61 6c  , then a optimal
1f8b0 20 69 6e 64 65 78 20 74 68 61 74 20 64 65 70 65   index that depe
1f8c0 6e 64 73 20 6f 6e 20 69 6e 6e 65 72 20 6a 6f 69  nds on inner joi
1f8d0 6e 73 20 6c 6f 6f 70 73 0a 20 20 20 20 2a 2a 20  ns loops.    ** 
1f8e0 6d 69 67 68 74 20 62 65 20 73 65 6c 65 63 74 65  might be selecte
1f8f0 64 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72  d even when ther
1f900 65 20 65 78 69 73 74 73 20 61 6e 20 6f 70 74 69  e exists an opti
1f910 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  mal index that h
1f920 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 73 75 63  as.    ** no suc
1f930 68 20 64 65 70 65 6e 64 65 6e 63 79 2e 0a 20 20  h dependency..  
1f940 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 2e    */.    if( pc.
1f950 70 6c 61 6e 2e 6e 52 6f 77 3e 32 20 26 26 20 70  plan.nRow>2 && p
1f960 63 2e 72 43 6f 73 74 3c 3d 70 2d 3e 63 6f 73 74  c.rCost<=p->cost
1f970 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  .rCost ){.      
1f980 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f9a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1f9b0 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 45        int nSkipE
1f9c0 71 20 3d 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3b  q = pc.plan.nEq;
1f9d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f9e0 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  == constraints t
1f9f0 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20  o skip */.      
1fa00 69 6e 74 20 6e 53 6b 69 70 52 61 6e 67 65 20 3d  int nSkipRange =
1fa10 20 6e 42 6f 75 6e 64 3b 20 20 20 20 20 2f 2a 20   nBound;     /* 
1fa20 4e 75 6d 62 65 72 20 6f 66 20 3c 20 63 6f 6e 73  Number of < cons
1fa30 74 72 61 69 6e 74 73 20 74 6f 20 73 6b 69 70 20  traints to skip 
1fa40 2a 2f 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  */.      Bitmask
1fa50 20 74 68 69 73 54 61 62 3b 20 20 20 20 20 20 20   thisTab;       
1fa60 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
1fa70 66 6f 72 20 70 53 72 63 20 2a 2f 0a 0a 20 20 20  for pSrc */..   
1fa80 20 20 20 74 68 69 73 54 61 62 20 3d 20 67 65 74     thisTab = get
1fa90 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
1faa0 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 20  et, iCur);.     
1fab0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
1fac0 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, k=pWC->nTerm;
1fad0 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 32 20   pc.plan.nRow>2 
1fae0 26 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d  && k; k--, pTerm
1faf0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1fb00 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1fb10 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1fb20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1fb30 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
1fb40 72 65 72 65 71 41 6c 6c 20 26 20 70 2d 3e 6e 6f  rereqAll & p->no
1fb50 74 56 61 6c 69 64 29 21 3d 74 68 69 73 54 61 62  tValid)!=thisTab
1fb60 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1fb70 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1fb80 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1fb90 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
1fba0 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LL) ){.         
1fbb0 20 69 66 28 20 6e 53 6b 69 70 45 71 20 29 7b 0a   if( nSkipEq ){.
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1fbd0 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  gnore the first 
1fbe0 70 63 2e 70 6c 61 6e 2e 6e 45 71 20 65 71 75 61  pc.plan.nEq equa
1fbf0 6c 69 74 79 20 6d 61 74 63 68 65 73 20 73 69 6e  lity matches sin
1fc00 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  ce the index.   
1fc10 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
1fc20 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65  already accounte
1fc30 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20  d for these */. 
1fc40 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70             nSkip
1fc50 45 71 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  Eq--;.          
1fc60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1fc70 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63     /* Assume eac
1fc80 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 71 75  h additional equ
1fc90 61 6c 69 74 79 20 6d 61 74 63 68 20 72 65 64 75  ality match redu
1fca0 63 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20  ces the result. 
1fcb0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65             ** se
1fcc0 74 20 73 69 7a 65 20 62 79 20 61 20 66 61 63 74  t size by a fact
1fcd0 6f 72 20 6f 66 20 31 30 20 2a 2f 0a 20 20 20 20  or of 10 */.    
1fce0 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e          pc.plan.
1fcf0 6e 52 6f 77 20 2f 3d 20 31 30 3b 0a 20 20 20 20  nRow /= 10;.    
1fd00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fd10 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
1fd20 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1fd30 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
1fd40 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20  WO_GE) ){.      
1fd50 20 20 20 20 69 66 28 20 6e 53 6b 69 70 52 61 6e      if( nSkipRan
1fd60 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
1fd70 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
1fd80 66 69 72 73 74 20 6e 53 6b 69 70 52 61 6e 67 65  first nSkipRange
1fd90 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1fda0 74 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64  ts since the ind
1fdb0 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ex.            *
1fdc0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63  * has already ac
1fdd0 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73  counted for thes
1fde0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1fdf0 20 6e 53 6b 69 70 52 61 6e 67 65 2d 2d 3b 0a 20   nSkipRange--;. 
1fe00 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1fe20 73 73 75 6d 65 20 65 61 63 68 20 61 64 64 69 74  ssume each addit
1fe30 69 6f 6e 61 6c 20 72 61 6e 67 65 20 63 6f 6e 73  ional range cons
1fe40 74 72 61 69 6e 74 20 72 65 64 75 63 65 73 20 74  traint reduces t
1fe50 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
1fe60 20 20 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a        ** set siz
1fe70 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
1fe80 20 33 2e 20 20 49 6e 64 65 78 65 64 20 72 61 6e   3.  Indexed ran
1fe90 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  ge constraints r
1fea0 65 64 75 63 65 0a 20 20 20 20 20 20 20 20 20 20  educe.          
1feb0 20 20 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20    ** the search 
1fec0 73 70 61 63 65 20 62 79 20 61 20 6c 61 72 67 65  space by a large
1fed0 72 20 66 61 63 74 6f 72 3a 20 34 2e 20 20 57 65  r factor: 4.  We
1fee0 20 6d 61 6b 65 20 69 6e 64 65 78 65 64 20 72 61   make indexed ra
1fef0 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  nge.            
1ff00 2a 2a 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76  ** more selectiv
1ff10 65 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 6c 79 20  e intentionally 
1ff20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 73  because of the s
1ff30 75 62 6a 65 63 74 69 76 65 20 0a 20 20 20 20 20  ubjective .     
1ff40 20 20 20 20 20 20 20 2a 2a 20 6f 62 73 65 72 76         ** observ
1ff50 61 74 69 6f 6e 20 74 68 61 74 20 69 6e 64 65 78  ation that index
1ff60 65 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ed range constra
1ff70 69 6e 74 73 20 72 65 61 6c 6c 79 20 61 72 65 20  ints really are 
1ff80 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  more.           
1ff90 20 2a 2a 20 73 65 6c 65 63 74 69 76 65 20 69 6e   ** selective in
1ffa0 20 70 72 61 63 74 69 63 65 2c 20 6f 6e 20 61 76   practice, on av
1ffb0 65 72 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20  erage. */.      
1ffc0 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 52        pc.plan.nR
1ffd0 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20  ow /= 3;.       
1ffe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1fff0 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  se if( pTerm->eO
20000 70 65 72 61 74 6f 72 21 3d 57 4f 5f 4e 4f 4f 50  perator!=WO_NOOP
20010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
20020 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65   Any other expre
20030 73 73 69 6f 6e 20 6c 6f 77 65 72 73 20 74 68 65  ssion lowers the
20040 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e   output row coun
20050 74 20 62 79 20 68 61 6c 66 20 2a 2f 0a 20 20 20  t by half */.   
20060 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e         pc.plan.n
20070 52 6f 77 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20  Row /= 2;.      
20080 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20090 20 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e 6e 52    if( pc.plan.nR
200a0 6f 77 3c 32 20 29 20 70 63 2e 70 6c 61 6e 2e 6e  ow<2 ) pc.plan.n
200b0 52 6f 77 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a  Row = 2;.    }..
200c0 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
200d0 28 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 6e  (.      "      n
200e0 45 71 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25 64 20  Eq=%d nInMul=%d 
200f0 72 61 6e 67 65 44 69 76 3d 25 64 20 62 53 6f 72  rangeDiv=%d bSor
20100 74 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d 25 64 20  t=%d bLookup=%d 
20110 77 73 46 6c 61 67 73 3d 30 78 25 30 38 78 5c 6e  wsFlags=0x%08x\n
20120 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 6e  ".      "      n
20130 6f 74 52 65 61 64 79 3d 30 78 25 6c 6c 78 20 6c  otReady=0x%llx l
20140 6f 67 31 30 4e 3d 25 2e 31 66 20 6e 52 6f 77 3d  og10N=%.1f nRow=
20150 25 2e 31 66 20 63 6f 73 74 3d 25 2e 31 66 5c 6e  %.1f cost=%.1f\n
20160 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 75  ".      "      u
20170 73 65 64 3d 30 78 25 6c 6c 78 20 6e 4f 42 53 61  sed=0x%llx nOBSa
20180 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 70  t=%d\n",.      p
20190 63 2e 70 6c 61 6e 2e 6e 45 71 2c 20 6e 49 6e 4d  c.plan.nEq, nInM
201a0 75 6c 2c 20 28 69 6e 74 29 72 61 6e 67 65 44 69  ul, (int)rangeDi
201b0 76 2c 20 62 53 6f 72 74 2c 20 62 4c 6f 6f 6b 75  v, bSort, bLooku
201c0 70 2c 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61  p, pc.plan.wsFla
201d0 67 73 2c 0a 20 20 20 20 20 20 70 2d 3e 6e 6f 74  gs,.      p->not
201e0 52 65 61 64 79 2c 20 6c 6f 67 31 30 4e 2c 20 70  Ready, log10N, p
201f0 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2c 20 70 63 2e  c.plan.nRow, pc.
20200 72 43 6f 73 74 2c 20 70 63 2e 75 73 65 64 2c 0a  rCost, pc.used,.
20210 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f        pc.plan.nO
20220 42 53 61 74 0a 20 20 20 20 29 29 3b 0a 0a 20 20  BSat.    ));..  
20230 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
20240 65 78 20 69 73 20 74 68 65 20 62 65 73 74 20 77  ex is the best w
20250 65 20 68 61 76 65 20 73 65 65 6e 20 73 6f 20 66  e have seen so f
20260 61 72 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20  ar, then record 
20270 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65  this.    ** inde
20280 78 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69  x and its cost i
20290 6e 20 74 68 65 20 70 2d 3e 63 6f 73 74 20 73 74  n the p->cost st
202a0 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
202b0 20 20 20 20 69 66 28 20 28 21 70 49 64 78 20 7c      if( (!pIdx |
202c0 7c 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  | pc.plan.wsFlag
202d0 73 29 20 26 26 20 63 6f 6d 70 61 72 65 43 6f 73  s) && compareCos
202e0 74 28 26 70 63 2c 20 26 70 2d 3e 63 6f 73 74 29  t(&pc, &p->cost)
202f0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73   ){.      p->cos
20300 74 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 2d  t = pc;.      p-
20310 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
20320 67 73 20 26 3d 20 77 73 46 6c 61 67 4d 61 73 6b  gs &= wsFlagMask
20330 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e  ;.      p->cost.
20340 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49  plan.u.pIdx = pI
20350 64 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dx;.    }..    /
20360 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
20370 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
20380 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74  use, then only t
20390 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73  hat one index is
203a0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
203b0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
203c0 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72  Src->pIndex ) br
203d0 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73  eak;..    /* Res
203e0 65 74 20 6d 61 73 6b 73 20 66 6f 72 20 74 68 65  et masks for the
203f0 20 6e 65 78 74 20 69 6e 64 65 78 20 69 6e 20 74   next index in t
20400 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 77  he loop */.    w
20410 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48  sFlagMask = ~(WH
20420 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
20430 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b  RE_ROWID_RANGE);
20440 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20  .    eqTermMask 
20450 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b  = idxEqTermMask;
20460 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
20470 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
20480 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
20490 65 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  e SQLITE_Reverse
204a0 4f 72 64 65 72 20 66 6c 61 67 0a 20 20 2a 2a 20  Order flag.  ** 
204b0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65 76  is set, then rev
204c0 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20 74  erse the order t
204d0 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 77 69  hat the index wi
204e0 6c 6c 20 62 65 20 73 63 61 6e 6e 65 64 0a 20 20  ll be scanned.  
204f0 2a 2a 20 69 6e 2e 20 54 68 69 73 20 69 73 20 75  ** in. This is u
20500 73 65 64 20 66 6f 72 20 61 70 70 6c 69 63 61 74  sed for applicat
20510 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20 74 6f 20  ion testing, to 
20520 68 65 6c 70 20 66 69 6e 64 20 63 61 73 65 73 0a  help find cases.
20530 20 20 2a 2a 20 77 68 65 72 65 20 61 70 70 6c 69    ** where appli
20540 63 61 74 69 6f 6e 20 62 65 68 61 76 69 6f 75 72  cation behaviour
20550 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
20560 28 75 6e 64 65 66 69 6e 65 64 29 20 6f 72 64 65  (undefined) orde
20570 72 20 74 68 61 74 0a 20 20 2a 2a 20 53 51 4c 69  r that.  ** SQLi
20580 74 65 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  te outputs rows 
20590 69 6e 20 69 6e 20 74 68 65 20 61 62 73 65 6e 63  in in the absenc
205a0 65 20 6f 66 20 61 6e 20 4f 52 44 45 52 20 42 59  e of an ORDER BY
205b0 20 63 6c 61 75 73 65 2e 20 20 2a 2f 0a 20 20 69   clause.  */.  i
205c0 66 28 20 21 70 2d 3e 70 4f 72 64 65 72 42 79 20  f( !p->pOrderBy 
205d0 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  && pParse->db->f
205e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
205f0 76 65 72 73 65 4f 72 64 65 72 20 29 7b 0a 20 20  verseOrder ){.  
20600 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77    p->cost.plan.w
20610 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
20620 52 45 56 45 52 53 45 3b 0a 20 20 7d 0a 0a 20 20  REVERSE;.  }..  
20630 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
20640 72 42 79 20 7c 7c 20 28 70 2d 3e 63 6f 73 74 2e  rBy || (p->cost.
20650 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45  plan.wsFlags&WHE
20660 52 45 5f 4f 52 44 45 52 45 44 29 3d 3d 30 20 29  RE_ORDERED)==0 )
20670 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 63  ;.  assert( p->c
20680 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d  ost.plan.u.pIdx=
20690 3d 30 20 7c 7c 20 28 70 2d 3e 63 6f 73 74 2e 70  =0 || (p->cost.p
206a0 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52  lan.wsFlags&WHER
206b0 45 5f 52 4f 57 49 44 5f 45 51 29 3d 3d 30 20 29  E_ROWID_EQ)==0 )
206c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
206d0 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20  ->pIndex==0 .   
206e0 20 20 20 20 7c 7c 20 70 2d 3e 63 6f 73 74 2e 70      || p->cost.p
206f0 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 0a 20  lan.u.pIdx==0 . 
20700 20 20 20 20 20 20 7c 7c 20 70 2d 3e 63 6f 73 74        || p->cost
20710 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 53  .plan.u.pIdx==pS
20720 72 63 2d 3e 70 49 6e 64 65 78 20 0a 20 20 29 3b  rc->pIndex .  );
20730 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ..  WHERETRACE((
20740 22 20 20 20 62 65 73 74 20 69 6e 64 65 78 20 69  "   best index i
20750 73 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  s: %s\n",.      
20760 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e     p->cost.plan.
20770 75 2e 70 49 64 78 20 3f 20 70 2d 3e 63 6f 73 74  u.pIdx ? p->cost
20780 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  .plan.u.pIdx->zN
20790 61 6d 65 20 3a 20 22 69 70 6b 22 29 29 3b 0a 20  ame : "ipk"));. 
207a0 20 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65   .  bestOrClause
207b0 49 6e 64 65 78 28 70 29 3b 0a 20 20 62 65 73 74  Index(p);.  best
207c0 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70  AutomaticIndex(p
207d0 29 3b 0a 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61  );.  p->cost.pla
207e0 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 65 71 54  n.wsFlags |= eqT
207f0 65 72 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  ermMask;.}../*.*
20800 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65 72 79  * Find the query
20810 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
20820 69 6e 67 20 74 61 62 6c 65 20 70 53 72 63 2d 3e  ing table pSrc->
20830 70 54 61 62 2e 20 57 72 69 74 65 20 74 68 65 0a  pTab. Write the.
20840 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20 70 6c  ** best query pl
20850 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20  an and its cost 
20860 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f  into the WhereCo
20870 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69  st object suppli
20880 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 6c 61  ed .** as the la
20890 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  st parameter. Th
208a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
208b0 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 63 6f  calculate the co
208c0 73 74 20 6f 66 0a 2a 2a 20 62 6f 74 68 20 72 65  st of.** both re
208d0 61 6c 20 61 6e 64 20 76 69 72 74 75 61 6c 20 74  al and virtual t
208e0 61 62 6c 65 20 73 63 61 6e 73 2e 0a 2a 2a 0a 2a  able scans..**.*
208f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20900 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 4f 52  does not take OR
20910 44 45 52 20 42 59 20 6f 72 20 44 49 53 54 49 4e  DER BY or DISTIN
20920 43 54 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e  CT into account.
20930 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74    Nor.** does it
20940 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 76 69   remember the vi
20950 72 74 75 61 6c 20 74 61 62 6c 65 20 71 75 65 72  rtual table quer
20960 79 20 70 6c 61 6e 2e 20 20 41 6c 6c 20 69 74 20  y plan.  All it 
20970 64 6f 65 73 20 69 73 20 63 6f 6d 70 75 74 65 0a  does is compute.
20980 2a 2a 20 74 68 65 20 63 6f 73 74 20 77 68 69 6c  ** the cost whil
20990 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 69 66  e determining if
209a0 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74   an OR optimizat
209b0 69 6f 6e 20 69 73 20 61 70 70 6c 69 63 61 62 6c  ion is applicabl
209c0 65 2e 20 20 54 68 65 0a 2a 2a 20 64 65 74 61 69  e.  The.** detai
209d0 6c 73 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6e  ls will be recon
209e0 73 69 64 65 72 65 64 20 6c 61 74 65 72 20 69 66  sidered later if
209f0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
20a00 6e 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 62 65  n is found to be
20a10 0a 2a 2a 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a  .** applicable..
20a20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
20a30 65 73 74 49 6e 64 65 78 28 57 68 65 72 65 42 65  estIndex(WhereBe
20a40 73 74 49 64 78 20 2a 70 29 7b 0a 23 69 66 6e 64  stIdx *p){.#ifnd
20a50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
20a60 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
20a70 28 20 49 73 56 69 72 74 75 61 6c 28 70 2d 3e 70  ( IsVirtual(p->p
20a80 53 72 63 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  Src->pTab) ){.  
20a90 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
20aa0 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 20 3d  info *pIdxInfo =
20ab0 20 30 3b 0a 20 20 20 20 70 2d 3e 70 70 49 64 78   0;.    p->ppIdx
20ac0 49 6e 66 6f 20 3d 20 26 70 49 64 78 49 6e 66 6f  Info = &pIdxInfo
20ad0 3b 0a 20 20 20 20 62 65 73 74 56 69 72 74 75 61  ;.    bestVirtua
20ae0 6c 49 6e 64 65 78 28 70 29 3b 0a 20 20 20 20 69  lIndex(p);.    i
20af0 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
20b00 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b  dToFreeIdxStr ){
20b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
20b20 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
20b30 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xStr);.    }.   
20b40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
20b50 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  ->pParse->db, pI
20b60 64 78 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  dxInfo);.  }else
20b70 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
20b80 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 70  bestBtreeIndex(p
20b90 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
20ba0 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
20bb0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
20bc0 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
20bd0 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
20be0 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
20bf0 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
20c00 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
20c10 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
20c20 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
20c30 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
20c40 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
20c50 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
20c60 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
20c70 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
20c80 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
20c90 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
20ca0 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
20cb0 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
20cc0 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
20cd0 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
20ce0 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
20cf0 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
20d00 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
20d10 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
20d20 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
20d30 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
20d40 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
20d50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
20d60 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
20d70 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
20d80 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
20d90 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
20da0 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
20db0 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
20dc0 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
20dd0 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
20de0 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
20df0 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
20e00 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
20e10 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
20e20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
20e30 46 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35 35  F: R-24597-58655
20e40 20 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64 6f   No tests are do
20e50 6e 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61  ne for terms tha
20e60 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74  t are.** complet
20e70 65 6c 79 20 73 61 74 69 73 66 69 65 64 20 62 79  ely satisfied by
20e80 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   indices..**.** 
20e90 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
20ea0 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
20eb0 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
20ec0 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
20ed0 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
20ee0 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
20ef0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
20f00 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20  on.  When terms 
20f10 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
20f20 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20   by indices, we 
20f30 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20  disable them to 
20f40 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e  prevent redundan
20f50 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69  t tests in the i
20f60 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57  nner.** loop.  W
20f70 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20  e would get the 
20f80 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20  correct results 
20f90 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20  if nothing were 
20fa0 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a  ever disabled,.*
20fb0 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68  * but joins migh
20fc0 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
20fd0 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63  lower.  The tric
20fe0 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20  k is to disable 
20ff0 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65  as much.** as we
21000 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73   can without dis
21010 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e  abling too much.
21020 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64    If we disabled
21030 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65   in (1), we'd ge
21040 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61  t.** the wrong a
21050 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b  nswer.  See tick
21060 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74  et #813..*/.stat
21070 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54  ic void disableT
21080 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a  erm(WhereLevel *
21090 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72  pLevel, WhereTer
210a0 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28  m *pTerm){.  if(
210b0 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20   pTerm.      && 
210c0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
210d0 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
210e0 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  .      && (pLeve
210f0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20  l->iLeftJoin==0 
21100 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
21110 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
21120 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
21130 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
21140 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
21150 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
21160 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
21170 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
21180 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
21190 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
211a0 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
211b0 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
211c0 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
211d0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
211e0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
211f0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
21200 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
21210 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
21220 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
21230 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
21240 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
21250 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
21260 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
21270 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
21280 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
21290 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
212a0 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
212b0 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
212c0 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
212d0 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
212e0 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
212f0 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
21300 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
21310 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
21320 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
21330 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
21340 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
21350 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
21360 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
21370 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
21380 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
21390 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
213a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
213b0 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
213c0 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
213d0 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
213e0 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
213f0 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
21400 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
21410 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
21420 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
21430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21440 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
21450 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
21460 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
21470 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
21480 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
21490 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
214a0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
214b0 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
214c0 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
214d0 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
214e0 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
214f0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
21500 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
21510 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
21520 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
21530 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
21540 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
21550 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
21560 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
21570 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
21580 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
21590 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
215a0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
215b0 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
215c0 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
215d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
215e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
215f0 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
21600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
21610 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
21620 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
21630 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
21640 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
21650 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
21660 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
21670 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
21680 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
21690 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
216a0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
216b0 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
216c0 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
216d0 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
216e0 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
216f0 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
21700 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
21710 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
21720 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
21730 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
21740 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
21750 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
21760 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
21770 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
21780 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
21790 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
217a0 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
217b0 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
217c0 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
217d0 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
217e0 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
217f0 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
21800 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
21810 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
21820 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
21830 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
21840 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
21850 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
21860 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
21870 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
21880 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
21890 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
218a0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
218b0 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
218c0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
218d0 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e 20  pLevel, /* When 
218e0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
218f0 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
21900 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
21910 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20  int iTarget     
21920 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74      /* Attempt t
21930 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20  o leave results 
21940 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
21950 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
21960 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
21970 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
21980 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
21990 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20  nt iReg;        
219a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
219b0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
219c0 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65  sults */..  asse
219d0 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b  rt( iTarget>0 );
219e0 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  .  if( pX->op==T
219f0 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67  K_EQ ){.    iReg
21a00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
21a10 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
21a20 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pX->pRight, iTa
21a30 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rget);.  }else i
21a40 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  f( pX->op==TK_IS
21a50 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67  NULL ){.    iReg
21a60 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
21a70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21a80 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
21a90 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20   iReg);.#ifndef 
21aa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21ab0 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UERY.  }else{.  
21ac0 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20    int eType;.   
21ad0 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73   int iTab;.    s
21ae0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
21af0 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  n;..    assert( 
21b00 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
21b10 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
21b20 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  get;.    eType =
21b30 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
21b40 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20  dex(pParse, pX, 
21b50 30 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70  0);.    iTab = p
21b60 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73  X->iTable;.    s
21b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21b80 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
21b90 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  Tab, 0);.    ass
21ba0 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ert( pLevel->pla
21bb0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
21bc0 45 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20 20 20  E_IN_ABLE );.   
21bd0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69   if( pLevel->u.i
21be0 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.nIn==0 ){.    
21bf0 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78    pLevel->addrNx
21c00 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
21c10 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
21c20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
21c30 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70  .in.nIn++;.    p
21c40 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
21c50 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  oop =.       sql
21c60 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
21c70 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
21c80 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
21c90 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cb0 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65      sizeof(pLeve
21cc0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
21cd0 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  0])*pLevel->u.in
21ce0 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d  .nIn);.    pIn =
21cf0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
21d00 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
21d10 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
21d20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  += pLevel->u.in.
21d30 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  nIn - 1;.      p
21d40 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b  In->iCur = iTab;
21d50 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
21d60 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
21d70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d   ){.        pIn-
21d80 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
21d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21da0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
21db0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
21dc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
21dd0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
21de0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
21df0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
21e00 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20  Tab, 0, iReg);. 
21e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
21e20 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
21e30 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65  , OP_IsNull, iRe
21e40 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
21e50 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69       pLevel->u.i
21e60 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  n.nIn = 0;.    }
21e70 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69  .#endif.  }.  di
21e80 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
21e90 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75  , pTerm);.  retu
21ea0 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
21eb0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
21ec0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
21ed0 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e  te all == and IN
21ee0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72   constraints for
21ef0 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a   an.** index..**
21f00 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
21f10 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
21f20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
21f30 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
21f40 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
21f50 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
21f60 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
21f70 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
21f80 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
21f90 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
21fa0 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
21fb0 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
21fc0 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
21fd0 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
21fe0 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
21ff0 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
22000 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
22010 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
22020 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
22030 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
22040 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
22050 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
22060 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
22070 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
22080 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
22090 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
220a0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e  stored.** in con
220b0 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
220c0 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  rs and the index
220d0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
220e0 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e  gister is return
220f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ed..**.** In the
22100 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e   example above n
22110 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73  Eq==2.  But this
22120 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b   subroutine work
22130 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a  s for any value.
22140 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64  ** of nEq includ
22150 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d  ing 0.  If nEq==
22160 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0, this routine 
22170 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f  is nearly a no-o
22180 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  p..** The only t
22190 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20  hing it does is 
221a0 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65  allocate the pLe
221b0 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79  vel->iMem memory
221c0 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d   cell and.** com
221d0 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74  pute the affinit
221e0 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  y string..**.** 
221f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77  This routine alw
22200 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74  ays allocates at
22210 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72   least one memor
22220 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72  y cell and retur
22230 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ns.** the index 
22240 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  of that memory c
22250 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68  ell. The code th
22260 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73  at.** calls this
22270 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73   routine will us
22280 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  e that memory ce
22290 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ll to store the 
222a0 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b  termination.** k
222b0 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
222c0 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72  loop.  If one or
222d0 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f   more IN operato
222e0 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a  rs appear, then.
222f0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
22300 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64  allocates an add
22310 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f  itional nEq memo
22320 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74  ry cells for int
22330 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a  ernal.** use..**
22340 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
22350 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20  ning, *pzAff is 
22360 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
22370 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
22380 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66  ing a.** copy of
22390 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
223a0 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74  nity string of t
223b0 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74  he index allocat
223c0 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
223d0 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45  te3DbMalloc(). E
223e0 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69  xcept, entries i
223f0 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  n the copy of th
22400 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61  e string associa
22410 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61  ted.** with equa
22420 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
22430 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61   that use NONE a
22440 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20  ffinity are set 
22450 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  to.** SQLITE_AFF
22460 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74  _NONE. This is t
22470 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20  o deal with SQL 
22480 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c  such as the foll
22490 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  owing:.**.**   C
224a0 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
224b0 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
224c0 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45  Y, b);.**   SELE
224d0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41  CT ... FROM t1 A
224e0 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74  S t2, t1 WHERE t
224f0 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a  1.a = t2.b;.**.*
22500 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
22510 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65   above, the inde
22520 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54  x on t1(a) has T
22530 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75  EXT affinity. Bu
22540 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72  t since.** the r
22550 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f  ight hand side o
22560 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  f the equality c
22570 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29  onstraint (t2.b)
22580 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69   has NONE affini
22590 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72  ty,.** no conver
225a0 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61  sion should be a
225b0 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20  ttempted before 
225c0 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c  using a t2.b val
225d0 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a  ue as part of.**
225e0 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68   a key to search
225f0 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63   the index. Henc
22600 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
22610 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
22620 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72   affinity.** str
22630 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d  ing in this exam
22640 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74  ple would be set
22650 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   to SQLITE_AFF_N
22660 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ONE..*/.static i
22670 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69  nt codeAllEquali
22680 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  tyTerms(.  Parse
22690 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
226a0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
226b0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ext */.  WhereLe
226c0 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f  vel *pLevel,   /
226d0 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c  * Which nested l
226e0 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  oop of the FROM 
226f0 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f  we are coding */
22700 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
22710 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pWC,     /* The 
22720 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
22730 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
22740 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68  dy,     /* Which
22750 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68   parts of FROM h
22760 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
22770 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
22780 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20  nExtraReg,      
22790 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
227a0 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74  xtra registers t
227b0 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
227c0 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20  char **pzAff    
227d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
227e0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66  t to point to af
227f0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
22800 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  .){.  int nEq = 
22810 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
22820 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ;   /* The numbe
22830 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
22840 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
22850 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
22860 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
22870 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75       /* The vm u
22880 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
22890 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
228a0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
228b0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
228c0 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  x being used for
228d0 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
228e0 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65  int iCur = pLeve
228f0 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a  l->iTabCur;   /*
22900 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
22910 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
22920 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
22930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22940 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
22950 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  nt term */.  int
22960 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
22970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
22980 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
22990 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
229b0 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 2a   Base register *
229c0 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20  /.  int nReg;   
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
229f0 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
22a00 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cate */.  char *
22a10 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  zAff;           
22a20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
22a30 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65  ity string to re
22a40 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  turn */..  /* Th
22a50 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c  is module is onl
22a60 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72  y called on quer
22a70 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65  y plans that use
22a80 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20   an index. */.  
22a90 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
22aa0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
22ab0 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a  HERE_INDEXED );.
22ac0 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
22ad0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20  >plan.u.pIdx;.. 
22ae0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
22af0 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63  ow many memory c
22b00 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  ells we will nee
22b10 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  d then allocate 
22b20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67  them..  */.  reg
22b30 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Base = pParse->n
22b40 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20  Mem + 1;.  nReg 
22b50 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  = pLevel->plan.n
22b60 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a  Eq + nExtraReg;.
22b70 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
22b80 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20  = nReg;..  zAff 
22b90 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
22ba0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71  p(pParse->db, sq
22bb0 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
22bc0 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b  tyStr(v, pIdx));
22bd0 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a  .  if( !zAff ){.
22be0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
22bf0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
22c00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c  ;.  }..  /* Eval
22c10 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
22c20 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
22c30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  */.  assert( pId
22c40 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20  x->nColumn>=nEq 
22c50 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
22c60 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  nEq; j++){.    i
22c70 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b  nt r1;.    int k
22c80 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
22c90 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20  n[j];.    pTerm 
22ca0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
22cb0 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
22cc0 79 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  y, pLevel->plan.
22cd0 77 73 46 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a  wsFlags, pIdx);.
22ce0 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
22cf0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 2f 2a   ) break;.    /*
22d00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
22d10 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20  rue for indices 
22d20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63  with redundant c
22d30 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20  olumns. .    ** 
22d40 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58  Ex: CREATE INDEX
22d50 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29   i1 ON t1(a,b,a)
22d60 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
22d70 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44  t1 WHERE a=0 AND
22d80 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73   b=0; */.    tes
22d90 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77  tcase( (pTerm->w
22da0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
22db0 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  DED)!=0 );.    t
22dc0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
22dd0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
22de0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
22df0 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
22e00 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45  /.    r1 = codeE
22e10 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
22e20 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
22e30 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  l, regBase+j);. 
22e40 20 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61     if( r1!=regBa
22e50 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66  se+j ){.      if
22e60 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nReg==1 ){.   
22e70 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
22e80 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
22e90 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20  e, regBase);.   
22ea0 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72       regBase = r
22eb0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
22ec0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22ed0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22ee0 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61  SCopy, r1, regBa
22ef0 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  se+j);.      }. 
22f00 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
22f10 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
22f20 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
22f30 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
22f40 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
22f50 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
22f60 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
22f70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
22f80 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29  ULL|WO_IN))==0 )
22f90 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
22fa0 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45  ight = pTerm->pE
22fb0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
22fc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
22fd0 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
22fe0 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
22ff0 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  j, pLevel->addrB
23000 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  rk);.      if( z
23010 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
23020 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
23030 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
23040 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49  , zAff[j])==SQLI
23050 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
23060 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
23070 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
23080 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
23090 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
230a0 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
230b0 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
230c0 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20  t, zAff[j]) ){. 
230d0 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
230e0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
230f0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
23100 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23110 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b    *pzAff = zAff;
23120 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73  .  return regBas
23130 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
23140 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
23150 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  N./*.** This rou
23160 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72  tine is a helper
23170 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65   for explainInde
23180 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a  xRange() below.*
23190 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20  *.** pStr holds 
231a0 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
231b0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77  xpression that w
231c0 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75  e are building u
231d0 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74  p one term.** at
231e0 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
231f0 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65  outine adds a ne
23200 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e  w term to the en
23210 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  d of the express
23220 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72  ion..** Terms ar
23230 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41  e separated by A
23240 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41  ND so add the "A
23250 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63  ND" text for sec
23260 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ond and subseque
23270 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  nt.** terms only
23280 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23290 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
232a0 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a  rm(.  StrAccum *
232b0 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  pStr,           
232c0 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78    /* The text ex
232d0 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62  pression being b
232e0 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  uilt */.  int iT
232f0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
23300 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
23310 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69  f this term.  Fi
23320 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20  rst is zero */. 
23330 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
23340 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  lumn,        /* 
23350 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
23360 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
23370 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20  ar *zOp         
23380 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
23390 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29  he operator */.)
233a0 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20  {.  if( iTerm ) 
233b0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
233c0 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e  ppend(pStr, " AN
233d0 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74  D ", 5);.  sqlit
233e0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
233f0 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  (pStr, zColumn, 
23400 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  -1);.  sqlite3St
23410 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
23420 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71  r, zOp, 1);.  sq
23430 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
23440 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31  end(pStr, "?", 1
23450 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  );.}../*.** Argu
23460 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63  ment pLevel desc
23470 72 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79  ribes a strategy
23480 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61   for scanning ta
23490 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a  ble pTab. This .
234a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
234b0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
234c0 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
234d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65   containing a de
234e0 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20  scription.** of 
234f0 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61  the subset of ta
23500 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64  ble rows scanned
23510 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79   by the strategy
23520 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20   in the form of 
23530 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73  an.** SQL expres
23540 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c  sion. Or, if all
23550 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65   rows are scanne
23560 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  d, NULL is retur
23570 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ned..**.** For e
23580 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71  xample, if the q
23590 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  uery:.**.**   SE
235a0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
235b0 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32  HERE a=1 AND b>2
235c0 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61  ;.**.** is run a
235d0 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  nd there is an i
235e0 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20  ndex on (a, b), 
235f0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
23600 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
23610 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74  string similar t
23620 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20  o:.**.**   "a=? 
23630 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54  AND b>?".**.** T
23640 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
23650 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65  ter points to me
23660 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
23670 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
23680 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74  oc()..** It is t
23690 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
236a0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
236b0 74 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66  to free the buff
236c0 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  er when it is.**
236d0 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   no longer requi
236e0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  red..*/.static c
236f0 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65  har *explainInde
23700 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a  xRange(sqlite3 *
23710 64 62 2c 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  db, WhereLevel *
23720 70 4c 65 76 65 6c 2c 20 54 61 62 6c 65 20 2a 70  pLevel, Table *p
23730 54 61 62 29 7b 0a 20 20 57 68 65 72 65 50 6c 61  Tab){.  WherePla
23740 6e 20 2a 70 50 6c 61 6e 20 3d 20 26 70 4c 65 76  n *pPlan = &pLev
23750 65 6c 2d 3e 70 6c 61 6e 3b 0a 20 20 49 6e 64 65  el->plan;.  Inde
23760 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 50 6c 61  x *pIndex = pPla
23770 6e 2d 3e 75 2e 70 49 64 78 3b 0a 20 20 69 6e 74  n->u.pIdx;.  int
23780 20 6e 45 71 20 3d 20 70 50 6c 61 6e 2d 3e 6e 45   nEq = pPlan->nE
23790 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  q;.  int i, j;. 
237a0 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20   Column *aCol = 
237b0 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e  pTab->aCol;.  in
237c0 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49  t *aiColumn = pI
237d0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a  ndex->aiColumn;.
237e0 20 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a    StrAccum txt;.
237f0 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26  .  if( nEq==0 &&
23800 20 28 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73   (pPlan->wsFlags
23810 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49   & (WHERE_BTM_LI
23820 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
23830 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  MIT))==0 ){.    
23840 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
23850 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
23860 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20  nit(&txt, 0, 0, 
23870 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
23880 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64  H);.  txt.db = d
23890 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  b;.  sqlite3StrA
238a0 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
238b0 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72   " (", 2);.  for
238c0 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b  (i=0; i<nEq; i++
238d0 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  ){.    explainAp
238e0 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
238f0 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  , aCol[aiColumn[
23900 69 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b  i]].zName, "=");
23910 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20  .  }..  j = i;. 
23920 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c   if( pPlan->wsFl
23930 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
23940 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
23950 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d  *z = (j==pIndex-
23960 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f  >nColumn ) ? "ro
23970 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
23980 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
23990 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
239a0 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c  dTerm(&txt, i++,
239b0 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20   z, ">");.  }.  
239c0 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61  if( pPlan->wsFla
239d0 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  gs&WHERE_TOP_LIM
239e0 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  IT ){.    char *
239f0 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e  z = (j==pIndex->
23a00 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77  nColumn ) ? "row
23a10 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
23a20 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
23a30 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
23a40 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
23a50 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   "<");.  }.  sql
23a60 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
23a70 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29  nd(&txt, ")", 1)
23a80 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
23a90 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
23aa0 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&txt);.}../*.**
23ab0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
23ac0 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
23ad0 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
23ae0 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e  ssing an EXPLAIN
23af0 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63   QUERY PLAN.** c
23b00 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71  ommand. If the q
23b10 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69  uery being compi
23b20 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49  led is an EXPLAI
23b30 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20  N QUERY PLAN, a 
23b40 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64  single.** record
23b50 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
23b60 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72   output to descr
23b70 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63  ibe the table sc
23b80 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a  an strategy in .
23b90 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ** pLevel..*/.st
23ba0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
23bb0 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73  nOneScan(.  Pars
23bc0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
23be0 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
23bf0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
23c00 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
23c10 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20    /* Table list 
23c20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73  this loop refers
23c30 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65   to */.  WhereLe
23c40 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
23c50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e           /* Scan
23c60 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70   to write OP_Exp
23c70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20  lain opcode for 
23c80 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
23c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ca0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
23cb0 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  r "level" column
23cc0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
23cd0 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cf0 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72  /* Value for "fr
23d00 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  om" column of ou
23d10 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63  tput */.  u16 wc
23d20 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
23d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
23d40 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  gs passed to sql
23d50 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
23d60 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61   */.){.  if( pPa
23d70 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
23d80 29 7b 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73  ){.    u32 flags
23d90 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
23da0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 73 74 72  wsFlags;.    str
23db0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
23dc0 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
23dd0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
23de0 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20  From];.    Vdbe 
23df0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
23e00 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62  be;      /* VM b
23e10 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
23e20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20   */.    sqlite3 
23e30 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
23e40 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
23e50 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  e handle */.    
23e60 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20  char *zMsg;     
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23e80 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20   Text to add to 
23e90 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
23ea0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
23eb0 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
23ec0 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62  /* Expected numb
23ed0 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
23ee0 65 64 20 62 79 20 73 63 61 6e 20 2a 2f 0a 20 20  ed by scan */.  
23ef0 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72    int iId = pPar
23f00 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20  se->iSelectId;  
23f10 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65  /* Select id (le
23f20 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63  ft-most output c
23f30 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  olumn) */.    in
23f40 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20  t isSearch;     
23f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23f60 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48  rue for a SEARCH
23f70 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e  . False for SCAN
23f80 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 28 66  . */..    if( (f
23f90 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
23fa0 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c  _OR) || (wctrlFl
23fb0 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
23fc0 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72  LE_ONLY) ) retur
23fd0 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68  n;..    isSearch
23fe0 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
23ff0 2e 6e 45 71 3e 30 29 0a 20 20 20 20 20 20 20 20  .nEq>0).        
24000 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 28       || (flags&(
24010 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
24020 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
24030 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
24040 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73    || (wctrlFlags
24050 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  &(WHERE_ORDERBY_
24060 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42  MIN|WHERE_ORDERB
24070 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d  Y_MAX));..    zM
24080 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
24090 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73  ntf(db, "%s", is
240a0 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a  Search?"SEARCH":
240b0 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28  "SCAN");.    if(
240c0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
240d0 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
240e0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
240f0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55  db, zMsg, "%s SU
24100 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67  BQUERY %d", zMsg
24110 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  ,pItem->iSelectI
24120 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
24130 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
24140 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
24150 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20  zMsg, "%s TABLE 
24160 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
24170 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
24180 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
24190 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
241a0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
241b0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
241c0 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73   "%s AS %s", zMs
241d0 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  g, pItem->zAlias
241e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
241f0 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
24200 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20  INDEXED)!=0 ){. 
24210 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72       char *zWher
24220 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  e = explainIndex
24230 52 61 6e 67 65 28 64 62 2c 20 70 4c 65 76 65 6c  Range(db, pLevel
24240 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
24250 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
24260 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
24270 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47   zMsg, "%s USING
24280 20 25 73 25 73 49 4e 44 45 58 25 73 25 73 25 73   %s%sINDEX%s%s%s
24290 22 2c 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20 20  ", zMsg, .      
242a0 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
242b0 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f  ERE_TEMP_INDEX)?
242c0 22 41 55 54 4f 4d 41 54 49 43 20 22 3a 22 22 29  "AUTOMATIC ":"")
242d0 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c  ,.          ((fl
242e0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
242f0 4f 4e 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47 20  ONLY)?"COVERING 
24300 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20  ":""),.         
24310 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
24320 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a  _TEMP_INDEX)?"":
24330 22 20 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20  " "),.          
24340 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
24350 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 20  TEMP_INDEX)?"": 
24360 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
24370 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20  Idx->zName),.   
24380 20 20 20 20 20 20 20 7a 57 68 65 72 65 0a 20 20         zWhere.  
24390 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
243a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
243b0 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Where);.    }els
243c0 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 57  e if( flags & (W
243d0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
243e0 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
243f0 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
24400 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
24410 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55  (db, zMsg, "%s U
24420 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49  SING INTEGER PRI
24430 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
24440 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ;..      if( fla
24450 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  gs&WHERE_ROWID_E
24460 51 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  Q ){.        zMs
24470 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
24480 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
24490 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d  s (rowid=?)", zM
244a0 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
244b0 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
244c0 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57  E_BOTH_LIMIT)==W
244d0 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20  HERE_BOTH_LIMIT 
244e0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
244f0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
24500 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
24510 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77  (rowid>? AND row
24520 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
24530 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
24540 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
24550 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
24560 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
24570 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
24580 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c   "%s (rowid>?)",
24590 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
245a0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48  lse if( flags&WH
245b0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
245c0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
245d0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
245e0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
245f0 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid<?)", zMsg);
24600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
24610 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24620 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
24630 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c      else if( (fl
24640 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
24650 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
24660 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
24670 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49  dex_info *pVtabI
24680 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
24690 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20  n.u.pVtabIdx;.  
246a0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
246b0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
246c0 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c  Msg, "%s VIRTUAL
246d0 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
246e0 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  %s", zMsg,.     
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74               pVt
24700 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70  abIdx->idxNum, p
24710 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72 29  VtabIdx->idxStr)
24720 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
24730 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
24740 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59  s&(WHERE_ORDERBY
24750 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52  _MIN|WHERE_ORDER
24760 42 59 5f 4d 41 58 29 20 29 7b 0a 20 20 20 20 20  BY_MAX) ){.     
24770 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
24780 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
24790 44 45 52 42 59 5f 4d 49 4e 20 29 3b 0a 20 20 20  DERBY_MIN );.   
247a0 20 20 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20     nRow = 1;.   
247b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
247c0 6f 77 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  ow = (sqlite3_in
247d0 74 36 34 29 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  t64)pLevel->plan
247e0 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 20  .nRow;.    }.   
247f0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
24800 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
24810 2c 20 22 25 73 20 28 7e 25 6c 6c 64 20 72 6f 77  , "%s (~%lld row
24820 73 29 22 2c 20 7a 4d 73 67 2c 20 6e 52 6f 77 29  s)", zMsg, nRow)
24830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
24840 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
24850 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76  plain, iId, iLev
24860 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c  el, iFrom, zMsg,
24870 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
24880 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
24890 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61  ne explainOneSca
248a0 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23  n(u,v,w,x,y,z).#
248b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
248c0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
248d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
248e0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74   code for the st
248f0 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65  art of the iLeve
24900 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65  l-th loop in the
24910 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a   WHERE clause.**
24920 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
24930 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49  described by pWI
24940 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  nfo..*/.static B
24950 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f  itmask codeOneLo
24960 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65  opStart(.  Where
24970 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
24980 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f  /* Complete info
24990 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
249a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
249b0 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
249c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
249d0 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66  h level of pWInf
249e0 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65  o->a[] should be
249f0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36 20   coded */.  u16 
24a00 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
24a10 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
24a20 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
24a30 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
24a40 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  t.h */.  Bitmask
24a50 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a   notReady     /*
24a60 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72   Which tables ar
24a70 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  e currently avai
24a80 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lable */.){.  in
24a90 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  t j, k;         
24aa0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
24ab0 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ers */.  int iCu
24ac0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
24ad0 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
24ae0 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
24af0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b  /.  int addrNxt;
24b00 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
24b10 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e  e to jump to con
24b20 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
24b30 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20  ext IN case */. 
24b40 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20   int omitTable; 
24b50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
24b60 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65   we use the inde
24b70 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  x only */.  int 
24b80 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  bRev;           
24b90 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e   /* True if we n
24ba0 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  eed to scan in r
24bb0 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
24bc0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
24bd0 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68  evel;  /* The wh
24be0 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20  ere level to be 
24bf0 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
24c00 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
24c10 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
24c20 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 57   of the entire W
24c30 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
24c40 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
24c50 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
24c60 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75   /* A WHERE clau
24c70 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72  se term */.  Par
24c80 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
24c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ca0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
24cb0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cd0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
24ce0 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20  ared stmt under 
24cf0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f  constructions */
24d00 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
24d10 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
24d20 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ;  /* FROM claus
24d30 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64  e term being cod
24d40 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
24d50 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Brk;            
24d60 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
24d70 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
24d80 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  t of the loop */
24d90 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b  .  int addrCont;
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24db0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
24dc0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
24dd0 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
24de0 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d   int iRowidReg =
24df0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f   0;        /* Ro
24e00 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  wid is stored in
24e10 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20   this register, 
24e20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20  if not zero */. 
24e30 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67   int iReleaseReg
24e40 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65   = 0;      /* Te
24e50 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
24e60 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ree before retur
24e70 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73  ning */..  pPars
24e80 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
24e90 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  se;.  v = pParse
24ea0 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d  ->pVdbe;.  pWC =
24eb0 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20   pWInfo->pWC;.  
24ec0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
24ed0 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70  ->a[iLevel];.  p
24ee0 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66  TabItem = &pWInf
24ef0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
24f00 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
24f10 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
24f20 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65  ->iCursor;.  bRe
24f30 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  v = (pLevel->pla
24f40 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
24f50 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20  E_REVERSE)!=0;. 
24f60 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
24f70 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
24f80 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
24f90 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20  NLY)!=0 .       
24fa0 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
24fb0 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45  gs & WHERE_FORCE
24fc0 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20 2f  _TABLE)==0;..  /
24fd0 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
24fe0 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20  for the "break" 
24ff0 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69  and "continue" i
25000 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a  nstructions.  **
25010 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
25020 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20   loop.  Jump to 
25030 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b  addrBrk to break
25040 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
25050 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e    ** Jump to con
25060 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74  t to go immediat
25070 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ely to the next 
25080 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
25090 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  .  ** loop..  **
250a0 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65  .  ** When there
250b0 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
250c0 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65  or, we also have
250d0 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62   a "addrNxt" lab
250e0 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61  el that.  ** mea
250f0 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  ns to continue w
25100 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
25110 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f  value combinatio
25120 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68  n.  When.  ** th
25130 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70  ere are no IN op
25140 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63  erators in the c
25150 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20  onstraints, the 
25160 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a  "addrNxt" label.
25170 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
25180 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20   as "addrBrk".. 
25190 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20   */.  addrBrk = 
251a0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20  pLevel->addrBrk 
251b0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
251c0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
251d0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61  akeLabel(v);.  a
251e0 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c  ddrCont = pLevel
251f0 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c  ->addrCont = sql
25200 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
25210 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  l(v);..  /* If t
25220 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74  his is the right
25230 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
25240 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c   OUTER JOIN, all
25250 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69  ocate and.  ** i
25260 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f  nitialize a memo
25270 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63  ry cell that rec
25280 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62  ords if this tab
25290 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20  le matches any. 
252a0 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
252b0 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
252c0 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   join..  */.  if
252d0 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e  ( pLevel->iFrom>
252e0 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30  0 && (pTabItem[0
252f0 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
25300 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
25310 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
25320 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
25330 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
25340 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25350 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76  Integer, 0, pLev
25360 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
25370 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
25380 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a  (v, "init LEFT J
25390 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61  OIN no-match fla
253a0 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  g"));.  }..  /* 
253b0 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  Special case of 
253c0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75  a FROM clause su
253d0 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74  bquery implement
253e0 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
253f0 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  ne */.  if( pTab
25400 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
25410 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  ne ){.    int re
25420 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65  gYield = pTabIte
25430 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
25440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25450 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
25460 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64  r, pTabItem->add
25470 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59  rFillSub-1, regY
25480 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76 65  ield);.    pLeve
25490 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33  l->p2 =  sqlite3
254a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
254b0 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64  _Yield, regYield
254c0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
254d0 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77  nt((v, "next row
254e0 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25   of co-routine %
254f0 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  s", pTabItem->pT
25500 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
25510 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25520 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
25530 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b  Yield+1, addrBrk
25540 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
25550 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d  p = OP_Goto;.  }
25560 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
25570 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
25580 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70  LTABLE.  if(  (p
25590 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
255a0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
255b0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
255c0 20 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20      /* Case 0:  
255d0 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76  The table is a v
255e0 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55  irtual-table.  U
255f0 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61  se the VFilter a
25600 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20  nd VNext.    ** 
25610 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65           to acce
25620 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20  ss the data..   
25630 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67   */.    int iReg
25640 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20  ;   /* P3 Value 
25650 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a  for OP_VFilter *
25660 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
25670 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49  dex_info *pVtabI
25680 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
25690 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20  n.u.pVtabIdx;.  
256a0 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
256b0 74 20 3d 20 70 56 74 61 62 49 64 78 2d 3e 6e 43  t = pVtabIdx->nC
256c0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 73  onstraint;.    s
256d0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
256e0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
256f0 73 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20  sage *aUsage =. 
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25730 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72  VtabIdx->aConstr
25740 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 63  aintUsage;.    c
25750 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69  onst struct sqli
25760 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
25770 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e  aint *aConstrain
25780 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257b0 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43      pVtabIdx->aC
257c0 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20  onstraint;..    
257d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
257e0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
257f0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
25800 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
25810 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  rse, nConstraint
25820 2b 32 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  +2);.    for(j=1
25830 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ; j<=nConstraint
25840 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; j++){.      fo
25850 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72  r(k=0; k<nConstr
25860 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  aint; k++){.    
25870 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b      if( aUsage[k
25880 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29  ].argvIndex==j )
25890 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
258a0 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61  iTerm = aConstra
258b0 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73  int[k].iTermOffs
258c0 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  et;.          sq
258d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
258e0 61 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65  arse, pWC->a[iTe
258f0 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm].pExpr->pRigh
25900 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20  t, iReg+j+1);.  
25910 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25930 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43  .      if( k==nC
25940 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65 61  onstraint ) brea
25950 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  k;.    }.    sql
25960 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25970 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 56  , OP_Integer, pV
25980 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20  tabIdx->idxNum, 
25990 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  iReg);.    sqlit
259a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
259b0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c  OP_Integer, j-1,
259c0 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
259d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
259e0 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
259f0 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 69 52  Cur, addrBrk, iR
25a00 65 67 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64  eg, pVtabIdx->id
25a10 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
25a20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
25a30 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65  bIdx->needToFree
25a40 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52 49  IdxStr ? P4_MPRI
25a50 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29  NTF : P4_STATIC)
25a60 3b 0a 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e  ;.    pVtabIdx->
25a70 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
25a80 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
25a90 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; j<nConstraint
25aa0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
25ab0 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74  ( aUsage[j].omit
25ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
25ad0 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61  iTerm = aConstra
25ae0 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  int[j].iTermOffs
25af0 65 74 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61  et;.        disa
25b00 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
25b10 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b  &pWC->a[iTerm]);
25b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25b30 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
25b40 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c  OP_VNext;.    pL
25b50 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
25b60 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
25b70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
25b80 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
25b90 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
25ba0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
25bb0 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69   iReg, nConstrai
25bc0 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  nt+2);.    sqlit
25bd0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
25be0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c  Parse, 1);.  }el
25bf0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
25c00 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
25c10 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20  TABLE */..  if( 
25c20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
25c30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
25c40 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20  ID_EQ ){.    /* 
25c50 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20  Case 1:  We can 
25c60 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
25c70 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
25c80 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
25c90 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74           equalit
25ca0 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
25cb0 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
25cc0 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a  ield.  Or.    **
25cd0 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66            we ref
25ce0 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20  erence multiple 
25cf0 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f  rows using a "ro
25d00 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20  wid IN (...)".  
25d10 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
25d20 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a  nstruct..    */.
25d30 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20      iReleaseReg 
25d40 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
25d50 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
25d60 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
25d70 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
25d80 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
25d90 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20  |WO_IN, 0);.    
25da0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
25db0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
25dc0 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
25dd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25de0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
25df0 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 61 73  ==iCur );.    as
25e00 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
25e10 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
25e20 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
25e30 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
25e40 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
25e50 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
25e60 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64   iRowidReg = cod
25e70 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
25e80 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
25e90 76 65 6c 2c 20 69 52 65 6c 65 61 73 65 52 65 67  vel, iReleaseReg
25ea0 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d  );.    addrNxt =
25eb0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
25ec0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
25ed0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
25ee0 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52  stBeInt, iRowidR
25ef0 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  eg, addrNxt);.  
25f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25f10 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
25f20 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  sts, iCur, addrN
25f30 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  xt, iRowidReg);.
25f40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25f50 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
25f60 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
25f70 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65  idReg);.    Vdbe
25f80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
25f90 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ));.    pLevel->
25fa0 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
25fb0 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
25fc0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
25fd0 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
25fe0 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  GE ){.    /* Cas
25ff0 65 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 2:  We have an
26000 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
26010 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
26020 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
26030 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74      */.    int t
26040 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
26050 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a  .    int start;.
26060 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61      int memEndVa
26070 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  lue = 0;.    Whe
26080 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20  reTerm *pStart, 
26090 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65  *pEnd;..    asse
260a0 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
260b0 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   );.    pStart =
260c0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
260d0 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
260e0 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
260f0 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 66  0);.    pEnd = f
26100 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
26110 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
26120 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29   WO_LT|WO_LE, 0)
26130 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29  ;.    if( bRev )
26140 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
26150 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53  pStart;.      pS
26160 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
26170 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
26180 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
26190 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
261a0 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
261b0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
261c0 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69  ession that defi
261d0 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f  nes the start bo
261e0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
261f0 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20   r1, rTemp;     
26200 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
26210 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  for holding the 
26220 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a  start boundary *
26230 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
26240 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61  following consta
26250 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f  nt maps TK_xx co
26260 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70  des into corresp
26270 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  onding .      **
26280 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20   seek opcodes.  
26290 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20  It depends on a 
262a0 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
262b0 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20  ing of TK_xx.   
262c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
262d0 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d  t u8 aMoveOp[] =
262e0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {.           /*
262f0 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_GT */  OP_Se
26300 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ekGt,.          
26310 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50   /* TK_LE */  OP
26320 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20  _SeekLe,.       
26330 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20      /* TK_LT */ 
26340 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20   OP_SeekLt,.    
26350 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20         /* TK_GE 
26360 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20  */  OP_SeekGe.  
26370 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73      };.      ass
26380 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47  ert( TK_LE==TK_G
26390 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d  T+1 );      /* M
263a0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64  ake sure the ord
263b0 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20  ering.. */.     
263c0 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
263d0 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20  TK_GT+2 );      
263e0 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54  /*  ... of the T
263f0 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a  K_xx values... *
26400 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
26410 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29  TK_GE==TK_GT+3 )
26420 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69  ;      /*  ... i
26430 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a  s correcct. */..
26440 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26450 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
26460 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
26470 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
26480 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20  -11662 */.      
26490 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78  pX = pStart->pEx
264a0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
264b0 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
264c0 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d   assert( pStart-
264d0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
264e0 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  r );.      r1 = 
264f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
26500 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  emp(pParse, pX->
26510 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b  pRight, &rTemp);
26520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26530 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76  beAddOp3(v, aMov
26540 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54  eOp[pX->op-TK_GT
26550 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
26560 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
26570 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
26580 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
26590 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
265a0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
265b0 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
265c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
265d0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54  mpReg(pParse, rT
265e0 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61  emp);.      disa
265f0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
26600 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c  pStart);.    }el
26610 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
26620 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
26630 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
26640 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
26650 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d   addrBrk);.    }
26660 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
26670 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
26680 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64  .      pX = pEnd
26690 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
266a0 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
266b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
266c0 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  nd->leftCursor==
266d0 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65  iCur );.      te
266e0 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74  stcase( pEnd->wt
266f0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
26700 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
26710 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
26720 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75        memEndValu
26730 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  e = ++pParse->nM
26740 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
26750 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
26760 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65  , pX->pRight, me
26770 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20  mEndValue);.    
26780 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
26790 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LT || pX->op==T
267a0 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20  K_GT ){.        
267b0 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
267c0 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20  OP_Le : OP_Ge;. 
267d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
267e0 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
267f0 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
26800 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
26810 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
26820 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
26830 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71  }.    start = sq
26840 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
26850 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65  Addr(v);.    pLe
26860 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
26870 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
26880 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
26890 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
268a0 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
268b0 74 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  t;.    if( pStar
268c0 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20  t==0 && pEnd==0 
268d0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
268e0 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
268f0 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
26900 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65  _STEP;.    }else
26910 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26920 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b  pLevel->p5==0 );
26930 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74  .    }.    if( t
26940 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
26950 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
26960 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
26970 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
26980 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
26990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
269a0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
269b0 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65  , iCur, iRowidRe
269c0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
269d0 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
269e0 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
269f0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
26a00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26a10 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c  ddOp3(v, testOp,
26a20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64   memEndValue, ad
26a30 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67  drBrk, iRowidReg
26a40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26a50 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
26a60 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
26a70 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  IC | SQLITE_JUMP
26a80 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  IFNULL);.    }. 
26a90 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
26aa0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
26ab0 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
26ac0 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55  RANGE|WHERE_COLU
26ad0 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a  MN_EQ) ){.    /*
26ae0 20 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20   Case 3: A scan 
26af0 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a  using an index..
26b00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
26b10 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20        The WHERE 
26b20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61  clause may conta
26b30 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  in zero or more 
26b40 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a  equality .    **
26b50 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28           terms (
26b60 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65  "==" or "IN" ope
26b70 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66  rators) that ref
26b80 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20  er to the N.    
26b90 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d  **         left-
26ba0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  most columns of 
26bb0 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61  the index. It ma
26bc0 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20  y also contain. 
26bd0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
26be0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
26bf0 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f  ints (>, <, >= o
26c00 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64  r <=) on the ind
26c10 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  exed.    **     
26c20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20      column that 
26c30 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
26c40 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69  ows the N equali
26c50 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20  ties. Only .    
26c60 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72  **         the r
26c70 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
26c80 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75   can be an inequ
26c90 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74  ality - the rest
26ca0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20   must.    **    
26cb0 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
26cc0 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61  " and "IN" opera
26cd0 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
26ce0 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
26cf0 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20  *         index 
26d00 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74  is on (x,y,z), t
26d10 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
26d20 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c  g clauses are al
26d30 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  l .    **       
26d40 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20    optimized:.   
26d50 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
26d60 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a        x=5.    **
26d70 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
26d80 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20  AND y=10.    ** 
26d90 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
26da0 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
26db0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
26dc0 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20  D y>5 AND y<10. 
26dd0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
26de0 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44   x=5 AND y=5 AND
26df0 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20   z<=10.    **.  
26e00 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
26e10 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68   z<10 term of th
26e20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e  e following cann
26e30 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79  ot be used, only
26e40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
26e50 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20  the x=5 term:.  
26e60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
26e70 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a         x=5 AND z
26e80 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <10.    **.    *
26e90 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20  *         N may 
26ea0 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  be zero if there
26eb0 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
26ec0 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
26ed0 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74   **         If t
26ee0 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71  here are no ineq
26ef0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
26f00 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74  ts, then N is at
26f10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
26f20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a  least one..    *
26f30 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
26f40 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c   This case is al
26f50 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  so used when the
26f60 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
26f70 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20  clause.    **   
26f80 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
26f90 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69  s but an index i
26fa0 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61  s selected anywa
26fb0 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20  y, in order.    
26fc0 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f  **         to fo
26fd0 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  rce the output o
26fe0 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20  rder to conform 
26ff0 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a  to an ORDER BY..
27000 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61      */  .    sta
27010 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
27020 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  artOp[] = {.    
27030 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20    0,.      0,.  
27040 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20      OP_Rewind,  
27050 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
27060 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
27070 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
27080 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20    !bRev) */.    
27090 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20    OP_Last,      
270a0 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73         /* 3: (!s
270b0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
270c0 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
270d0 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
270e0 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20  OP_SeekGt,      
270f0 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72       /* 4: (star
27100 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
27110 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62  & !startEq && !b
27120 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
27130 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20  _SeekLt,        
27140 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f     /* 5: (start_
27150 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
27160 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65  !startEq &&  bRe
27170 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
27180 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20  eekGe,          
27190 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f   /* 6: (start_co
271a0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
271b0 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
271c0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
271d0 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  kLe            /
271e0 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 7: (start_cons
271f0 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
27200 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
27210 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61  /.    };.    sta
27220 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e  tic const u8 aEn
27230 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  dOp[] = {.      
27240 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20  OP_Noop,        
27250 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64       /* 0: (!end
27260 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f  _constraints) */
27270 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c  .      OP_IdxGE,
27280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
27290 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
272a0 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  ts && !bRev) */.
272b0 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20        OP_IdxLT  
272c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
272d0 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
272e0 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20  s && bRev) */.  
272f0 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71    };.    int nEq
27300 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
27310 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  nEq;  /* Number 
27320 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
27330 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d  s */.    int isM
27340 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  inQuery = 0;    
27350 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
27360 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
27370 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e   SELECT min(x)..
27380 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
27390 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
273a0 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
273b0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
273c0 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
273d0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20  */.    int r1;  
273e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273f0 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
27400 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72  ster */.    Wher
27410 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61  eTerm *pRangeSta
27420 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71  rt = 0;  /* Ineq
27430 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
27440 74 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74  t at range start
27450 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
27460 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30  m *pRangeEnd = 0
27470 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69  ;    /* Inequali
27480 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
27490 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20   range end */.  
274a0 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20    int startEq;  
274b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
274c0 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
274d0 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e  start uses ==, >
274e0 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
274f0 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20  nt endEq;       
27500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27510 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64  rue if range end
27520 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
27530 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  <= */.    int st
27540 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b  art_constraints;
27550 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
27560 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73  of range is cons
27570 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69  trained */.    i
27580 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
27590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
275a0 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
275b0 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  int terms */.   
275c0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
275d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
275e0 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
275f0 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
27600 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
27610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27620 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
27630 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
27640 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74   */.    int nExt
27650 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  raReg = 0;      
27660 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27670 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
27680 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
27690 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
276b0 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f  Instruction opco
276c0 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  de */.    char *
276d0 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20  zStartAff;      
276e0 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
276f0 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  ty for start of 
27700 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
27710 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   */.    char *zE
27720 6e 64 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  ndAff;          
27730 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
27740 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67   for end of rang
27750 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
27760 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76  .    pIdx = pLev
27770 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
27780 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
27790 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
277a0 20 20 20 20 6b 20 3d 20 28 6e 45 71 3d 3d 70 49      k = (nEq==pI
277b0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31  dx->nColumn ? -1
277c0 20 3a 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   : pIdx->aiColum
277d0 6e 5b 6e 45 71 5d 29 3b 0a 0a 20 20 20 20 2f 2a  n[nEq]);..    /*
277e0 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61   If this loop sa
277f0 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f  tisfies a sort o
27800 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20  rder (pOrderBy) 
27810 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20  request that .  
27820 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20    ** was passed 
27830 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
27840 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
27850 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e  "SELECT min(x) .
27860 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72  .." .    ** quer
27870 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  y, then the call
27880 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c  er will only all
27890 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72  ow the loop to r
278a0 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20  un for.    ** a 
278b0 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e  single iteration
278c0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
278d0 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  t the first row 
278e0 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20  returned.    ** 
278f0 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20  should not have 
27900 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f  a NULL value sto
27910 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63  red in 'x'. If c
27920 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20  olumn 'x' is.   
27930 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e   ** the first on
27940 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  e after the nEq 
27950 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
27960 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ints in the inde
27970 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72  x,.    ** this r
27980 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65  equires some spe
27990 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
279a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
279b0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
279c0 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
279d0 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
279e0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48  >plan.wsFlags&WH
279f0 45 52 45 5f 4f 52 44 45 52 45 44 29 0a 20 20 20  ERE_ORDERED).   
27a00 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c    && (pIdx->nCol
27a10 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a  umn>nEq).    ){.
27a20 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
27a30 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
27a40 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  ==1 ); */.      
27a50 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  /* assert( pOrde
27a60 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  rBy->a[0].pExpr-
27a70 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
27a80 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b  aiColumn[nEq] );
27a90 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51   */.      isMinQ
27aa0 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
27ab0 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
27ac0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
27ad0 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79  d any inequality
27ae0 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
27af0 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  s for the start 
27b00 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20  and end .    ** 
27b10 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20  of the range. . 
27b20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
27b30 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
27b40 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
27b50 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
27b60 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65  angeEnd = findTe
27b70 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
27b80 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c   notReady, (WO_L
27b90 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b  T|WO_LE), pIdx);
27ba0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
27bb0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
27bc0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
27bd0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
27be0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
27bf0 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20      pRangeStart 
27c00 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
27c10 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
27c20 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29  y, (WO_GT|WO_GE)
27c30 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
27c40 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
27c50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
27c60 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
27c70 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
27c80 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
27c90 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a   == or IN.    **
27ca0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76   and store the v
27cb0 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
27cc0 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79  erms in an array
27cd0 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
27ce0 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
27cf0 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f   regBase..    */
27d00 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63  .    regBase = c
27d10 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
27d20 72 6d 73 28 0a 20 20 20 20 20 20 20 20 70 50 61  rms(.        pPa
27d30 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43  rse, pLevel, pWC
27d40 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78 74  , notReady, nExt
27d50 72 61 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66  raReg, &zStartAf
27d60 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e  f.    );.    zEn
27d70 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62  dAff = sqlite3Db
27d80 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
27d90 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  b, zStartAff);. 
27da0 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
27db0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20  vel->addrNxt;.. 
27dc0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
27dd0 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20  doing a reverse 
27de0 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e  order scan on an
27df0 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
27e00 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f  , or.    ** a fo
27e10 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e  rward order scan
27e20 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
27e30 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61   index, intercha
27e40 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nge the .    ** 
27e50 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
27e60 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
27e70 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
27e80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
27e90 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  (nEq<pIdx->nColu
27ea0 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  mn && bRev==(pId
27eb0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
27ec0 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
27ed0 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65  C)).     || (bRe
27ee0 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  v && pIdx->nColu
27ef0 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a  mn==nEq).    ){.
27f00 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
27f10 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
27f20 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
27f30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74  .    }..    test
27f40 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
27f50 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74  t && pRangeStart
27f60 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
27f70 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _LE );.    testc
27f80 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
27f90 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d   && pRangeStart-
27fa0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
27fb0 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  GE );.    testca
27fc0 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
27fd0 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
27fe0 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b  rator & WO_LE );
27ff0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
28000 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e  RangeEnd && pRan
28010 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
28020 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
28030 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67  startEq = !pRang
28040 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65  eStart || pRange
28050 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
28060 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
28070 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20  ;.    endEq =   
28080 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52  !pRangeEnd || pR
28090 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
280a0 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
280b0 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f  E);.    start_co
280c0 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e  nstraints = pRan
280d0 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30  geStart || nEq>0
280e0 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  ;..    /* Seek t
280f0 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
28100 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
28110 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
28120 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
28130 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
28140 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ngeStart ){.    
28150 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
28160 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
28170 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
28180 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
28190 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
281a0 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
281b0 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
281c0 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
281d0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
281e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
281f0 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75  ite3ExprCodeIsNu
28200 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74  llJump(v, pRight
28210 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61  , regBase+nEq, a
28220 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d  ddrNxt);.      }
28230 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72  .      if( zStar
28240 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  tAff ){.        
28250 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
28260 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
28270 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
28280 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
28290 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ONE){.          
282a0 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d  /* Since the com
282b0 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65  parison is to be
282c0 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20   performed with 
282d0 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20  no conversions. 
282e0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c           ** appl
282f0 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ied to the opera
28300 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66  nds, set the aff
28310 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74  inity to apply t
28320 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20  o pRight to .   
28330 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
28340 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20  _AFF_NONE.  */. 
28350 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
28360 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
28370 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
28380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
28390 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
283a0 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
283b0 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  e(pRight, zStart
283c0 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20  Aff[nEq]) ){.   
283d0 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
283e0 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
283f0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
28400 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
28410 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
28420 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28430 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77  ( pRangeStart->w
28440 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
28450 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
28460 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
28470 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
28480 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20  sMinQuery ){.   
28490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
284a0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
284b0 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29   0, regBase+nEq)
284c0 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
284d0 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61  int++;.      sta
284e0 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20  rtEq = 0;.      
284f0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
28500 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  s = 1;.    }.   
28510 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
28520 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ty(pParse, regBa
28530 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  se, nConstraint,
28540 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
28550 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28   op = aStartOp[(
28560 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
28570 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71  s<<2) + (startEq
28580 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20  <<1) + bRev];.  
28590 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20    assert( op!=0 
285a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
285b0 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29   op==OP_Rewind )
285c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
285d0 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20  op==OP_Last );. 
285e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
285f0 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20  =OP_SeekGt );.  
28600 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
28610 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20  OP_SeekGe );.   
28620 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
28630 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20  P_SeekLe );.    
28640 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
28650 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73  _SeekLt );.    s
28660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
28670 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Int(v, op, iIdxC
28680 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67  ur, addrNxt, reg
28690 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
286a0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64  t);..    /* Load
286b0 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
286c0 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
286d0 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20  nstraint at the 
286e0 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
286f0 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29  * range (if any)
28700 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f  ..    */.    nCo
28710 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
28720 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e      if( pRangeEn
28730 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  d ){.      Expr 
28740 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
28750 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  End->pExpr->pRig
28760 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
28770 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
28780 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
28790 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  +nEq, 1);.      
287a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
287b0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
287c0 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
287d0 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45      if( (pRangeE
287e0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
287f0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
28800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28810 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
28820 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67  p(v, pRight, reg
28830 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78  Base+nEq, addrNx
28840 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
28850 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b    if( zEndAff ){
28860 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
28870 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
28880 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64  ity(pRight, zEnd
28890 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54  Aff[nEq])==SQLIT
288a0 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20  E_AFF_NONE){.   
288b0 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
288c0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
288d0 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
288e0 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
288f0 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  sions.          
28900 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  ** applied to th
28910 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
28920 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
28930 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
28940 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to .          **
28950 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
28960 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
28970 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53  zEndAff[nEq] = S
28980 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
28990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
289a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
289b0 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
289c0 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
289d0 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a  EndAff[nEq]) ){.
289e0 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66            zEndAf
289f0 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
28a00 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
28a10 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
28a20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
28a30 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
28a40 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45  gBase, nEq+1, zE
28a50 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43  ndAff);.      nC
28a60 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
28a70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
28a80 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
28a90 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
28aa0 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
28ab0 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a  -11662 */.    }.
28ac0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
28ad0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53  e(pParse->db, zS
28ae0 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71  tartAff);.    sq
28af0 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
28b00 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29  se->db, zEndAff)
28b10 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  ;..    /* Top of
28b20 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a   the loop body *
28b30 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  /.    pLevel->p2
28b40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
28b50 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
28b60 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
28b70 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
28b80 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  is past the end 
28b90 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
28ba0 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70  .    op = aEndOp
28bb0 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e  [(pRangeEnd || n
28bc0 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29  Eq) * (1 + bRev)
28bd0 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ];.    testcase(
28be0 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a   op==OP_Noop );.
28bf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
28c00 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20  ==OP_IdxGE );.  
28c10 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
28c20 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20  OP_IdxLT );.    
28c30 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  if( op!=OP_Noop 
28c40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28c50 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
28c60 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
28c70 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
28c80 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
28c90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
28ca0 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71  hangeP5(v, endEq
28cb0 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20  !=bRev ?1:0);.  
28cc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
28cd0 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
28ce0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
28cf0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
28d00 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
28d10 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
28d20 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61   that the inequa
28d30 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69  lity contrains i
28d40 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20  s not NULL..    
28d50 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d  ** If it is, jum
28d60 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  p to the next it
28d70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
28d80 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
28d90 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
28da0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
28db0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
28dc0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
28dd0 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
28de0 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74  IMIT );.    test
28df0 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
28e00 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
28e10 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a  RE_TOP_LIMIT );.
28e20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
28e30 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
28e40 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
28e50 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
28e60 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
28e70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
28e80 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
28e90 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29  IdxCur, nEq, r1)
28ea0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28eb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
28ec0 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72  IsNull, r1, addr
28ed0 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cont);.    }.   
28ee0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
28ef0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
28f00 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  1);..    /* Seek
28f10 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
28f20 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
28f30 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
28f40 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
28f50 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
28f60 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
28f70 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
28f80 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29  if( !omitTable )
28f90 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
28fa0 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
28fb0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
28fc0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
28fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28fe0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
28ff0 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52  wid, iIdxCur, iR
29000 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
29010 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29020 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
29030 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
29040 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
29050 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
29060 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52  P_Seek, iCur, iR
29070 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65  owidReg);  /* De
29080 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
29090 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63     }..    /* Rec
290a0 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74  ord the instruct
290b0 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d  ion used to term
290c0 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
290d0 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20  Disable .    ** 
290e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
290f0 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e  ms made redundan
29100 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72  t by the index r
29110 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a  ange scan..    *
29120 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
29130 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
29140 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 29 7b   WHERE_UNIQUE ){
29150 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
29160 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
29170 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
29180 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
29190 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
291a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
291b0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
291c0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
291d0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
291e0 78 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 4c  xCur;.    if( pL
291f0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
29200 67 73 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52  gs & WHERE_COVER
29210 5f 53 43 41 4e 20 29 7b 0a 20 20 20 20 20 20 70  _SCAN ){.      p
29220 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
29230 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
29240 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
29250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
29260 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
29270 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ==0 );.    }.  }
29280 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
29290 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
292a0 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
292b0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
292c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
292d0 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20  TI_OR ){.    /* 
292e0 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72 20  Case 4:  Two or 
292f0 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20  more separately 
29300 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
29310 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20  nnected by OR.  
29320 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
29330 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
29340 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
29350 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20  E t1(a,b,c,d);. 
29360 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
29370 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
29380 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
29390 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31  E INDEX i2 ON t1
293a0 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (b);.    **   CR
293b0 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
293c0 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20   t1(c);.    **. 
293d0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
293e0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
293f0 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d  =5 OR b=7 OR (c=
29400 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20  11 AND d=13).   
29410 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68   **.    ** In th
29420 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65  e example, there
29430 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78   are three index
29440 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
29450 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a  ed by OR..    **
29460 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
29470 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
29480 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
29490 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
294a0 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
294b0 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
294c0 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
294d0 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  g 1.    **.    *
294e0 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68  * Then, for each
294f0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74   indexed term, t
29500 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68  he following. Th
29510 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
29520 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74     ** RowSetTest
29530 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74   are such that t
29540 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
29550 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69  current row is i
29560 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69  nserted.    ** i
29570 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20  nto the RowSet. 
29580 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
29590 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f   present, contro
295a0 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20  l skips the.    
295b0 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20  ** Gosub opcode 
295c0 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67  and jumps straig
295d0 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ht to the code g
295e0 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72  enerated by Wher
295f0 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  eEnd()..    **. 
29600 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
29610 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c  ite3WhereBegin(<
29620 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20  term>).    **   
29630 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73         RowSetTes
29640 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
29650 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69     # Insert rowi
29660 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20  d into rowset.  
29670 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
29680 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20  sub      2 A.   
29690 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
296a0 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20  e3WhereEnd().   
296b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f   **.    ** Follo
296c0 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20  wing the above, 
296d0 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74  code to terminat
296e0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65  e the loop. Labe
296f0 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a  l A, the target.
29700 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f      ** of the Go
29710 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73  sub above, jumps
29720 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
29730 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20  ion right after 
29740 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a  the Goto..    **
29750 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
29760 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
29780 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
29790 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20  n reg 1.    **  
297a0 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20          Goto    
297b0 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20     B            
297c0 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69      # The loop i
297d0 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
297e0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
297f0 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20  A: <loop body>  
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
29810 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68   Return data, wh
29820 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  atever..    **. 
29830 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
29840 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20  eturn     2     
29850 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d             # Jum
29860 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f  p back to the Go
29870 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sub.    **.    *
29880 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65  *       B: <afte
29890 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20  r the loop>.    
298a0 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
298b0 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
298c0 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
298d0 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
298e0 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
298f0 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
29900 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
29910 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
29920 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
29930 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
29940 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20      Index *pCov 
29950 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
29960 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f   /* Potential co
29970 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72  vering index (or
29980 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e   NULL) */.    in
29990 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72  t iCovCur = pPar
299a0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20  se->nTab++;  /* 
299b0 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  Cursor used for 
299c0 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20  index scans (if 
299d0 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  any) */..    int
299e0 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
299f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
29a00 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
29a10 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
29a20 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
29a30 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
29a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a50 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
29a60 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
29a70 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
29a80 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29aa0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
29ab0 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
29ac0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
29ad0 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
29ae0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
29af0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
29b00 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
29b10 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b30 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
29b40 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
29b50 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
29b60 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
29b70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
29b80 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74  * Some terms not
29b90 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74   completely test
29ba0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  ed */.    int ii
29bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29bd0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
29be0 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
29bf0 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
29c00 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
29c10 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
29c20 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20  ession */.   .  
29c30 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c    pTerm = pLevel
29c40 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a  ->plan.u.pTerm;.
29c50 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
29c60 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
29c70 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
29c80 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20  ator==WO_OR );. 
29c90 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
29ca0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
29cb0 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
29cc0 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
29cd0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
29ce0 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  c;.    pLevel->o
29cf0 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20  p = OP_Return;. 
29d00 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
29d10 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20  regReturn;..    
29d20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20  /* Set up a new 
29d30 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54 61  SrcList in pOrTa
29d40 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  b containing the
29d50 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61   table being sca
29d60 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  nned.    ** by t
29d70 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  his loop in the 
29d80 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c  a[0] slot and al
29d90 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  l notReady table
29da0 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74  s in a[1..] slot
29db0 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  s..    ** This b
29dc0 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69  ecomes the SrcLi
29dd0 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  st in the recurs
29de0 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ive call to sqli
29df0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
29e00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29e10 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
29e20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
29e30 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
29e40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29e50 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61  number of notRea
29e60 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  dy tables */.   
29e70 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
29e80 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b  t_item *origSrc;
29e90 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
29ea0 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
29eb0 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61  */.      nNotRea
29ec0 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  dy = pWInfo->nLe
29ed0 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31  vel - iLevel - 1
29ee0 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  ;.      pOrTab =
29ef0 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
29f00 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62  ocRaw(pParse->db
29f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
29f30 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e  zeof(*pOrTab)+ n
29f40 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28  NotReady*sizeof(
29f50 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a  pOrTab->a[0]));.
29f60 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62        if( pOrTab
29f70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74  ==0 ) return not
29f80 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72  Ready;.      pOr
29f90 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69  Tab->nAlloc = (i
29fa0 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20  16)(nNotReady + 
29fb0 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  1);.      pOrTab
29fc0 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d  ->nSrc = pOrTab-
29fd0 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d  >nAlloc;.      m
29fe0 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c  emcpy(pOrTab->a,
29ff0 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f   pTabItem, sizeo
2a000 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20  f(*pTabItem));. 
2a010 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70       origSrc = p
2a020 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2a030 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  >a;.      for(k=
2a040 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b  1; k<=nNotReady;
2a050 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d   k++){.        m
2a060 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61  emcpy(&pOrTab->a
2a070 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c  [k], &origSrc[pL
2a080 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20  evel[k].iFrom], 
2a090 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
2a0a0 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [k]));.      }. 
2a0b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a0c0 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d  pOrTab = pWInfo-
2a0d0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d  >pTabList;.    }
2a0e0 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
2a0f0 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72  ize the rowset r
2a100 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61  egister to conta
2a110 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20  in NULL. An SQL 
2a120 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20  NULL is .    ** 
2a130 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e  equivalent to an
2a140 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20   empty rowset.. 
2a150 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
2a160 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67  o initialize reg
2a170 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69  Return to contai
2a180 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
2a190 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
2a1a0 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61   .    ** immedia
2a1b0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
2a1c0 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20  he OP_Return at 
2a1d0 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  the bottom of th
2a1e0 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20  e loop. This.   
2a1f0 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
2a200 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65  in a few obscure
2a210 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73   LEFT JOIN cases
2a220 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a   where control j
2a230 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72  umps.    ** over
2a240 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
2a250 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f  loop into the bo
2a260 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69  dy of it. In thi
2a270 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20  s case the .    
2a280 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f  ** correct respo
2a290 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d  nse for the end-
2a2a0 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68  of-loop code (th
2a2b0 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20  e OP_Return) is 
2a2c0 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20  to .    ** fall 
2a2d0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
2a2e0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  ext instruction,
2a2f0 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e   just as an OP_N
2a300 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20  ext does if.    
2a310 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  ** called on an 
2a320 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75  uninitialized cu
2a330 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rsor..    */.   
2a340 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
2a350 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
2a360 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  TES_OK)==0 ){.  
2a370 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20      regRowset = 
2a380 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2a390 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d        regRowid =
2a3a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2a3b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2a3c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
2a3d0 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65  ull, 0, regRowse
2a3e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52  t);.    }.    iR
2a3f0 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  etInit = sqlite3
2a400 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2a410 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
2a420 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a  Return);..    /*
2a430 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
2a440 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
2a450 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20   z of the form: 
2a460 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e   (x1 OR x2 OR ..
2a470 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20  .) AND y.    ** 
2a480 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74  Then for every t
2a490 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65  erm xN, evaluate
2a4a0 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65   as the subexpre
2a4b0 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a  ssion: xN AND z.
2a4c0 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c      ** That way,
2a4d0 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74   terms in y that
2a4e0 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e   are factored in
2a4f0 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69  to the disjuncti
2a500 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  on will.    ** b
2a510 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74  e picked up by t
2a520 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
2a530 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ls to sqlite3Whe
2a540 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e  reBegin() below.
2a550 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
2a560 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75  ctually, each su
2a570 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63  bexpression is c
2a580 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20  onverted to "xN 
2a590 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69  AND w" where w i
2a5a0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e  s.    ** the "in
2a5b0 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73  teresting" terms
2a5c0 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68   of z - terms th
2a5d0 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  at did not origi
2a5e0 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20  nate in the.    
2a5f0 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ** ON or USING c
2a600 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
2a610 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20  JOIN, and terms 
2a620 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20  that are usable 
2a630 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  as .    ** indic
2a640 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
2a650 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20  f( pWC->nTerm>1 
2a660 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65  ){.      int iTe
2a670 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54  rm;.      for(iT
2a680 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43  erm=0; iTerm<pWC
2a690 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b  ->nTerm; iTerm++
2a6a0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
2a6b0 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b  *pExpr = pWC->a[
2a6c0 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20  iTerm].pExpr;.  
2a6d0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
2a6e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2a6f0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
2a700 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2a710 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65    if( pWC->a[iTe
2a720 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54  rm].wtFlags & (T
2a730 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
2a740 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74 69  _ORINFO) ) conti
2a750 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
2a760 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e   (pWC->a[iTerm].
2a770 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
2a780 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  LL)==0 ) continu
2a790 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  e;.        pExpr
2a7a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
2a7b0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
2a7c0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
2a7d0 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69   pAndExpr = sqli
2a7e0 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
2a7f0 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72 2c  e->db, pAndExpr,
2a800 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d   pExpr);.      }
2a810 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45  .      if( pAndE
2a820 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
2a830 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
2a840 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2a850 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78  K_AND, 0, pAndEx
2a860 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  pr, 0);.      }.
2a870 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
2a880 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e  i=0; ii<pOrWc->n
2a890 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
2a8a0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
2a8b0 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e  rTerm = &pOrWc->
2a8c0 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  a[ii];.      if(
2a8d0 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
2a8e0 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 70 4f  rsor==iCur || pO
2a8f0 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
2a900 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==WO_AND ){.    
2a910 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70      WhereInfo *p
2a920 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  SubWInfo;       
2a930 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73     /* Info for s
2a940 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63  ingle OR-term sc
2a950 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  an */.        Ex
2a960 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f  pr *pOrExpr = pO
2a970 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  rTerm->pExpr;.  
2a980 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
2a990 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
2a9a0 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20  pAndExpr->pLeft 
2a9b0 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20  = pOrExpr;.     
2a9c0 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70       pOrExpr = p
2a9d0 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20  AndExpr;.       
2a9e0 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f   }.        /* Lo
2a9f0 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
2aa00 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
2aa10 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
2aa20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75  . */.        pSu
2aa30 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  bWInfo = sqlite3
2aa40 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
2aa50 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78  e, pOrTab, pOrEx
2aa60 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  pr, 0, 0,.      
2aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa80 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45    WHERE_OMIT_OPE
2aa90 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f  N_CLOSE | WHERE_
2aaa0 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20  AND_ONLY |.     
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aac0 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54     WHERE_FORCE_T
2aad0 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45  ABLE | WHERE_ONE
2aae0 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76  TABLE_ONLY, iCov
2aaf0 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Cur);.        as
2ab00 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20  sert( pSubWInfo 
2ab10 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
2ab20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2ab30 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
2ab40 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
2ab50 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
2ab60 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
2ab70 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78  vl;.          ex
2ab80 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
2ab90 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
2aba0 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75  se, pOrTab, &pSu
2abb0 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c  bWInfo->a[0], iL
2abc0 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  evel, pLevel->iF
2abd0 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20  rom, 0.         
2abe0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2abf0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2ac00 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
2ac10 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
2ac20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20         int iSet 
2ac30 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e  = ((ii==pOrWc->n
2ac40 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a  Term-1)?-1:ii);.
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2ac60 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  r;.            r
2ac70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2ac80 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
2ac90 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  se, pTabItem->pT
2aca0 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20  ab, -1, iCur, . 
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acd0 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 69 64          regRowid
2ace0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2acf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ad00 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77  Op4Int(v, OP_Row
2ad10 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73  SetTest, regRows
2ad20 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
2ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ad50 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
2ad60 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20 20 20 20  , r, iSet);.    
2ad70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ad80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ad90 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2ada0 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f   regReturn, iLoo
2adb0 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20  pBody);..       
2adc0 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49     /* The pSubWI
2add0 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
2ade0 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  ms flag means th
2adf0 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a  at this OR term.
2ae00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
2ae10 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  tained one or mo
2ae20 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d  re AND term from
2ae30 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c   a notReady tabl
2ae40 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
2ae50 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20    ** terms from 
2ae60 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62  the notReady tab
2ae70 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
2ae80 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a  tested and will.
2ae90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65            ** nee
2aea0 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c  d to be tested l
2aeb0 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20  ater..          
2aec0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2aed0 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65   pSubWInfo->unte
2aee0 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65  stedTerms ) unte
2aef0 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a  stedTerms = 1;..
2af00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2af10 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f  all of the OR-co
2af20 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61 72  nnected terms ar
2af30 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
2af40 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  g the same.     
2af50 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61       ** index, a
2af60 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  nd the index is 
2af70 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65  opened using the
2af80 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d   same cursor num
2af90 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ber.          **
2afa0 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f   by each call to
2afb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2afc0 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68 69  in() made by thi
2afd0 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20  s loop, it may. 
2afe0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70           ** be p
2aff0 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74  ossible to use t
2b000 68 61 74 20 69 6e 64 65 78 20 61 73 20 61 20 63  hat index as a c
2b010 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20  overing index.. 
2b020 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
2b030 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
2b040 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
2b050 68 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76  hereBegin() abov
2b060 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20  e resulted in a 
2b070 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20  scan that.      
2b080 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69      ** uses an i
2b090 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69  ndex, and this i
2b0a0 73 20 65 69 74 68 65 72 20 74 68 65 20 66 69 72  s either the fir
2b0b0 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  st OR-connected 
2b0c0 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a  term.          *
2b0d0 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74  * processed or t
2b0e0 68 65 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  he index is the 
2b0f0 73 61 6d 65 20 61 73 20 74 68 61 74 20 75 73 65  same as that use
2b100 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75  d by all previou
2b110 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  s.          ** t
2b120 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74  erms, set pCov t
2b130 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  o the candidate 
2b140 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
2b150 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a  Otherwise, set .
2b160 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f            ** pCo
2b170 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64  v to NULL to ind
2b180 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61  icate that no ca
2b190 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67  ndidate covering
2b1a0 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20   index will .   
2b1b0 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61         ** be ava
2b1c0 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20  ilable..        
2b1d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
2b1e0 4c 76 6c 20 3d 20 26 70 53 75 62 57 49 6e 66 6f  Lvl = &pSubWInfo
2b1f0 2d 3e 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[0];.        
2b200 20 20 69 66 28 20 28 70 4c 76 6c 2d 3e 70 6c 61    if( (pLvl->pla
2b210 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2b220 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
2b230 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 76           && (pLv
2b240 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2b250 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
2b260 45 58 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  EX)==0.         
2b270 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70    && (ii==0 || p
2b280 4c 76 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  Lvl->plan.u.pIdx
2b290 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20  ==pCov).        
2b2a0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2b2b0 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 69   assert( pLvl->i
2b2c0 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20  IdxCur==iCovCur 
2b2d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2b2e0 43 6f 76 20 3d 20 70 4c 76 6c 2d 3e 70 6c 61 6e  Cov = pLvl->plan
2b2f0 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 20  .u.pIdx;.       
2b300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b310 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a        pCov = 0;.
2b320 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
2b330 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
2b340 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67   the loop throug
2b350 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
2b360 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
2b370 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
2b380 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2b390 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29  reEnd(pSubWInfo)
2b3a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b3b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c    }.    }.    pL
2b3c0 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20  evel->u.pCovidx 
2b3d0 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20  = pCov;.    if( 
2b3e0 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69  pCov ) pLevel->i
2b3f0 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72  IdxCur = iCovCur
2b400 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45 78  ;.    if( pAndEx
2b410 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64  pr ){.      pAnd
2b420 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
2b430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2b440 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
2b450 3e 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a  >db, pAndExpr);.
2b460 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2b470 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
2b480 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74   iRetInit, sqlit
2b490 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2b4a0 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
2b4b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2b4c0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
2b4d0 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
2b4e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2b4f0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f  olveLabel(v, iLo
2b500 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66  opBody);..    if
2b510 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
2b520 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63  >1 ) sqlite3Stac
2b530 6b 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  kFree(pParse->db
2b540 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69  , pOrTab);.    i
2b550 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d  f( !untestedTerm
2b560 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28  s ) disableTerm(
2b570 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
2b580 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
2b590 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
2b5a0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
2b5b0 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ..  {.    /* Cas
2b5c0 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 5:  There is n
2b5d0 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
2b5e0 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
2b5f0 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20  mplete.    **   
2b600 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74         scan of t
2b610 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e  he entire table.
2b620 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
2b630 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65  ic const u8 aSte
2b640 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c  p[] = { OP_Next,
2b650 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20   OP_Prev };.    
2b660 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
2b670 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f  aStart[] = { OP_
2b680 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20  Rewind, OP_Last 
2b690 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  };.    assert( b
2b6a0 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d  Rev==0 || bRev==
2b6b0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2b6c0 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
2b6d0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
2b6e0 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20  = aStep[bRev];. 
2b6f0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
2b700 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
2b710 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74  ->p2 = 1 + sqlit
2b720 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2b730 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43  aStart[bRev], iC
2b740 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
2b750 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
2b760 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
2b770 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
2b780 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20 26    }.  notReady &
2b790 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e  = ~getMask(pWC->
2b7a0 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
2b7b0 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
2b7c0 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79  de to test every
2b7d0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74   subexpression t
2b7e0 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  hat can be compl
2b7f0 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75  etely.  ** compu
2b800 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75  ted using the cu
2b810 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62  rrent set of tab
2b820 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  les..  **.  ** I
2b830 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
2b840 3a 20 52 2d 34 39 35 32 35 2d 35 30 39 33 35 20  : R-49525-50935 
2b850 54 65 72 6d 73 20 74 68 61 74 20 63 61 6e 6e 6f  Terms that canno
2b860 74 20 62 65 20 73 61 74 69 73 66 69 65 64 20 74  t be satisfied t
2b870 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20  hrough.  ** the 
2b880 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 20 62  use of indices b
2b890 65 63 6f 6d 65 20 74 65 73 74 73 20 74 68 61 74  ecome tests that
2b8a0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
2b8b0 67 61 69 6e 73 74 20 65 61 63 68 20 72 6f 77 20  gainst each row 
2b8c0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 6c 65  of.  ** the rele
2b8d0 76 61 6e 74 20 69 6e 70 75 74 20 74 61 62 6c 65  vant input table
2b8e0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54  s..  */.  for(pT
2b8f0 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57  erm=pWC->a, j=pW
2b900 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  C->nTerm; j>0; j
2b910 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
2b920 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
2b930 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
2b940 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2b950 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d  VIRTUAL ); /* IM
2b960 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  P: R-30575-11662
2b970 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
2b980 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
2b990 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
2b9a0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
2b9b0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
2b9c0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
2b9d0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
2b9e0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2b9f0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52  prereqAll & notR
2ba00 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
2ba10 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
2ba20 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
2ba30 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  s==0.           
2ba40 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
2ba50 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2ba60 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
2ba70 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57  )!=0 );.      pW
2ba80 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
2ba90 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63  rms = 1;.      c
2baa0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
2bab0 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
2bac0 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
2bad0 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pE!=0 );.    i
2bae0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
2baf0 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73  Join && !ExprHas
2bb00 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
2bb10 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
2bb20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2bb30 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
2bb40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
2bb50 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20  , pE, addrCont, 
2bb60 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
2bb70 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77  L);.    pTerm->w
2bb80 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
2bb90 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ODED;.  }..  /* 
2bba0 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
2bbb0 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
2bbc0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
2bbd0 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
2bbe0 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73  hat.  ** at leas
2bbf0 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  t one row of the
2bc00 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73   right table has
2bc10 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66   matched the lef
2bc20 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a  t table.  .  */.
2bc30 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
2bc40 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70  eftJoin ){.    p
2bc50 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
2bc60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2bc70 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2bc80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2bc90 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2bca0 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 1, pLevel->iL
2bcb0 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
2bcc0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
2bcd0 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20  ecord LEFT JOIN 
2bce0 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  hit"));.    sqli
2bcf0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2bd00 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66  r(pParse);.    f
2bd10 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
2bd20 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65   j=0; j<pWC->nTe
2bd30 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; j++, pTerm++
2bd40 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
2bd50 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
2bd60 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
2bd70 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33   );  /* IMP: R-3
2bd80 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
2bd90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
2bda0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
2bdb0 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
2bdc0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
2bdd0 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
2bde0 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
2bdf0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2be00 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2be10 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52  prereqAll & notR
2be20 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
2be30 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
2be40 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
2be50 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  s );.        con
2be60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
2be70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
2be80 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
2be90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
2bea0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
2beb0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72  erm->pExpr, addr
2bec0 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
2bed0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
2bee0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
2bef0 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
2bf00 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2bf10 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2bf20 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65  pParse, iRelease
2bf30 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Reg);..  return 
2bf40 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66  notReady;.}..#if
2bf50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2bf60 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TEST)./*.** The 
2bf70 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
2bf80 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20  le holds a text 
2bf90 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71  description of q
2bfa0 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61  uery plan genera
2bfb0 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f  ted.** by the mo
2bfc0 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74  st recent call t
2bfd0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
2bfe0 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c  gin().  Each cal
2bff0 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a  l to WhereBegin.
2c000 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
2c010 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69  e previous.  Thi
2c020 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
2c030 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
2c040 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69  g and.** analysi
2c050 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20  s only..*/.char 
2c060 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
2c070 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f  an[BMS*2*40];  /
2c080 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f  * Text of the jo
2c090 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  in */.static int
2c0a0 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20   nQPlan = 0;    
2c0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2c0c0 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f  t free slow in _
2c0d0 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a  query_plan[] */.
2c0e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2c0f0 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
2c100 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
2c110 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
2c120 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
2c130 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
2c140 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
2c150 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
2c160 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20   ALWAYS(pWInfo) 
2c170 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2c180 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49    for(i=0; i<pWI
2c190 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
2c1a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c1b0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e  _index_info *pIn
2c1c0 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69  fo = pWInfo->a[i
2c1d0 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20  ].pIdxInfo;.    
2c1e0 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
2c1f0 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74         /* assert
2c200 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  ( pInfo->needToF
2c210 72 65 65 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20  reeIdxStr==0 || 
2c220 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c230 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   ); */.        i
2c240 66 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  f( pInfo->needTo
2c250 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20  FreeIdxStr ){.  
2c260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c270 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53  free(pInfo->idxS
2c280 74 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tr);.        }. 
2c290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
2c2a0 46 72 65 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b  Free(db, pInfo);
2c2b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2c2c0 66 28 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e  f( pWInfo->a[i].
2c2d0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2c2e0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20  HERE_TEMP_INDEX 
2c2f0 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  ){.        Index
2c300 20 2a 70 49 64 78 20 3d 20 70 57 49 6e 66 6f 2d   *pIdx = pWInfo-
2c310 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 75 2e 70 49 64  >a[i].plan.u.pId
2c320 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  x;.        if( p
2c330 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Idx ){.         
2c340 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2c350 62 2c 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  b, pIdx->zColAff
2c360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2c370 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2c380 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Idx);.        }.
2c390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c3a0 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
2c3b0 61 72 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b  ar(pWInfo->pWC);
2c3c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2c3d0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
2c3e0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
2c3f0 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
2c400 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
2c410 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
2c420 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
2c430 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
2c440 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
2c450 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
2c460 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2c470 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
2c480 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
2c490 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
2c4a0 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
2c4b0 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
2c4c0 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
2c4d0 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
2c4e0 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
2c4f0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
2c500 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
2c510 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
2c520 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
2c530 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
2c540 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2c550 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
2c560 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2c570 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
2c580 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
2c590 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
2c5a0 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
2c5b0 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
2c5c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2c5d0 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
2c5e0 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
2c5f0 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
2c600 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
2c610 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
2c620 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
2c630 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
2c640 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
2c650 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
2c660 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
2c670 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
2c680 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
2c690 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
2c6a0 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
2c6b0 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
2c6c0 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
2c6d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2c6e0 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
2c6f0 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
2c700 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
2c710 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
2c720 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
2c730 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
2c740 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
2c750 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
2c760 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
2c770 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
2c780 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
2c790 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
2c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7b0 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
2c7c0 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
2c7d0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
2c7f0 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
2c800 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
2c810 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
2c820 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
2c830 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2c840 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
2c850 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
2c860 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
2c870 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
2c880 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2c890 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
2c8a0 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
2c8b0 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
2c8c0 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
2c8d0 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
2c8e0 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
2c8f0 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
2c900 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
2c910 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
2c920 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
2c930 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
2c940 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
2c950 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
2c960 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
2c970 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
2c980 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
2c990 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
2c9a0 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
2c9b0 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
2c9c0 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
2c9d0 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
2c9e0 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
2c9f0 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
2ca00 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
2ca10 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
2ca20 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
2ca30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
2ca40 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
2ca50 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
2ca60 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
2ca70 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
2ca80 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
2ca90 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
2caa0 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
2cab0 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
2cac0 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
2cad0 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
2cae0 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
2caf0 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
2cb00 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
2cb10 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
2cb20 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
2cb30 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
2cb40 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
2cb50 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
2cb60 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
2cb70 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
2cb80 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
2cb90 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
2cba0 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
2cbb0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2cbc0 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
2cbd0 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
2cbe0 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
2cbf0 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
2cc00 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
2cc10 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
2cc20 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
2cc30 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
2cc40 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
2cc50 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
2cc60 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
2cc70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
2cc80 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
2cc90 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
2cca0 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
2ccb0 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
2ccc0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
2ccd0 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
2cce0 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
2ccf0 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
2cd00 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
2cd10 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
2cd20 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
2cd30 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
2cd40 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
2cd50 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
2cd60 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
2cd70 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
2cd80 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
2cd90 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
2cda0 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
2cdb0 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
2cdc0 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
2cdd0 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
2cde0 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
2cdf0 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
2ce00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2ce10 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
2ce20 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
2ce30 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
2ce40 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
2ce50 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
2ce60 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
2ce70 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
2ce80 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
2ce90 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
2cea0 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
2ceb0 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
2cec0 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
2ced0 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
2cee0 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
2cef0 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
2cf00 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
2cf10 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
2cf20 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
2cf30 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
2cf40 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
2cf50 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
2cf60 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
2cf70 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
2cf80 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
2cf90 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
2cfa0 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
2cfb0 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
2cfc0 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
2cfd0 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
2cfe0 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
2cff0 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
2d000 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
2d010 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
2d020 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
2d030 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
2d040 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
2d050 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65  SING.**.** pOrde
2d060 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
2d070 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
2d080 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
2d090 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
2d0a0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
2d0b0 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
2d0c0 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
2d0d0 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
2d0e0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
2d0f0 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
2d100 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
2d110 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
2d120 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
2d130 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20  .** If an index 
2d140 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74  can be used so t
2d150 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20  hat the natural 
2d160 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20  output order of 
2d170 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61  the table.** sca
2d180 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72  n is correct for
2d190 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2d1a0 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20  ause, then that 
2d1b0 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e  index is used an
2d1c0 64 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65  d.** the returne
2d1d0 64 20 57 68 65 72 65 49 6e 66 6f 2e 6e 4f 42 53  d WhereInfo.nOBS
2d1e0 61 74 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  at field is set 
2d1f0 74 6f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  to pOrderBy->nEx
2d200 70 72 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  pr.  This.** is 
2d210 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
2d220 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e  that prevents an
2d230 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72   unnecessary sor
2d240 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  t of the result 
2d250 73 65 74 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 64  set.** if an ind
2d260 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ex appropriate f
2d270 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  or the ORDER BY 
2d280 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65  clause already e
2d290 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xists..**.** If 
2d2a0 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
2d2b0 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65   loops cannot be
2d2c0 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f   arranged to pro
2d2d0 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74  vide the correct
2d2e0 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72  .** output order
2d2f0 2c 20 74 68 65 6e 20 57 68 65 72 65 49 6e 66 6f  , then WhereInfo
2d300 2e 6e 4f 42 53 61 74 20 69 73 20 30 2e 0a 2a 2f  .nOBSat is 0..*/
2d310 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
2d320 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
2d330 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2d340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2d350 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2d360 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2d370 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73  ist,    /* A lis
2d380 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
2d390 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
2d3a0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
2d3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d3c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2d3d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
2d3e0 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52  erBy,   /* An OR
2d3f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f  DER BY clause, o
2d400 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
2d410 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c  List *pDistinct,
2d420 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 2d    /* The select-
2d430 6c 69 73 74 20 66 6f 72 20 44 49 53 54 49 4e 43  list for DISTINC
2d440 54 20 71 75 65 72 69 65 73 20 2d 20 6f 72 20 4e  T queries - or N
2d450 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ULL */.  u16 wct
2d460 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
2d470 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
2d480 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
2d490 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
2d4a0 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  h */.  int iIdxC
2d4b0 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur           /* 
2d4c0 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  If WHERE_ONETABL
2d4d0 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69  E_ONLY is set, i
2d4e0 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
2d4f0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  er */.){.  int n
2d500 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20  ByteWInfo;      
2d510 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79        /* Num. by
2d520 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
2d530 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  r WhereInfo stru
2d540 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62  ct */.  int nTab
2d550 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
2d560 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d570 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62  elements in pTab
2d580 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  List */.  WhereI
2d590 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
2d5a0 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
2d5b0 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
2d5c0 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
2d5d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
2d5e0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2d5f0 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
2d600 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
2d610 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
2d620 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
2d630 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
2d640 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
2d650 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
2d660 20 57 68 65 72 65 42 65 73 74 49 64 78 20 73 57   WhereBestIdx sW
2d670 42 49 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 42  BI;         /* B
2d680 65 73 74 20 69 6e 64 65 78 20 73 65 61 72 63 68  est index search
2d690 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
2d6a0 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
2d6b0 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  kSet;    /* The 
2d6c0 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
2d6d0 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  set */.  WhereLe
2d6e0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
2d6f0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
2d700 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d  level in pWInfo-
2d710 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 46  >a[] */.  int iF
2d720 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
2d730 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
2d740 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65  used FROM clause
2d750 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
2d760 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20  t andFlags;     
2d770 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d           /* AND-
2d780 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
2d790 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e 77  f all pWC->a[].w
2d7a0 74 46 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20  tFlags */.  int 
2d7b0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
2d7c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2d7d0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69  ounter */.  sqli
2d7e0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
2d7f0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
2d800 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
2d810 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ...  /* Variable
2d820 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2d830 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 42  */.  memset(&sWB
2d840 49 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 42  I, 0, sizeof(sWB
2d850 49 29 29 3b 0a 20 20 73 57 42 49 2e 70 50 61 72  I));.  sWBI.pPar
2d860 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 0a 20 20  se = pParse;..  
2d870 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
2d880 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2d890 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
2d8a0 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
2d8b0 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
2d8c0 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
2d8d0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2d8e0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
2d8f0 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61  BMS );.  if( pTa
2d900 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
2d910 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
2d920 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2d930 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
2d940 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
2d950 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
2d960 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
2d970 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c   function normal
2d980 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e  ly generates a n
2d990 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61  ested loop for a
2d9a0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20  ll tables in .  
2d9b0 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75  ** pTabList.  Bu
2d9c0 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f  t if the WHERE_O
2d9d0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
2d9e0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77  g is set, then w
2d9f0 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e  e should.  ** on
2da00 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ly generate code
2da10 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
2da20 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
2da30 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74   and assume that
2da40 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72  .  ** any cursor
2da50 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2da60 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62  h subsequent tab
2da70 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61  les are uninitia
2da80 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54  lized..  */.  nT
2da90 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46  abList = (wctrlF
2daa0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2dab0 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20  TABLE_ONLY) ? 1 
2dac0 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  : pTabList->nSrc
2dad0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
2dae0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2daf0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
2db00 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
2db10 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a  l become the.  *
2db20 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20  * return value. 
2db30 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  A single allocat
2db40 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
2db50 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e  tore the WhereIn
2db60 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20  fo.  ** struct, 
2db70 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2db80 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74  WhereInfo.a[], t
2db90 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
2dba0 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e  tructure.  ** an
2dbb0 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53  d the WhereMaskS
2dbc0 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69  et structure. Si
2dbd0 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  nce WhereClause 
2dbe0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79  contains an 8-by
2dbf0 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74  te.  ** field (t
2dc00 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20  ype Bitmask) it 
2dc10 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20  must be aligned 
2dc20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  on an 8-byte bou
2dc30 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f  ndary on.  ** so
2dc40 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73  me architectures
2dc50 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e  . Hence the ROUN
2dc60 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  D8() below..  */
2dc70 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
2dc80 64 62 3b 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f  db;.  nByteWInfo
2dc90 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
2dca0 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61  (WhereInfo)+(nTa
2dcb0 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28  bList-1)*sizeof(
2dcc0 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
2dcd0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
2dce0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
2dcf0 20 0a 20 20 20 20 20 20 6e 42 79 74 65 57 49 6e   .      nByteWIn
2dd00 66 6f 20 2b 20 0a 20 20 20 20 20 20 73 69 7a 65  fo + .      size
2dd10 6f 66 28 57 68 65 72 65 43 6c 61 75 73 65 29 20  of(WhereClause) 
2dd20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57  +.      sizeof(W
2dd30 68 65 72 65 4d 61 73 6b 53 65 74 29 0a 20 20 29  hereMaskSet).  )
2dd40 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
2dd50 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
2dd60 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2dd70 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70  , pWInfo);.    p
2dd80 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67  WInfo = 0;.    g
2dd90 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2dda0 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  ror;.  }.  pWInf
2ddb0 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62  o->nLevel = nTab
2ddc0 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
2ddd0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2dde0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
2ddf0 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
2de00 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
2de10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2de20 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57  keLabel(v);.  pW
2de30 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 73 57 42 49  Info->pWC = sWBI
2de40 2e 70 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61  .pWC = (WhereCla
2de50 75 73 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57  use *)&((u8 *)pW
2de60 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f  Info)[nByteWInfo
2de70 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74  ];.  pWInfo->wct
2de80 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46  rlFlags = wctrlF
2de90 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  lags;.  pWInfo->
2dea0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
2deb0 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
2dec0 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74  Loop;.  pMaskSet
2ded0 20 3d 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74   = (WhereMaskSet
2dee0 2a 29 26 73 57 42 49 2e 70 57 43 5b 31 5d 3b 0a  *)&sWBI.pWC[1];.
2def0 20 20 73 57 42 49 2e 61 4c 65 76 65 6c 20 3d 20    sWBI.aLevel = 
2df00 70 57 49 6e 66 6f 2d 3e 61 3b 0a 0a 20 20 2f 2a  pWInfo->a;..  /*
2df10 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53   Disable the DIS
2df20 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69  TINCT optimizati
2df30 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73  on if SQLITE_Dis
2df40 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20  tinctOpt is set 
2df50 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  via.  ** sqlite3
2df60 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54  _test_ctrl(SQLIT
2df70 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
2df80 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f  IZATIONS,...) */
2df90 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
2dfa0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
2dfb0 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
2dfc0 70 74 29 20 29 20 70 44 69 73 74 69 6e 63 74 20  pt) ) pDistinct 
2dfd0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  = 0;..  /* Split
2dfe0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2dff0 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
2e000 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
2e010 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73  here each.  ** s
2e020 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
2e030 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20  separated by an 
2e040 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
2e050 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74  */.  initMaskSet
2e060 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68  (pMaskSet);.  wh
2e070 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 73 57  ereClauseInit(sW
2e080 42 49 2e 70 57 43 2c 20 70 50 61 72 73 65 2c 20  BI.pWC, pParse, 
2e090 70 4d 61 73 6b 53 65 74 2c 20 77 63 74 72 6c 46  pMaskSet, wctrlF
2e0a0 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
2e0b0 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
2e0c0 73 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  s(pParse, pWhere
2e0d0 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
2e0e0 73 57 42 49 2e 70 57 43 2c 20 70 57 68 65 72 65  sWBI.pWC, pWhere
2e0f0 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20  , TK_AND);   /* 
2e100 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32  IMP: R-15842-532
2e110 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20  96 */.    .  /* 
2e120 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20  Special case: a 
2e130 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2e140 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t is constant.  
2e150 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a  Evaluate the.  *
2e160 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
2e170 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65   either jump ove
2e180 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  r all of the cod
2e190 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a  e or fall thru..
2e1a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72    */.  if( pWher
2e1b0 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d  e && (nTabList==
2e1c0 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
2e1d0 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
2e1e0 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20  n(pWhere)) ){.  
2e1f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
2e200 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
2e210 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  ere, pWInfo->iBr
2e220 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  eak, SQLITE_JUMP
2e230 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68  IFNULL);.    pWh
2e240 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ere = 0;.  }..  
2e250 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
2e260 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
2e270 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
2e280 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2e290 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  e..  **.  ** Whe
2e2a0 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d  n assigning bitm
2e2b0 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52  ask values to FR
2e2c0 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72  OM clause cursor
2e2d0 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20  s, it must be.  
2e2e0 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74  ** the case that
2e2f0 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74   if X is the bit
2e300 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74  mask for the N-t
2e310 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  h FROM clause te
2e320 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  rm then.  ** the
2e330 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2e340 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2e350 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ms to the left o
2e360 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a  f the N-th term.
2e370 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20    ** is (X-1).  
2e380 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
2e390 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
2e3a0 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
2e3b0 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74   can use.  ** it
2e3c0 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  s Expr.iRightJoi
2e3d0 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20  nTable value to 
2e3e0 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b  find the bitmask
2e3f0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2e400 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ble.  ** of the 
2e410 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69  join.  Subtracti
2e420 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20  ng one from the 
2e430 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d  right table bitm
2e440 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a  ask gives a.  **
2e450 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2e460 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2e470 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
2e480 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69    Knowing the bi
2e490 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61  tmask.  ** for a
2e4a0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
2e4b0 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20   left of a left 
2e4c0 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e  join is importan
2e4d0 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  t.  Ticket #3015
2e4e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66  ..  **.  ** Conf
2e4f0 69 67 75 72 65 20 74 68 65 20 57 68 65 72 65 43  igure the WhereC
2e500 6c 61 75 73 65 2e 76 6d 61 73 6b 20 76 61 72 69  lause.vmask vari
2e510 61 62 6c 65 20 73 6f 20 74 68 61 74 20 62 69 74  able so that bit
2e520 73 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  s that correspon
2e530 64 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74 75 61  d.  ** to virtua
2e540 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73 20  l table cursors 
2e550 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 69 73  are set. This is
2e560 20 75 73 65 64 20 74 6f 20 73 65 6c 65 63 74 69   used to selecti
2e570 76 65 6c 79 20 64 69 73 61 62 6c 65 20 0a 20 20  vely disable .  
2e580 2a 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e 20  ** the OR-to-IN 
2e590 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
2e5a0 6e 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54  n exprAnalyzeOrT
2e5b0 65 72 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f 74  erm(). It is not
2e5c0 20 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20 77   helpful .  ** w
2e5d0 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ith virtual tabl
2e5e0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  es..  **.  ** No
2e5f0 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73  te that bitmasks
2e600 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
2e610 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e   all pTabList->n
2e620 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20  Src tables in.  
2e630 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74  ** pTabList, not
2e640 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
2e650 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e  nTabList tables.
2e660 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f    nTabList is no
2e670 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61  rmally.  ** equa
2e680 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e  l to pTabList->n
2e690 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65  Src but might be
2e6a0 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20   shortened to 1 
2e6b0 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52  if the.  ** WHER
2e6c0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
2e6d0 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a  flag is set..  *
2e6e0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 57 42 49  /.  assert( sWBI
2e6f0 2e 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26  .pWC->vmask==0 &
2e700 26 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30  & pMaskSet->n==0
2e710 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   );.  for(ii=0; 
2e720 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
2e730 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72  c; ii++){.    cr
2e740 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eateMask(pMaskSe
2e750 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
2e760 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 23 69 66  i].iCursor);.#if
2e770 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e780 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2e790 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61    if( ALWAYS(pTa
2e7a0 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 54 61  bList->a[ii].pTa
2e7b0 62 29 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  b) && IsVirtual(
2e7c0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
2e7d0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73  pTab) ){.      s
2e7e0 57 42 49 2e 70 57 43 2d 3e 76 6d 61 73 6b 20 7c  WBI.pWC->vmask |
2e7f0 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 20 3c 3c  = ((Bitmask)1 <<
2e800 20 69 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   ii);.    }.#end
2e810 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  if.  }.#ifndef N
2e820 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69  DEBUG.  {.    Bi
2e830 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20  tmask toTheLeft 
2e840 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
2e850 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
2e860 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
2e870 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
2e880 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
2e890 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
2e8a0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
2e8b0 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d   assert( (m-1)==
2e8c0 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20  toTheLeft );.   
2e8d0 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20     toTheLeft |= 
2e8e0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
2e8f0 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
2e900 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
2e910 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
2e920 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
2e930 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
2e940 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
2e950 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
2e960 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
2e970 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
2e980 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
2e990 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
2e9a0 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
2e9b0 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
2e9c0 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
2e9d0 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
2e9e0 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
2e9f0 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
2ea00 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
2ea10 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78  essed..  */.  ex
2ea20 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
2ea30 62 4c 69 73 74 2c 20 73 57 42 49 2e 70 57 43 29  bList, sWBI.pWC)
2ea40 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
2ea50 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
2ea60 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2ea70 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
2ea80 43 68 65 63 6b 20 69 66 20 74 68 65 20 44 49 53  Check if the DIS
2ea90 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 2c  TINCT qualifier,
2eaa0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
2eab0 2c 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  , is redundant. 
2eac0 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20  .  ** If it is, 
2ead0 74 68 65 6e 20 73 65 74 20 70 44 69 73 74 69 6e  then set pDistin
2eae0 63 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 57  ct to NULL and W
2eaf0 68 65 72 65 49 6e 66 6f 2e 65 44 69 73 74 69 6e  hereInfo.eDistin
2eb00 63 74 20 74 6f 0a 20 20 2a 2a 20 57 48 45 52 45  ct to.  ** WHERE
2eb10 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
2eb20 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 63 61 6c   to tell the cal
2eb30 6c 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68  ler to ignore th
2eb40 65 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2f  e DISTINCT..  */
2eb50 0a 20 20 69 66 28 20 70 44 69 73 74 69 6e 63 74  .  if( pDistinct
2eb60 20 26 26 20 69 73 44 69 73 74 69 6e 63 74 52 65   && isDistinctRe
2eb70 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20  dundant(pParse, 
2eb80 70 54 61 62 4c 69 73 74 2c 20 73 57 42 49 2e 70  pTabList, sWBI.p
2eb90 57 43 2c 20 70 44 69 73 74 69 6e 63 74 29 20 29  WC, pDistinct) )
2eba0 7b 0a 20 20 20 20 70 44 69 73 74 69 6e 63 74 20  {.    pDistinct 
2ebb0 3d 20 30 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  = 0;.    pWInfo-
2ebc0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
2ebd0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
2ebe0 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  UE;.  }..  /* Ch
2ebf0 6f 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64  ose the best ind
2ec00 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61  ex to use for ea
2ec10 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ch table in the 
2ec20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
2ec30 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
2ec40 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f   fills in the fo
2ec50 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
2ec60 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e    **.  **   pWIn
2ec70 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20  fo->a[].pIdx    
2ec80 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75    The index to u
2ec90 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65  se for this leve
2eca0 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  l of the loop.. 
2ecb0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
2ecc0 5d 2e 77 73 46 6c 61 67 73 20 20 20 57 48 45 52  ].wsFlags   WHER
2ecd0 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f  E_xxx flags asso
2ece0 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
2ecf0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2ed00 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68  a[].nEq       Th
2ed10 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61  e number of == a
2ed20 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
2ed30 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  s.  **   pWInfo-
2ed40 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57  >a[].iFrom     W
2ed50 68 69 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  hich term of the
2ed60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2ed70 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a  being coded.  **
2ed80 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
2ed90 54 61 62 43 75 72 20 20 20 54 68 65 20 56 44 42  TabCur   The VDB
2eda0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
2edb0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a   database table.
2edc0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
2edd0 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68 65  [].iIdxCur   The
2ede0 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
2edf0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
2ee00 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54    pWInfo->a[].pT
2ee10 65 72 6d 20 20 20 20 20 57 68 65 6e 20 77 73 46  erm     When wsF
2ee20 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65  lags==WO_OR, the
2ee30 20 4f 52 2d 63 6c 61 75 73 65 20 74 65 72 6d 0a   OR-clause term.
2ee40 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
2ee50 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73  oop also figures
2ee60 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67   out the nesting
2ee70 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73   order of tables
2ee80 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a   in the FROM.  *
2ee90 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
2eea0 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 20 3d   sWBI.notValid =
2eeb0 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
2eec0 73 57 42 49 2e 70 4f 72 64 65 72 42 79 20 3d 20  sWBI.pOrderBy = 
2eed0 70 4f 72 64 65 72 42 79 3b 0a 20 20 73 57 42 49  pOrderBy;.  sWBI
2eee0 2e 6e 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20  .n = nTabList;. 
2eef0 20 73 57 42 49 2e 70 44 69 73 74 69 6e 63 74 20   sWBI.pDistinct 
2ef00 3d 20 70 44 69 73 74 69 6e 63 74 3b 0a 20 20 61  = pDistinct;.  a
2ef10 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20  ndFlags = ~0;.  
2ef20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
2ef30 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
2ef40 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72   ***\n"));.  for
2ef50 28 73 57 42 49 2e 69 3d 69 46 72 6f 6d 3d 30 2c  (sWBI.i=iFrom=0,
2ef60 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
2ef70 61 3b 20 73 57 42 49 2e 69 3c 6e 54 61 62 4c 69  a; sWBI.i<nTabLi
2ef80 73 74 3b 20 73 57 42 49 2e 69 2b 2b 2c 20 70 4c  st; sWBI.i++, pL
2ef90 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65  evel++){.    Whe
2efa0 72 65 43 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b  reCost bestPlan;
2efb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74           /* Most
2efc0 20 65 66 66 69 63 69 65 6e 74 20 70 6c 61 6e 20   efficient plan 
2efd0 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
2efe0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
2eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f000 2a 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d  * Index for FROM
2f010 20 74 61 62 6c 65 20 61 74 20 70 54 61 62 49 74   table at pTabIt
2f020 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b  em */.    int j;
2f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f040 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
2f050 70 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74  ping over FROM t
2f060 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ables */.    int
2f070 20 62 65 73 74 4a 20 3d 20 2d 31 3b 20 20 20 20   bestJ = -1;    
2f080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f090 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20  value of j */.  
2f0a0 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20    Bitmask m;    
2f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f0c0 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66   Bitmask value f
2f0d0 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f  or j or bestJ */
2f0e0 0a 20 20 20 20 69 6e 74 20 69 73 4f 70 74 69 6d  .    int isOptim
2f0f0 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2f100 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
2f110 20 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74   optimal/non-opt
2f120 69 6d 61 6c 20 73 65 61 72 63 68 20 2a 2f 0a 20  imal search */. 
2f130 20 20 20 69 6e 74 20 6e 55 6e 63 6f 6e 73 74 72     int nUnconstr
2f140 61 69 6e 65 64 3b 20 20 20 20 20 20 20 20 20 2f  ained;         /
2f150 2a 20 4e 75 6d 62 65 72 20 74 61 62 6c 65 73 20  * Number tables 
2f160 77 69 74 68 6f 75 74 20 49 4e 44 45 58 45 44 20  without INDEXED 
2f170 42 59 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73  BY */.    Bitmas
2f180 6b 20 6e 6f 74 49 6e 64 65 78 65 64 3b 20 20 20  k notIndexed;   
2f190 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
2f1a0 20 74 61 62 6c 65 73 20 74 68 61 74 20 63 61 6e   tables that can
2f1b0 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  not use an index
2f1c0 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   */..    memset(
2f1d0 26 62 65 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69  &bestPlan, 0, si
2f1e0 7a 65 6f 66 28 62 65 73 74 50 6c 61 6e 29 29 3b  zeof(bestPlan));
2f1f0 0a 20 20 20 20 62 65 73 74 50 6c 61 6e 2e 72 43  .    bestPlan.rC
2f200 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
2f210 5f 44 42 4c 3b 0a 20 20 20 20 57 48 45 52 45 54  _DBL;.    WHERET
2f220 52 41 43 45 28 28 22 2a 2a 2a 20 42 65 67 69 6e  RACE(("*** Begin
2f230 20 73 65 61 72 63 68 20 66 6f 72 20 6c 6f 6f 70   search for loop
2f240 20 25 64 20 2a 2a 2a 5c 6e 22 2c 20 73 57 42 49   %d ***\n", sWBI
2f250 2e 69 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  .i));..    /* Lo
2f260 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  op through the r
2f270 65 6d 61 69 6e 69 6e 67 20 65 6e 74 72 69 65 73  emaining entries
2f280 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2f290 75 73 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  use to find the.
2f2a0 20 20 20 20 2a 2a 20 6e 65 78 74 20 6e 65 73 74      ** next nest
2f2b0 65 64 20 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f 6f  ed loop. The loo
2f2c0 70 20 74 65 73 74 73 20 61 6c 6c 20 46 52 4f 4d  p tests all FROM
2f2d0 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 0a   clause entries.
2f2e0 20 20 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e      ** either on
2f2f0 63 65 20 6f 72 20 74 77 69 63 65 2e 20 0a 20 20  ce or twice. .  
2f300 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2f310 66 69 72 73 74 20 74 65 73 74 20 69 73 20 61 6c  first test is al
2f320 77 61 79 73 20 70 65 72 66 6f 72 6d 65 64 20 69  ways performed i
2f330 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
2f340 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 0a  or more entries.
2f350 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67      ** remaining
2f360 20 61 6e 64 20 6e 65 76 65 72 20 70 65 72 66 6f   and never perfo
2f370 72 6d 65 64 20 69 66 20 74 68 65 72 65 20 69 73  rmed if there is
2f380 20 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d 20 63   only one FROM c
2f390 6c 61 75 73 65 20 65 6e 74 72 79 0a 20 20 20 20  lause entry.    
2f3a0 2a 2a 20 74 6f 20 63 68 6f 6f 73 65 20 66 72 6f  ** to choose fro
2f3b0 6d 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 65  m.  The first te
2f3c0 73 74 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e 20  st looks for an 
2f3d0 22 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e 20  "optimal" scan. 
2f3e0 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   In.    ** this 
2f3f0 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74 69 6d  context an optim
2f400 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65 20 74  al scan is one t
2f410 68 61 74 20 75 73 65 73 20 74 68 65 20 73 61 6d  hat uses the sam
2f420 65 20 73 74 72 61 74 65 67 79 0a 20 20 20 20 2a  e strategy.    *
2f430 2a 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  * for the given 
2f440 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
2f450 79 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65  y as would be se
2f460 6c 65 63 74 65 64 20 69 66 20 74 68 65 20 65 6e  lected if the en
2f470 74 72 79 0a 20 20 20 20 2a 2a 20 77 65 72 65 20  try.    ** were 
2f480 75 73 65 64 20 61 73 20 74 68 65 20 69 6e 6e 65  used as the inne
2f490 72 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f  rmost nested loo
2f4a0 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  p.  In other wor
2f4b0 64 73 2c 20 61 20 74 61 62 6c 65 0a 20 20 20 20  ds, a table.    
2f4c0 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20 73 75 63  ** is chosen suc
2f4d0 68 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20  h that the cost 
2f4e0 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 61 74 20  of running that 
2f4f0 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20  table cannot be 
2f500 72 65 64 75 63 65 64 0a 20 20 20 20 2a 2a 20 62  reduced.    ** b
2f510 79 20 77 61 69 74 69 6e 67 20 66 6f 72 20 6f 74  y waiting for ot
2f520 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 72 75  her tables to ru
2f530 6e 20 66 69 72 73 74 2e 20 20 54 68 69 73 20 22  n first.  This "
2f540 6f 70 74 69 6d 61 6c 22 20 74 65 73 74 20 77 6f  optimal" test wo
2f550 72 6b 73 0a 20 20 20 20 2a 2a 20 62 79 20 66 69  rks.    ** by fi
2f560 72 73 74 20 61 73 73 75 6d 69 6e 67 20 74 68 61  rst assuming tha
2f570 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  t the FROM claus
2f580 65 20 69 73 20 6f 6e 20 74 68 65 20 69 6e 6e 65  e is on the inne
2f590 72 20 6c 6f 6f 70 20 61 6e 64 20 66 69 6e 64 69  r loop and findi
2f5a0 6e 67 0a 20 20 20 20 2a 2a 20 69 74 73 20 71 75  ng.    ** its qu
2f5b0 65 72 79 20 70 6c 61 6e 2c 20 74 68 65 6e 20 63  ery plan, then c
2f5c0 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69  hecking to see i
2f5d0 66 20 74 68 61 74 20 71 75 65 72 79 20 70 6c 61  f that query pla
2f5e0 6e 20 75 73 65 73 20 61 6e 79 0a 20 20 20 20 2a  n uses any.    *
2f5f0 2a 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  * other FROM cla
2f600 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 61  use terms that a
2f610 72 65 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64  re sWBI.notValid
2f620 2e 20 20 49 66 20 6e 6f 20 6e 6f 74 56 61 6c 69  .  If no notVali
2f630 64 20 74 65 72 6d 73 0a 20 20 20 20 2a 2a 20 61  d terms.    ** a
2f640 72 65 20 75 73 65 64 20 74 68 65 6e 20 74 68 65  re used then the
2f650 20 22 6f 70 74 69 6d 61 6c 22 20 71 75 65 72 79   "optimal" query
2f660 20 70 6c 61 6e 20 77 6f 72 6b 73 2e 0a 20 20 20   plan works..   
2f670 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
2f680 74 68 61 74 20 74 68 65 20 57 68 65 72 65 43 6f  that the WhereCo
2f690 73 74 2e 6e 52 6f 77 20 70 61 72 61 6d 65 74 65  st.nRow paramete
2f6a0 72 20 66 6f 72 20 61 6e 20 6f 70 74 69 6d 61 6c  r for an optimal
2f6b0 20 73 63 61 6e 20 6d 69 67 68 74 0a 20 20 20 20   scan might.    
2f6c0 2a 2a 20 6e 6f 74 20 62 65 20 61 73 20 73 6d 61  ** not be as sma
2f6d0 6c 6c 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62  ll as it would b
2f6e0 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 72  e if the table r
2f6f0 65 61 6c 6c 79 20 77 65 72 65 20 74 68 65 20 69  eally were the i
2f700 6e 6e 65 72 6d 6f 73 74 0a 20 20 20 20 2a 2a 20  nnermost.    ** 
2f710 6a 6f 69 6e 2e 20 20 54 68 65 20 6e 52 6f 77 20  join.  The nRow 
2f720 76 61 6c 75 65 20 63 61 6e 20 62 65 20 72 65 64  value can be red
2f730 75 63 65 64 20 62 79 20 57 48 45 52 45 20 63 6c  uced by WHERE cl
2f740 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
2f750 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20  .    ** that do 
2f760 6e 6f 74 20 75 73 65 20 69 6e 64 69 63 65 73 2e  not use indices.
2f770 20 20 42 75 74 20 74 68 69 73 20 6e 52 6f 77 20    But this nRow 
2f780 72 65 64 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 68  reduction only h
2f790 61 70 70 65 6e 73 20 69 66 20 74 68 65 0a 20 20  appens if the.  
2f7a0 20 20 2a 2a 20 74 61 62 6c 65 20 72 65 61 6c 6c    ** table reall
2f7b0 79 20 69 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f  y is the innermo
2f7c0 73 74 20 6a 6f 69 6e 2e 20 20 0a 20 20 20 20 2a  st join.  .    *
2f7d0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63  *.    ** The sec
2f7e0 6f 6e 64 20 6c 6f 6f 70 20 69 74 65 72 61 74 69  ond loop iterati
2f7f0 6f 6e 20 69 73 20 6f 6e 6c 79 20 70 65 72 66 6f  on is only perfo
2f800 72 6d 65 64 20 69 66 20 6e 6f 20 6f 70 74 69 6d  rmed if no optim
2f810 61 6c 20 73 63 61 6e 0a 20 20 20 20 2a 2a 20 73  al scan.    ** s
2f820 74 72 61 74 65 67 69 65 73 20 77 65 72 65 20 66  trategies were f
2f830 6f 75 6e 64 20 62 79 20 74 68 65 20 66 69 72 73  ound by the firs
2f840 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  t iteration. Thi
2f850 73 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  s second iterati
2f860 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20 75 73 65  on.    ** is use
2f870 64 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  d to search for 
2f880 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
2f890 73 63 61 6e 20 6f 76 65 72 61 6c 6c 2e 0a 20 20  scan overall..  
2f8a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 72 65 76    **.    ** Prev
2f8b0 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
2f8c0 20 53 51 4c 69 74 65 20 70 65 72 66 6f 72 6d 65   SQLite performe
2f8d0 64 20 6f 6e 6c 79 20 74 68 65 20 73 65 63 6f 6e  d only the secon
2f8e0 64 20 69 74 65 72 61 74 69 6f 6e 20 2d 0a 20 20  d iteration -.  
2f8f0 20 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 6f 75    ** the next ou
2f900 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 77 61 73  termost loop was
2f910 20 61 6c 77 61 79 73 20 74 68 61 74 20 77 69 74   always that wit
2f920 68 20 74 68 65 20 6c 6f 77 65 73 74 20 6f 76 65  h the lowest ove
2f930 72 61 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 73 74  rall.    ** cost
2f940 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20  . However, this 
2f950 6d 65 61 6e 74 20 74 68 61 74 20 53 51 4c 69 74  meant that SQLit
2f960 65 20 63 6f 75 6c 64 20 73 65 6c 65 63 74 20 74  e could select t
2f970 68 65 20 77 72 6f 6e 67 20 70 6c 61 6e 0a 20 20  he wrong plan.  
2f980 20 20 2a 2a 20 66 6f 72 20 73 63 72 69 70 74 73    ** for scripts
2f990 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c   such as the fol
2f9a0 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a 2a 20 20  lowing:.    **  
2f9b0 20 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54   .    **   CREAT
2f9c0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
2f9d0 3b 20 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  ; .    **   CREA
2f9e0 54 45 20 54 41 42 4c 45 20 74 32 28 63 2c 20 64  TE TABLE t2(c, d
2f9f0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  );.    **   SELE
2fa00 43 54 20 2a 20 46 52 4f 4d 20 74 32 2c 20 74 31  CT * FROM t2, t1
2fa10 20 57 48 45 52 45 20 74 32 2e 72 6f 77 69 64 20   WHERE t2.rowid 
2fa20 3d 20 74 31 2e 61 3b 0a 20 20 20 20 2a 2a 0a 20  = t1.a;.    **. 
2fa30 20 20 20 2a 2a 20 54 68 65 20 62 65 73 74 20 73     ** The best s
2fa40 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 69 74  trategy is to it
2fa50 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 61  erate through ta
2fa60 62 6c 65 20 74 31 20 66 69 72 73 74 2e 20 48 6f  ble t1 first. Ho
2fa70 77 65 76 65 72 20 69 74 0a 20 20 20 20 2a 2a 20  wever it.    ** 
2fa80 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
2fa90 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69  to determine thi
2faa0 73 20 77 69 74 68 20 61 20 73 69 6d 70 6c 65 20  s with a simple 
2fab0 67 72 65 65 64 79 20 61 6c 67 6f 72 69 74 68 6d  greedy algorithm
2fac0 2e 0a 20 20 20 20 2a 2a 20 53 69 6e 63 65 20 74  ..    ** Since t
2fad0 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e  he cost of a lin
2fae0 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68  ear scan through
2faf0 20 74 61 62 6c 65 20 74 32 20 69 73 20 74 68 65   table t2 is the
2fb00 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a 20 61 73   same .    ** as
2fb10 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c   the cost of a l
2fb20 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
2fb30 67 68 20 74 61 62 6c 65 20 74 31 2c 20 61 20 73  gh table t1, a s
2fb40 69 6d 70 6c 65 20 67 72 65 65 64 79 20 0a 20 20  imple greedy .  
2fb50 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 20 6d    ** algorithm m
2fb60 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 75 73 65  ay choose to use
2fb70 20 74 32 20 66 6f 72 20 74 68 65 20 6f 75 74 65   t2 for the oute
2fb80 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68 20 69 73  r loop, which is
2fb90 20 61 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20 63   a much.    ** c
2fba0 6f 73 74 6c 69 65 72 20 61 70 70 72 6f 61 63 68  ostlier approach
2fbb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 55 6e  ..    */.    nUn
2fbc0 63 6f 6e 73 74 72 61 69 6e 65 64 20 3d 20 30 3b  constrained = 0;
2fbd0 0a 20 20 20 20 6e 6f 74 49 6e 64 65 78 65 64 20  .    notIndexed 
2fbe0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 73 4f  = 0;.    for(isO
2fbf0 70 74 69 6d 61 6c 3d 28 69 46 72 6f 6d 3c 6e 54  ptimal=(iFrom<nT
2fc00 61 62 4c 69 73 74 2d 31 29 3b 20 69 73 4f 70 74  abList-1); isOpt
2fc10 69 6d 61 6c 3e 3d 30 20 26 26 20 62 65 73 74 4a  imal>=0 && bestJ
2fc20 3c 30 3b 20 69 73 4f 70 74 69 6d 61 6c 2d 2d 29  <0; isOptimal--)
2fc30 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 46  {.      for(j=iF
2fc40 72 6f 6d 2c 20 73 57 42 49 2e 70 53 72 63 3d 26  rom, sWBI.pSrc=&
2fc50 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20  pTabList->a[j]; 
2fc60 6a 3c 6e 54 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c  j<nTabList; j++,
2fc70 20 73 57 42 49 2e 70 53 72 63 2b 2b 29 7b 0a 20   sWBI.pSrc++){. 
2fc80 20 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74         int doNot
2fc90 52 65 6f 72 64 65 72 3b 20 20 20 20 2f 2a 20 54  Reorder;    /* T
2fca0 72 75 65 20 69 66 20 74 68 69 73 20 74 61 62 6c  rue if this tabl
2fcb0 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
2fcc0 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 0a  reordered */.  .
2fcd0 20 20 20 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f          doNotReo
2fce0 72 64 65 72 20 3d 20 20 28 73 57 42 49 2e 70 53  rder =  (sWBI.pS
2fcf0 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28  rc->jointype & (
2fd00 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
2fd10 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  ))!=0;.        i
2fd20 66 28 20 6a 21 3d 69 46 72 6f 6d 20 26 26 20 64  f( j!=iFrom && d
2fd30 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72  oNotReorder ) br
2fd40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d  eak;.        m =
2fd50 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
2fd60 74 2c 20 73 57 42 49 2e 70 53 72 63 2d 3e 69 43  t, sWBI.pSrc->iC
2fd70 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
2fd80 69 66 28 20 28 6d 20 26 20 73 57 42 49 2e 6e 6f  if( (m & sWBI.no
2fd90 74 56 61 6c 69 64 29 3d 3d 30 20 29 7b 0a 20 20  tValid)==0 ){.  
2fda0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69          if( j==i
2fdb0 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a  From ) iFrom++;.
2fdc0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2fdd0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
2fde0 20 20 20 20 20 20 73 57 42 49 2e 6e 6f 74 52 65        sWBI.notRe
2fdf0 61 64 79 20 3d 20 28 69 73 4f 70 74 69 6d 61 6c  ady = (isOptimal
2fe00 20 3f 20 6d 20 3a 20 73 57 42 49 2e 6e 6f 74 56   ? m : sWBI.notV
2fe10 61 6c 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69  alid);.        i
2fe20 66 28 20 73 57 42 49 2e 70 53 72 63 2d 3e 70 49  f( sWBI.pSrc->pI
2fe30 6e 64 65 78 3d 3d 30 20 29 20 6e 55 6e 63 6f 6e  ndex==0 ) nUncon
2fe40 73 74 72 61 69 6e 65 64 2b 2b 3b 0a 20 20 0a 20  strained++;.  . 
2fe50 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
2fe60 45 28 28 22 20 20 20 3d 3d 3d 20 74 72 79 69 6e  E(("   === tryin
2fe70 67 20 74 61 62 6c 65 20 25 64 20 28 25 73 29 20  g table %d (%s) 
2fe80 77 69 74 68 20 69 73 4f 70 74 69 6d 61 6c 3d 25  with isOptimal=%
2fe90 64 20 3d 3d 3d 5c 6e 22 2c 0a 20 20 20 20 20 20  d ===\n",.      
2fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c                j,
2feb0 20 73 57 42 49 2e 70 53 72 63 2d 3e 70 54 61 62   sWBI.pSrc->pTab
2fec0 2d 3e 7a 4e 61 6d 65 2c 20 69 73 4f 70 74 69 6d  ->zName, isOptim
2fed0 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  al));.        as
2fee0 73 65 72 74 28 20 73 57 42 49 2e 70 53 72 63 2d  sert( sWBI.pSrc-
2fef0 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66  >pTab );.#ifndef
2ff00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2ff10 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
2ff20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
2ff30 73 57 42 49 2e 70 53 72 63 2d 3e 70 54 61 62 29  sWBI.pSrc->pTab)
2ff40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 57   ){.          sW
2ff50 42 49 2e 70 70 49 64 78 49 6e 66 6f 20 3d 20 26  BI.ppIdxInfo = &
2ff60 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64  pWInfo->a[j].pId
2ff70 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  xInfo;.         
2ff80 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
2ff90 78 28 26 73 57 42 49 29 3b 0a 20 20 20 20 20 20  x(&sWBI);.      
2ffa0 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a    }else .#endif.
2ffb0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2ffc0 20 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64      bestBtreeInd
2ffd0 65 78 28 26 73 57 42 49 29 3b 0a 20 20 20 20 20  ex(&sWBI);.     
2ffe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2fff0 65 72 74 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c  ert( isOptimal |
30000 7c 20 28 73 57 42 49 2e 63 6f 73 74 2e 75 73 65  | (sWBI.cost.use
30010 64 26 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29  d&sWBI.notValid)
30020 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  ==0 );..        
30030 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44  /* If an INDEXED
30040 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 70 72   BY clause is pr
30050 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  esent, then the 
30060 70 6c 61 6e 20 6d 75 73 74 20 75 73 65 20 74 68  plan must use th
30070 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  at.        ** in
30080 64 65 78 20 69 66 20 69 74 20 75 73 65 73 20 61  dex if it uses a
30090 6e 79 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 20  ny index at all 
300a0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
300b0 74 28 20 73 57 42 49 2e 70 53 72 63 2d 3e 70 49  t( sWBI.pSrc->pI
300c0 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20  ndex==0 .       
300d0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73             || (s
300e0 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73  WBI.cost.plan.ws
300f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
30100 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20  T_FULLSCAN)==0. 
30110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30120 20 7c 7c 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c   || sWBI.cost.pl
30130 61 6e 2e 75 2e 70 49 64 78 3d 3d 73 57 42 49 2e  an.u.pIdx==sWBI.
30140 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 3b 0a  pSrc->pIndex );.
30150 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
30160 70 74 69 6d 61 6c 20 26 26 20 28 73 57 42 49 2e  ptimal && (sWBI.
30170 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
30180 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
30190 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20  LLSCAN)==0 ){.  
301a0 20 20 20 20 20 20 20 20 6e 6f 74 49 6e 64 65 78          notIndex
301b0 65 64 20 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20  ed |= m;.       
301c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
301d0 73 4f 70 74 69 6d 61 6c 20 29 7b 0a 20 20 20 20  sOptimal ){.    
301e0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b        pWInfo->a[
301f0 6a 5d 2e 72 4f 70 74 43 6f 73 74 20 3d 20 73 57  j].rOptCost = sW
30200 42 49 2e 63 6f 73 74 2e 72 43 6f 73 74 3b 0a 20  BI.cost.rCost;. 
30210 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
30220 20 69 46 72 6f 6d 3c 6e 54 61 62 4c 69 73 74 2d   iFrom<nTabList-
30230 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 ){.          /
30240 2a 20 49 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  * If two or more
30250 20 74 61 62 6c 65 73 20 68 61 76 65 20 6e 65 61   tables have nea
30260 72 6c 79 20 74 68 65 20 73 61 6d 65 20 6f 75 74  rly the same out
30270 65 72 20 6c 6f 6f 70 20 63 6f 73 74 2c 0a 20 20  er loop cost,.  
30280 20 20 20 20 20 20 20 20 2a 2a 20 76 65 72 79 20          ** very 
30290 64 69 66 66 65 72 65 6e 74 20 69 6e 6e 65 72 20  different inner 
302a0 6c 6f 6f 70 20 28 6f 70 74 69 6d 61 6c 29 20 63  loop (optimal) c
302b0 6f 73 74 2c 20 77 65 20 77 61 6e 74 20 74 6f 20  ost, we want to 
302c0 63 68 6f 6f 73 65 0a 20 20 20 20 20 20 20 20 20  choose.         
302d0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6f 75 74 65   ** for the oute
302e0 72 20 6c 6f 6f 70 20 74 68 61 74 20 74 61 62 6c  r loop that tabl
302f0 65 20 77 68 69 63 68 20 62 65 6e 65 66 69 74 73  e which benefits
30300 20 74 68 65 20 6c 65 61 73 74 20 66 72 6f 6d 0a   the least from.
30310 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69            ** bei
30320 6e 67 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ng in the inner 
30330 6c 6f 6f 70 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  loop.  The follo
30340 77 69 6e 67 20 63 6f 64 65 20 73 63 61 6c 65 73  wing code scales
30350 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
30360 2a 2a 20 6f 75 74 65 72 20 6c 6f 6f 70 20 63 6f  ** outer loop co
30370 73 74 20 65 73 74 69 6d 61 74 65 20 74 6f 20 61  st estimate to a
30380 63 63 6f 6d 70 6c 69 73 68 20 74 68 61 74 2e 20  ccomplish that. 
30390 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  */.          WHE
303a0 52 45 54 52 41 43 45 28 28 22 20 20 20 73 63 61  RETRACE(("   sca
303b0 6c 69 6e 67 20 63 6f 73 74 20 66 72 6f 6d 20 25  ling cost from %
303c0 2e 31 66 20 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a  .1f to %.1f\n",.
303d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303e0 20 20 20 20 20 20 73 57 42 49 2e 63 6f 73 74 2e        sWBI.cost.
303f0 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20  rCost,.         
30400 20 20 20 20 20 20 20 20 20 20 20 20 20 73 57 42               sWB
30410 49 2e 63 6f 73 74 2e 72 43 6f 73 74 2f 70 57 49  I.cost.rCost/pWI
30420 6e 66 6f 2d 3e 61 5b 6a 5d 2e 72 4f 70 74 43 6f  nfo->a[j].rOptCo
30430 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st));.          
30440 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f 73 74 20  sWBI.cost.rCost 
30450 2f 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e  /= pWInfo->a[j].
30460 72 4f 70 74 43 6f 73 74 3b 0a 20 20 20 20 20 20  rOptCost;.      
30470 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
30480 43 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72  Conditions under
30490 20 77 68 69 63 68 20 74 68 69 73 20 74 61 62 6c   which this tabl
304a0 65 20 62 65 63 6f 6d 65 73 20 74 68 65 20 62 65  e becomes the be
304b0 73 74 20 73 6f 20 66 61 72 3a 0a 20 20 20 20 20  st so far:.     
304c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
304d0 20 20 20 28 31 29 20 54 68 65 20 74 61 62 6c 65     (1) The table
304e0 20 6d 75 73 74 20 6e 6f 74 20 64 65 70 65 6e 64   must not depend
304f0 20 6f 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73   on other tables
30500 20 74 68 61 74 20 68 61 76 65 20 6e 6f 74 0a 20   that have not. 
30510 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
30520 79 65 74 20 72 75 6e 2e 20 20 28 49 6e 20 6f 74  yet run.  (In ot
30530 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 6d 75  her words, it mu
30540 73 74 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e  st not depend on
30550 20 74 61 62 6c 65 73 0a 20 20 20 20 20 20 20 20   tables.        
30560 2a 2a 20 20 20 20 20 20 20 69 6e 20 69 6e 6e 65  **       in inne
30570 72 20 6c 6f 6f 70 73 2e 29 0a 20 20 20 20 20 20  r loops.).      
30580 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
30590 20 20 28 32 29 20 28 54 68 69 73 20 72 75 6c 65    (2) (This rule
305a0 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20   was removed on 
305b0 32 30 31 32 2d 31 31 2d 30 39 2e 20 20 54 68 65  2012-11-09.  The
305c0 20 73 63 61 6c 69 6e 67 20 6f 66 20 74 68 65 0a   scaling of the.
305d0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
305e0 20 63 6f 73 74 20 75 73 69 6e 67 20 74 68 65 20   cost using the 
305f0 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 63 6f 73  optimal scan cos
30600 74 20 6d 61 64 65 20 74 68 69 73 20 72 75 6c 65  t made this rule
30610 20 6f 62 73 6f 6c 65 74 65 2e 29 0a 20 20 20 20   obsolete.).    
30620 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
30630 2a 20 20 20 28 33 29 20 41 6c 6c 20 74 61 62 6c  *   (3) All tabl
30640 65 73 20 68 61 76 65 20 61 6e 20 49 4e 44 45 58  es have an INDEX
30650 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ED BY clause or 
30660 74 68 69 73 20 74 61 62 6c 65 20 6c 61 63 6b 73  this table lacks
30670 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   an.        **  
30680 20 20 20 20 20 49 4e 44 45 58 45 44 20 42 59 20       INDEXED BY 
30690 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20 74  clause or this t
306a0 61 62 6c 65 20 75 73 65 73 20 74 68 65 20 73 70  able uses the sp
306b0 65 63 69 66 69 63 0a 20 20 20 20 20 20 20 20 2a  ecific.        *
306c0 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 73 70  *       index sp
306d0 65 63 69 66 69 65 64 20 62 79 20 69 74 73 20 49  ecified by its I
306e0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
306f0 2e 20 20 54 68 69 73 20 72 75 6c 65 20 65 6e 73  .  This rule ens
30700 75 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ures.        ** 
30710 20 20 20 20 20 20 74 68 61 74 20 61 20 62 65 73        that a bes
30720 74 2d 73 6f 2d 66 61 72 20 69 73 20 61 6c 77 61  t-so-far is alwa
30730 79 73 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e  ys selected even
30740 20 69 66 20 61 6e 20 69 6d 70 6f 73 73 69 62 6c   if an impossibl
30750 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  e.        **    
30760 20 20 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f     combination o
30770 66 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  f INDEXED BY cla
30780 75 73 65 73 20 61 72 65 20 67 69 76 65 6e 2e 20  uses are given. 
30790 20 54 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20   The error.     
307a0 20 20 20 2a 2a 20 20 20 20 20 20 20 77 69 6c 6c     **       will
307b0 20 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64   be detected and
307c0 20 72 65 6c 61 79 65 64 20 62 61 63 6b 20 74 6f   relayed back to
307d0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
307e0 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20   later..        
307f0 2a 2a 20 20 20 20 20 20 20 54 68 65 20 4e 45 56  **       The NEV
30800 45 52 28 29 20 63 6f 6d 65 73 20 61 62 6f 75 74  ER() comes about
30810 20 62 65 63 61 75 73 65 20 72 75 6c 65 20 28 32   because rule (2
30820 29 20 61 62 6f 76 65 20 70 72 65 76 65 6e 74 73  ) above prevents
30830 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
30840 20 20 41 6e 20 69 6e 64 65 78 61 62 6c 65 20 66    An indexable f
30850 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 66  ull-table-scan f
30860 72 6f 6d 20 72 65 61 63 68 69 6e 67 20 72 75 6c  rom reaching rul
30870 65 20 28 33 29 2e 0a 20 20 20 20 20 20 20 20 2a  e (3)..        *
30880 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28  *.        **   (
30890 34 29 20 54 68 65 20 70 6c 61 6e 20 63 6f 73 74  4) The plan cost
308a0 20 6d 75 73 74 20 62 65 20 6c 6f 77 65 72 20 74   must be lower t
308b0 68 61 6e 20 70 72 69 6f 72 20 70 6c 61 6e 73 2c  han prior plans,
308c0 20 77 68 65 72 65 20 22 63 6f 73 74 22 0a 20 20   where "cost".  
308d0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69        **       i
308e0 73 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65  s defined by the
308f0 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 29 20 66   compareCost() f
30900 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 20 0a  unction above. .
30910 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30920 20 20 20 69 66 28 20 28 73 57 42 49 2e 63 6f 73     if( (sWBI.cos
30930 74 2e 75 73 65 64 26 73 57 42 49 2e 6e 6f 74 56  t.used&sWBI.notV
30940 61 6c 69 64 29 3d 3d 30 20 20 20 20 20 20 20 20  alid)==0        
30950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
30960 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  1) */.          
30970 20 20 26 26 20 28 6e 55 6e 63 6f 6e 73 74 72 61    && (nUnconstra
30980 69 6e 65 64 3d 3d 30 20 7c 7c 20 73 57 42 49 2e  ined==0 || sWBI.
30990 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20  pSrc->pIndex==0 
309a0 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f         /* (3) */
309b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
309c0 20 7c 7c 20 4e 45 56 45 52 28 28 73 57 42 49 2e   || NEVER((sWBI.
309d0 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
309e0 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
309f0 4c 4c 53 43 41 4e 29 21 3d 30 29 29 0a 20 20 20  LLSCAN)!=0)).   
30a00 20 20 20 20 20 20 20 20 20 26 26 20 28 62 65 73           && (bes
30a10 74 4a 3c 30 20 7c 7c 20 63 6f 6d 70 61 72 65 43  tJ<0 || compareC
30a20 6f 73 74 28 26 73 57 42 49 2e 63 6f 73 74 2c 20  ost(&sWBI.cost, 
30a30 26 62 65 73 74 50 6c 61 6e 29 29 20 20 20 2f 2a  &bestPlan))   /*
30a40 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
30a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  ){.          WHE
30a60 52 45 54 52 41 43 45 28 28 22 20 20 20 3d 3d 3d  RETRACE(("   ===
30a70 20 74 61 62 6c 65 20 25 64 20 28 25 73 29 20 69   table %d (%s) i
30a80 73 20 62 65 73 74 20 73 6f 20 66 61 72 5c 6e 22  s best so far\n"
30a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30aa0 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20 63         "       c
30ab0 6f 73 74 3d 25 2e 31 66 2c 20 6e 52 6f 77 3d 25  ost=%.1f, nRow=%
30ac0 2e 31 66 2c 20 6e 4f 42 53 61 74 3d 25 64 2c 20  .1f, nOBSat=%d, 
30ad0 77 73 46 6c 61 67 73 3d 25 30 38 78 5c 6e 22 2c  wsFlags=%08x\n",
30ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30af0 20 20 20 20 20 20 20 6a 2c 20 73 57 42 49 2e 70         j, sWBI.p
30b00 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  Src->pTab->zName
30b10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30b20 20 20 20 20 20 20 20 20 73 57 42 49 2e 63 6f 73          sWBI.cos
30b30 74 2e 72 43 6f 73 74 2c 20 73 57 42 49 2e 63 6f  t.rCost, sWBI.co
30b40 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 2c 0a 20 20  st.plan.nRow,.  
30b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b60 20 20 20 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c      sWBI.cost.pl
30b70 61 6e 2e 6e 4f 42 53 61 74 2c 20 73 57 42 49 2e  an.nOBSat, sWBI.
30b80 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
30b90 73 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  s));.          b
30ba0 65 73 74 50 6c 61 6e 20 3d 20 73 57 42 49 2e 63  estPlan = sWBI.c
30bb0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ost;.          b
30bc0 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20  estJ = j;.      
30bd0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
30be0 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
30bf0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
30c00 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
30c10 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20  bestJ>=0 );.    
30c20 61 73 73 65 72 74 28 20 73 57 42 49 2e 6e 6f 74  assert( sWBI.not
30c30 56 61 6c 69 64 20 26 20 67 65 74 4d 61 73 6b 28  Valid & getMask(
30c40 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
30c50 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
30c60 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 57 48 45  rsor) );.    WHE
30c70 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
30c80 74 69 6d 69 7a 65 72 20 73 65 6c 65 63 74 73 20  timizer selects 
30c90 74 61 62 6c 65 20 25 64 20 28 25 73 29 20 66 6f  table %d (%s) fo
30ca0 72 20 6c 6f 6f 70 20 25 64 20 77 69 74 68 3a 5c  r loop %d with:\
30cb0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
30cc0 20 20 20 22 20 20 20 20 63 6f 73 74 3d 25 2e 31     "    cost=%.1
30cd0 66 2c 20 6e 52 6f 77 3d 25 2e 31 66 2c 20 6e 4f  f, nRow=%.1f, nO
30ce0 42 53 61 74 3d 25 64 2c 20 77 73 46 6c 61 67 73  BSat=%d, wsFlags
30cf0 3d 30 78 25 30 38 78 5c 6e 22 2c 0a 20 20 20 20  =0x%08x\n",.    
30d00 20 20 20 20 20 20 20 20 20 20 20 20 62 65 73 74              best
30d10 4a 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  J, pTabList->a[b
30d20 65 73 74 4a 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d  estJ].pTab->zNam
30d30 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
30d40 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f     pLevel-pWInfo
30d50 2d 3e 61 2c 20 62 65 73 74 50 6c 61 6e 2e 72 43  ->a, bestPlan.rC
30d60 6f 73 74 2c 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ost, bestPlan.pl
30d70 61 6e 2e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  an.nRow,.       
30d80 20 20 20 20 20 20 20 20 20 62 65 73 74 50 6c 61           bestPla
30d90 6e 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 2c 20 62  n.plan.nOBSat, b
30da0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
30db0 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20  lags));.    if( 
30dc0 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
30dd0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  sFlags & WHERE_D
30de0 49 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20  ISTINCT)!=0 ){. 
30df0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
30e00 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
30e10 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 );.      pWInf
30e20 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
30e30 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
30e40 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  DERED;.    }.   
30e50 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73   andFlags &= bes
30e60 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
30e70 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  gs;.    pLevel->
30e80 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61 6e 2e  plan = bestPlan.
30e90 70 6c 61 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  plan;.    pLevel
30ea0 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61 62  ->iTabCur = pTab
30eb0 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
30ec0 43 75 72 73 6f 72 3b 0a 20 20 20 20 74 65 73 74  Cursor;.    test
30ed0 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70  case( bestPlan.p
30ee0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
30ef0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20  ERE_INDEXED );. 
30f00 20 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73     testcase( bes
30f10 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
30f20 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
30f30 49 4e 44 45 58 20 29 3b 0a 20 20 20 20 69 66 28  INDEX );.    if(
30f40 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77   bestPlan.plan.w
30f50 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
30f60 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 54 45  INDEXED|WHERE_TE
30f70 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  MP_INDEX) ){.   
30f80 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
30f90 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
30fa0 42 4c 45 5f 4f 4e 4c 59 29 20 0a 20 20 20 20 20  BLE_ONLY) .     
30fb0 20 20 26 26 20 28 62 65 73 74 50 6c 61 6e 2e 70    && (bestPlan.p
30fc0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
30fd0 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3d  ERE_TEMP_INDEX)=
30fe0 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =0 .      ){.   
30ff0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
31000 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a  xCur = iIdxCur;.
31010 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31020 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
31030 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
31040 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Tab++;.      }. 
31050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31060 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
31070 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
31080 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 20 26 3d  sWBI.notValid &=
31090 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53   ~getMask(pMaskS
310a0 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
310b0 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b  bestJ].iCursor);
310c0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
310d0 6f 6d 20 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a  om = (u8)bestJ;.
310e0 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e      if( bestPlan
310f0 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d 28 64 6f 75  .plan.nRow>=(dou
31100 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 20 20 70  ble)1 ){.      p
31110 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
31120 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c  p *= bestPlan.pl
31130 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 0a  an.nRow;.    }..
31140 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
31150 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  t if the table s
31160 63 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c  canned by this l
31170 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 68 61  oop iteration ha
31180 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44 45  d an.    ** INDE
31190 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 61 74  XED BY clause at
311a0 74 61 63 68 65 64 20 74 6f 20 69 74 2c 20 74 68  tached to it, th
311b0 61 74 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  at the named ind
311c0 65 78 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  ex is being.    
311d0 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  ** used for the 
311e0 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74 68  scan. If not, th
311f0 65 6e 20 71 75 65 72 79 20 63 6f 6d 70 69 6c 61  en query compila
31200 74 69 6f 6e 20 68 61 73 20 66 61 69 6c 65 64 2e  tion has failed.
31210 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61  .    ** Return a
31220 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  n error..    */.
31230 20 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 4c      pIdx = pTabL
31240 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 49  ist->a[bestJ].pI
31250 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
31260 64 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  dx ){.      if( 
31270 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
31280 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
31290 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20 20  NDEXED)==0 ){.  
312a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
312b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
312c0 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a  annot use index:
312d0 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
312e0 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
312f0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
31300 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
31310 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
31320 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
31330 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 62  e is used, the b
31340 65 73 74 49 6e 64 65 78 28 29 20 66 75 6e 63 74  estIndex() funct
31350 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20 2a  ion is.        *
31360 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
31370 66 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20 73  find the index s
31380 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
31390 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
313a0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  e.        ** if 
313b0 69 74 20 66 69 6e 64 20 61 6e 20 69 6e 64 65 78  it find an index
313c0 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20   at all. */.    
313d0 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74      assert( best
313e0 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  Plan.plan.u.pIdx
313f0 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20 20 20 20  ==pIdx );.      
31400 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  }.    }.  }.  WH
31410 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
31420 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
31430 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66  d ***\n"));.  if
31440 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
31450 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
31460 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
31470 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
31480 20 20 7d 0a 20 20 69 66 28 20 6e 54 61 62 4c 69    }.  if( nTabLi
31490 73 74 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  st ){.    pLevel
314a0 2d 2d 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  --;.    pWInfo->
314b0 6e 4f 42 53 61 74 20 3d 20 70 4c 65 76 65 6c 2d  nOBSat = pLevel-
314c0 3e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20  >plan.nOBSat;.  
314d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 49 6e 66  }else{.    pWInf
314e0 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20  o->nOBSat = 0;. 
314f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
31500 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79  total query only
31510 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c   selects a singl
31520 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20  e row, then the 
31530 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c  ORDER BY.  ** cl
31540 61 75 73 65 20 69 73 20 69 72 72 65 6c 65 76 61  ause is irreleva
31550 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  nt..  */.  if( (
31560 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45  andFlags & WHERE
31570 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70  _UNIQUE)!=0 && p
31580 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61  OrderBy ){.    a
31590 73 73 65 72 74 28 20 6e 54 61 62 4c 69 73 74 3d  ssert( nTabList=
315a0 3d 30 20 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70  =0 || (pLevel->p
315b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
315c0 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29 21  ERE_ALL_UNIQUE)!
315d0 3d 30 20 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 );.    pWInfo
315e0 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65  ->nOBSat = pOrde
315f0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  rBy->nExpr;.  }.
31600 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
31610 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
31620 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
31630 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
31640 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
31650 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
31660 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
31670 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
31680 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
31690 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
316a0 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
316b0 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
316c0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
316d0 74 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  ts.  ** the stat
316e0 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20  ement to update 
316f0 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
31700 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
31710 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
31720 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
31730 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
31740 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
31750 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
31760 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
31770 45 53 49 52 45 44 29 21 3d 30 20 26 26 20 28 61  ESIRED)!=0 && (a
31780 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ndFlags & WHERE_
31790 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20  UNIQUE)!=0 ){.  
317a0 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50    pWInfo->okOneP
317b0 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49  ass = 1;.    pWI
317c0 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77  nfo->a[0].plan.w
317d0 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
317e0 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  _IDX_ONLY;.  }..
317f0 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
31800 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
31810 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
31820 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
31830 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
31840 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
31850 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
31860 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
31870 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e  arse, -1); /* In
31880 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20  sert the cookie 
31890 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f  verifier Goto */
318a0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
318b0 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49  Bitmask)0;.  pWI
318c0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28  nfo->nRowOut = (
318d0 64 6f 75 62 6c 65 29 31 3b 0a 20 20 66 6f 72 28  double)1;.  for(
318e0 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  ii=0, pLevel=pWI
318f0 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c  nfo->a; ii<nTabL
31900 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65  ist; ii++, pLeve
31910 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  l++){.    Table 
31920 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61  *pTab;     /* Ta
31930 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
31940 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
31950 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
31960 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
31970 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  ing table/index 
31980 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  */.    struct Sr
31990 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
319a0 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49  Item;..    pTabI
319b0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
319c0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
319d0 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
319e0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
319f0 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
31a00 74 20 2a 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  t *= pLevel->pla
31a10 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 69 44 62 20  n.nRow;.    iDb 
31a20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
31a30 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
31a40 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69  >pSchema);.    i
31a50 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
31a60 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
31a70 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
31a80 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
31a90 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
31aa0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
31ab0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
31ac0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
31ad0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
31ae0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
31af0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
31b00 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
31b10 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
31b20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
31b30 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
31b40 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
31b50 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
31b60 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
31b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31b80 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
31b90 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
31ba0 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
31bb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
31bc0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
31bd0 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
31be0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
31bf0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  if.    if( (pLev
31c00 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
31c10 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
31c20 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  Y)==0.         &
31c30 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
31c40 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
31c50 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  CLOSE)==0 ){.   
31c60 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e     int op = pWIn
31c70 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20  fo->okOnePass ? 
31c80 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f  OP_OpenWrite : O
31c90 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
31ca0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
31cb0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
31cc0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
31cd0 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20  b, pTab, op);.  
31ce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
31cf0 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
31d00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
31d10 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  e( pTab->nCol==B
31d20 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
31d30 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
31d40 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
31d50 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20  <BMS ){.        
31d60 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
31d70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
31d80 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
31d90 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
31da0 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
31db0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
31dc0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
31dd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
31de0 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20  entAddr(v)-1, . 
31df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e00 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
31e10 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
31e20 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
31e30 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
31e40 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
31e50 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
31e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
31e70 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
31e80 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
31e90 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
31ea0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
31eb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
31ec0 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69  ATIC_INDEX.    i
31ed0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
31ee0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
31ef0 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20  _TEMP_INDEX)!=0 
31f00 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75  ){.      constru
31f10 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
31f20 28 70 50 61 72 73 65 2c 20 73 57 42 49 2e 70 57  (pParse, sWBI.pW
31f30 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74  C, pTabItem, not
31f40 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a  Ready, pLevel);.
31f50 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
31f60 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
31f70 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
31f80 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
31f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  =0 ){.      Inde
31fa0 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  x *pIx = pLevel-
31fb0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20  >plan.u.pIdx;.  
31fc0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
31fd0 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
31fe0 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
31ff0 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  pIx);.      int 
32000 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76  iIndexCur = pLev
32010 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
32020 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
32030 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
32040 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
32050 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
32060 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r>=0 );.      sq
32070 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
32080 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
32090 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
320a0 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20  tnum, iDb,.     
320b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320c0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20     (char*)pKey, 
320d0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
320e0 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  FF);.      VdbeC
320f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
32100 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20   pIx->zName));. 
32110 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
32120 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
32130 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
32140 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
32150 67 65 74 4d 61 73 6b 28 73 57 42 49 2e 70 57 43  getMask(sWBI.pWC
32160 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  ->pMaskSet, pTab
32170 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
32180 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
32190 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
321a0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
321b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
321c0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
321d0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
321e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
321f0 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
32200 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
32210 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
32220 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
32230 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
32240 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
32250 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
32260 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
32270 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
32280 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
32290 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
322a0 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
322b0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
322c0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a  &pWInfo->a[ii];.
322d0 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
322e0 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  an(pParse, pTabL
322f0 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c  ist, pLevel, ii,
32300 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
32310 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20  wctrlFlags);.   
32320 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65   notReady = code
32330 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49  OneLoopStart(pWI
32340 6e 66 6f 2c 20 69 69 2c 20 77 63 74 72 6c 46 6c  nfo, ii, wctrlFl
32350 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a  ags, notReady);.
32360 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
32370 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e  tinue = pLevel->
32380 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23  addrCont;.  }..#
32390 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
323a0 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e  T  /* For testin
323b0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
323c0 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a  use only */.  /*
323d0 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71   Record in the q
323e0 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d  uery plan inform
323f0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
32400 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20  current table.  
32410 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
32420 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
32430 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66  it (if any).  If
32440 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
32450 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73  f.  ** is not us
32460 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20  ed, its name is 
32470 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e  just '{}'.  If n
32480 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a  o index is used.
32490 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
324a0 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22  s listed as "{}"
324b0 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  .  If the primar
324c0 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68  y key is used th
324d0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d  e.  ** index nam
324e0 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20  e is '*'..  */. 
324f0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54   for(ii=0; ii<nT
32500 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20  abList; ii++){. 
32510 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
32520 69 6e 74 20 6e 3b 0a 20 20 20 20 69 6e 74 20 77  int n;.    int w
32530 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
32540 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
32550 74 65 6d 3b 0a 0a 20 20 20 20 70 4c 65 76 65 6c  tem;..    pLevel
32560 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
32570 5d 3b 0a 20 20 20 20 77 20 3d 20 70 4c 65 76 65  ];.    w = pLeve
32580 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b  l->plan.wsFlags;
32590 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
325a0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
325b0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
325c0 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a   z = pTabItem->z
325d0 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a  Alias;.    if( z
325e0 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74  ==0 ) z = pTabIt
325f0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  em->pTab->zName;
32600 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
32610 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
32620 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20   if( n+nQPlan < 
32630 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71  sizeof(sqlite3_q
32640 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b  uery_plan)-10 ){
32650 0a 20 20 20 20 20 20 69 66 28 20 28 77 20 26 20  .      if( (w & 
32660 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
32670 3d 30 20 26 26 20 28 77 20 26 20 57 48 45 52 45  =0 && (w & WHERE
32680 5f 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30 20  _COVER_SCAN)==0 
32690 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
326a0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
326b0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
326c0 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  {}", 2);.       
326d0 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
326e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
326f0 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
32700 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
32710 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Plan], z, n);.  
32720 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
32730 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
32740 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
32750 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
32760 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  ' ';.    }.    t
32770 65 73 74 63 61 73 65 28 20 77 20 26 20 57 48 45  estcase( w & WHE
32780 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20  RE_ROWID_EQ );. 
32790 20 20 20 74 65 73 74 63 61 73 65 28 20 77 20 26     testcase( w &
327a0 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
327b0 47 45 20 29 3b 0a 20 20 20 20 69 66 28 20 77 20  GE );.    if( w 
327c0 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  & (WHERE_ROWID_E
327d0 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
327e0 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 6d 65  NGE) ){.      me
327f0 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
32800 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
32810 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20 20 20  , "* ", 2);.    
32820 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20    nQPlan += 2;. 
32830 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 77 20     }else if( (w 
32840 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
32850 21 3d 30 20 26 26 20 28 77 20 26 20 57 48 45 52  !=0 && (w & WHER
32860 45 5f 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30  E_COVER_SCAN)==0
32870 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71   ){.      n = sq
32880 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c  lite3Strlen30(pL
32890 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
328a0 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
328b0 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20   if( n+nQPlan < 
328c0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71  sizeof(sqlite3_q
328d0 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a  uery_plan)-2 ){.
328e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
328f0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
32900 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76  an[nQPlan], pLev
32910 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d  el->plan.u.pIdx-
32920 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  >zName, n);.    
32930 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b      nQPlan += n;
32940 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32950 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
32960 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
32970 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
32980 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
32990 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
329a0 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c  [nQPlan], "{} ",
329b0 20 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   3);.      nQPla
329c0 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20  n += 3;.    }.  
329d0 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61  }.  while( nQPla
329e0 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71  n>0 && sqlite3_q
329f0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
32a00 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]==' ' ){.    
32a10 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
32a20 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30  an[--nQPlan] = 0
32a30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
32a40 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
32a50 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e  n] = 0;.  nQPlan
32a60 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20   = 0;.#endif /* 
32a70 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54  SQLITE_TEST // T
32a80 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
32a90 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f  ging use only */
32aa0 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
32ab0 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61  e continuation a
32ac0 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68  ddress in the Wh
32ad0 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
32ae0 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c  e.  Then.  ** cl
32af0 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
32b00 6e 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  n..  */.  return
32b10 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a   pWInfo;..  /* J
32b20 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c  ump here if mall
32b30 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72  oc fails */.wher
32b40 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69  eBeginError:.  i
32b50 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20  f( pWInfo ){.   
32b60 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
32b70 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
32b80 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
32b90 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65     whereInfoFree
32ba0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
32bb0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
32bc0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
32bd0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
32be0 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
32bf0 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
32c00 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
32c10 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
32c20 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
32c30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
32c40 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
32c50 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61  o *pWInfo){.  Pa
32c60 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
32c70 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
32c80 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
32c90 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
32ca0 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  ;.  WhereLevel *
32cb0 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73  pLevel;.  SrcLis
32cc0 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
32cd0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
32ce0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
32cf0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
32d00 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20  * Generate loop 
32d10 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
32d20 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
32d30 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
32d40 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
32d50 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
32d60 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
32d70 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
32d80 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71  fo->a[i];.    sq
32d90 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
32da0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
32db0 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20  >addrCont);.    
32dc0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
32dd0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
32de0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32df0 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  p2(v, pLevel->op
32e00 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
32e10 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20  evel->p2);.     
32e20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
32e30 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geP5(v, pLevel->
32e40 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  p5);.    }.    i
32e50 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
32e60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
32e70 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65  IN_ABLE && pLeve
32e80 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b  l->u.in.nIn>0 ){
32e90 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
32ea0 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20  Loop *pIn;.     
32eb0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
32ec0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
32ed0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
32ee0 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20  >addrNxt);.     
32ef0 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75   for(j=pLevel->u
32f00 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c  .in.nIn, pIn=&pL
32f10 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
32f20 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d  op[j-1]; j>0; j-
32f30 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20  -, pIn--){.     
32f40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
32f50 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
32f60 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20  ddrInTop+1);.   
32f70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
32f80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
32f90 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49  t, pIn->iCur, pI
32fa0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20  n->addrInTop);. 
32fb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
32fc0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
32fd0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b  n->addrInTop-1);
32fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
32ff0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
33000 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
33010 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  nLoop);.    }.  
33020 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
33030 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
33040 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
33050 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
33060 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
33070 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
33080 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
33090 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
330a0 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
330b0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
330c0 20 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65    assert( (pLeve
330d0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
330e0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
330f0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
33100 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  || (pLevel->plan
33110 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
33120 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a  _INDEXED)!=0 );.
33130 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65        if( (pLeve
33140 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
33150 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
33160 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
33170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33180 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
33190 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
331a0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
331b0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
331c0 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29  el->iIdxCur>=0 )
331d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
331e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
331f0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
33200 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
33210 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
33220 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65  Level->op==OP_Re
33230 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  turn ){.        
33240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33250 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
33260 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
33270 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
33280 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
332a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
332b0 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
332c0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
332d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
332e0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
332f0 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dr);.    }.  }..
33300 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
33310 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
33320 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
33330 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
33340 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
33350 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
33360 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
33370 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
33380 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  ak);..  /* Close
33390 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73   all of the curs
333a0 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70  ors that were op
333b0 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  ened by sqlite3W
333c0 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a  hereBegin..  */.
333d0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
333e0 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  ->nLevel==1 || p
333f0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70  WInfo->nLevel==p
33400 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
33410 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
33420 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
33430 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
33440 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
33450 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
33460 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
33470 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
33480 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
33490 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
334a0 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
334b0 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
334c0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
334d0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
334e0 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
334f0 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
33500 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26  meral)==0.     &
33510 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
33520 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e  =0.     && (pWIn
33530 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
33540 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
33550 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29  _CLOSE)==0.    )
33560 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d  {.      int ws =
33570 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
33580 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28  Flags;.      if(
33590 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
335a0 61 73 73 20 26 26 20 28 77 73 20 26 20 57 48 45  ass && (ws & WHE
335b0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
335c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
335d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
335e0 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74  OP_Close, pTabIt
335f0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
33600 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
33610 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
33620 58 45 44 29 21 3d 30 20 26 26 20 28 77 73 20 26  XED)!=0 && (ws &
33630 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
33640 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  X)==0 ){.       
33650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33660 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
33670 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
33680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
33690 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
336a0 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64  scan uses an ind
336b0 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75  ex, make code su
336c0 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72  bstitutions to r
336d0 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  ead data.    ** 
336e0 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69  from the index i
336f0 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20  n preference to 
33700 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74  the table. Somet
33710 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73  imes, this means
33720 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
33730 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20  e need never be 
33740 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20  read from. This 
33750 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  is a performance
33760 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61   boost,.    ** a
33770 73 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c  s the vdbe level
33780 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65   waits until the
33790 20 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62   table is read b
337a0 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20  efore actually. 
337b0 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68     ** seeking th
337c0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74  e table cursor t
337d0 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72  o the record cor
337e0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
337f0 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
33800 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
33810 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a   index..    ** .
33820 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
33830 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
33840 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
33850 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
33860 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
33870 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
33880 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
33890 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
338a0 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
338b0 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
338c0 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
338d0 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
338e0 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
338f0 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
33900 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
33910 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
33920 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
33930 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
33940 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
33950 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
33960 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
33970 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
33980 58 45 44 20 29 7b 0a 20 20 20 20 20 20 70 49 64  XED ){.      pId
33990 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
339a0 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 7d 65 6c  .u.pIdx;.    }el
339b0 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
339c0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
339d0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
339e0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65        pIdx = pLe
339f0 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a  vel->u.pCovidx;.
33a00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
33a10 64 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  dx && !db->mallo
33a20 63 46 61 69 6c 65 64 29 7b 0a 20 20 20 20 20 20  cFailed){.      
33a30 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a  int k, j, last;.
33a40 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
33a50 70 3b 0a 0a 20 20 20 20 20 20 70 4f 70 20 3d 20  p;..      pOp = 
33a60 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
33a70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  (v, pWInfo->iTop
33a80 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20  );.      last = 
33a90 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
33aa0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
33ab0 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69   for(k=pWInfo->i
33ac0 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  Top; k<last; k++
33ad0 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
33ae0 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
33af0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
33b00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
33b10 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
33b20 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
33b30 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
33b40 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
33b50 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
33b60 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
33b70 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  p2==pIdx->aiColu
33b80 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  mn[j] ){.       
33b90 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
33ba0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
33bb0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
33bc0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
33bd0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
33be0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
33bf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33c00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
33c10 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
33c20 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
33c30 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
33c40 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 70 49 64          || j<pId
33c50 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
33c60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
33c70 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
33c80 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
33c90 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
33ca0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
33cb0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
33cc0 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69  ode = OP_IdxRowi
33cd0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
33ce0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
33cf0 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e    /* Final clean
33d00 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65  up.  */.  pParse
33d10 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
33d20 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
33d30 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49  ryLoop;.  whereI
33d40 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
33d50 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
33d60 0a                                               .