/ Hex Artifact Content
Login

Artifact 6c2940f1fabea37d06a80770d2ad71971cf712b5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0460: 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  e.# define WHERE
0470: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
0480: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0490: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
04a0: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
04b0: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65  WhereMaskSet Whe
04e0: 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64  reMaskSet;.typed
04f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0500: 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66  rInfo WhereOrInf
0510: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0520: 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57  t WhereAndInfo W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70  hereAndInfo;.typ
0540: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0550: 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b  eCost WhereCost;
0560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0570: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0580: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0590: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
05a0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
05b0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
05c0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
05d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05e0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05f0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0600: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0610: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0620: 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f   others by AND o
0630: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75  perators,.** usu
0640: 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d  ally, or sometim
0650: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
0660: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  s separated by O
0670: 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  R..**.** All Whe
0680: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
0690: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
06a0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06b0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
06c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
06d0: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
06e0: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
06f0: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
0700: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0710: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0720: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0730: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0750: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
0760: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
0770: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
0780: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
0790: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
07a0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07b0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
07c0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
07d0: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
07e0: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
07f0: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
0800: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
0810: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
0820: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
0830: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0840: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0850: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
0860: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0870: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0880: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0890: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
08a0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
08b0: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
08c0: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
08d0: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
08e0: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
08f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
0900: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
0910: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
0920: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
0930: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
0940: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
0950: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
0960: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
0970: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
0980: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
0990: 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68 65  e, wtFlag as the
09a0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74   TERM_ORINFO set
09b0: 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d   and eOperator==
09c0: 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65  WO_OR.** and the
09d0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
09e0: 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74  Info field point
09f0: 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69  s to auxiliary i
0a00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a  nformation that.
0a10: 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ** is collected 
0a20: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20  about the.**.** 
0a30: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
0a40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
0a50: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
0a60: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
0a70: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
0a80: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
0a90: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
0aa0: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
0ab0: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
0ac0: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
0ad0: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
0ae0: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
0af0: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
0b00: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
0b10: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
0b20: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
0b30: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
0b40: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
0b50: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
0b60: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
0b70: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0b80: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0ba0: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0bb0: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0bc0: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
0bd0: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
0be0: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
0bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
0c00: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
0c10: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
0c20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
0c30: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
0c40: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
0c50: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
0c60: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
0c70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
0c80: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
0c90: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
0ca0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0cb0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0cc0: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
0cd0: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
0ce0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
0cf0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
0d00: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
0d10: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
0d20: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
0d30: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
0d40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
0d50: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0d60: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0d70: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0d80: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0d90: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0da0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0db0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0dc0: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0dd0: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0de0: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0df0: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0e00: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0e10: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0e20: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0e30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0e40: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0e50: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
0e60: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
0e70: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
0e80: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
0e90: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
0ea0: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
0eb0: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
0ec0: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
0ed0: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
0ee0: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
0ef0: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
0f00: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
0f10: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65   tables..*/.type
0f20: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0f30: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0f40: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f50: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0f80: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
0f90: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
0fa0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0fc0: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
0fd0: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
0fe0: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
0ff0: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
1000: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
1010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1020: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
1030: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
1040: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
1050: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
1060: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
1070: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
1080: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
1090: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
10a0: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
10b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65  nformation if (e
10c0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
10d0: 29 21 3d 30 20 2a 2f 0a 20 20 20 20 57 68 65 72  )!=0 */.    Wher
10e0: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
10f0: 66 6f 3b 20 2f 2a 20 45 78 74 72 61 20 69 6e 66  fo; /* Extra inf
1100: 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70  ormation if (eOp
1110: 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21  erator& WO_AND)!
1120: 3d 30 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75  =0 */.  } u;.  u
1130: 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  16 eOperator;   
1140: 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78         /* A WO_x
1150: 78 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69  x value describi
1160: 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20  ng <op> */.  u8 
1170: 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wtFlags;        
1180: 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78       /* TERM_xxx
1190: 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65   bit flags.  See
11a0: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e   below */.  u8 n
11b0: 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
11c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11d0: 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d   children that m
11e0: 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a  ust disable us *
11f0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
1200: 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54  *pWC;       /* T
1210: 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20 74  he clause this t
1220: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a  erm is part of *
1230: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
1240: 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42  eqRight;    /* B
1250: 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  itmask of tables
1260: 20 75 73 65 64 20 62 79 20 70 45 78 70 72 2d 3e   used by pExpr->
1270: 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d  pRight */.  Bitm
1280: 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20  ask prereqAll;  
1290: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
12a0: 66 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  f tables referen
12b0: 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a  ced by pExpr */.
12c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
12d0: 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72  d values of Wher
12e0: 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f  eTerm.wtFlags.*/
12f0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59  .#define TERM_DY
1300: 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20 20  NAMIC    0x01   
1310: 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20  /* Need to call 
1320: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1330: 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a  e(db, pExpr) */.
1340: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52  #define TERM_VIR
1350: 54 55 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f  TUAL    0x02   /
1360: 2a 20 41 64 64 65 64 20 62 79 20 74 68 65 20 6f  * Added by the o
1370: 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f  ptimizer.  Do no
1380: 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e  t code */.#defin
1390: 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20  e TERM_CODED    
13a0: 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73    0x04   /* This
13b0: 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79   term is already
13c0: 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e   coded */.#defin
13d0: 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20  e TERM_COPIED   
13e0: 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20    0x08   /* Has 
13f0: 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69  a child */.#defi
1400: 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20  ne TERM_ORINFO  
1410: 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65 65     0x10   /* Nee
1420: 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68  d to free the Wh
1430: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
1440: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66  o object */.#def
1450: 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  ine TERM_ANDINFO
1460: 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e 65      0x20   /* Ne
1470: 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57  ed to free the W
1480: 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49  hereTerm.u.pAndI
1490: 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69  nfo obj */.#defi
14a0: 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20  ne TERM_OR_OK   
14b0: 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73 65     0x40   /* Use
14c0: 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75  d during OR-clau
14d0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  se processing */
14e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14f0: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 23 20 20 64  NABLE_STAT3.#  d
1500: 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  efine TERM_VNULL
1510: 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20 4d 61      0x80   /* Ma
1520: 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e 55 4c  nufactured x>NUL
1530: 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72  L or x<=NULL ter
1540: 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65  m */.#else.#  de
1550: 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  fine TERM_VNULL 
1560: 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44 69 73     0x00   /* Dis
1570: 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75 73 69  abled if not usi
1580: 6e 67 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64  ng stat3 */.#end
1590: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  if../*.** An ins
15a0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
15b0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
15c0: 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72   holds all infor
15d0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a  mation about a.*
15e0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  * WHERE clause. 
15f0: 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20   Mostly this is 
1600: 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  a container for 
1610: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72  one or more Wher
1620: 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 45 78  eTerms..**.** Ex
1630: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70 4f 75  planation of pOu
1640: 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48 45 52  ter:  For a WHER
1650: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
1660: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
1670: 20 20 20 20 20 61 20 41 4e 44 20 28 28 62 20 41       a AND ((b A
1680: 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e 44 20  ND c) OR (d AND 
1690: 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a 2a 20  e)) AND f.**.** 
16a0: 54 68 65 72 65 20 61 72 65 20 73 65 70 61 72 61  There are separa
16b0: 74 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  te WhereClause o
16c0: 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65 20 77  bjects for the w
16d0: 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e 64 20  hole clause and 
16e0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62 63 6c  for.** the subcl
16f0: 61 75 73 65 73 20 22 28 62 20 41 4e 44 20 63 29  auses "(b AND c)
1700: 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20 65 29  " and "(d AND e)
1710: 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72 20 66  ".  The pOuter f
1720: 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 73  ield of the.** s
1730: 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e 74 73  ubclauses points
1740: 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61   to the WhereCla
1750: 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  use object for t
1760: 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 2e  he whole clause.
1770: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
1780: 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65  Clause {.  Parse
1790: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
17a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
17b0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  r context */.  W
17c0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
17d0: 73 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70 70 69  skSet;  /* Mappi
17e0: 6e 67 20 6f 66 20 74 61 62 6c 65 20 63 75 72 73  ng of table curs
17f0: 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69  or numbers to bi
1800: 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72  tmasks */.  Wher
1810: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
1820: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
1830: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
1840: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
1850: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
1860: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
1870: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
1880: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
1890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
18a0: 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45  ht include WHERE
18b0: 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69  _AND_ONLY */.  i
18c0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
18d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18e0: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
18f0: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1900: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1910: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1920: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1930: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1940: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1950: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1960: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1970: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
1980: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
1990: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
19a0: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
19b0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
19c0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
19d0: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
19e0: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
19f0: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
1a00: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1a10: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1a20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1a30: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1a40: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1a50: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1a60: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1a70: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1a80: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1a90: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1aa0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1ab0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1ac0: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1ad0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1ae0: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1af0: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1b00: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1b10: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1b20: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1b30: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1b40: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1b50: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1b60: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1b70: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1b80: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1b90: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1ba0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1bb0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1bc0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1bd0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1be0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1bf0: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1c00: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1c10: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1c20: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1c30: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1c40: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1c50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1c60: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1c70: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1c80: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1c90: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ca0: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1cb0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1cc0: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1cd0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1ce0: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1cf0: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1d00: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1d10: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1d20: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1d30: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1d40: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1d50: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1d60: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1d70: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1d80: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1d90: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1da0: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1db0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1dc0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1dd0: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1de0: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1df0: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1e00: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1e10: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1e20: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1e30: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1e40: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1e50: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1e60: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1e70: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1e80: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1e90: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1ea0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1eb0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1ec0: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1ed0: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1ee0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1ef0: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1f00: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f10: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1f20: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1f30: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1f40: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1f50: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1f60: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1f70: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1f80: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1f90: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1fa0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1fb0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1fc0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1fd0: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1fe0: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1ff0: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
2000: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
2010: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
2020: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
2030: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
2040: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
2050: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
2060: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
2070: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
2080: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
2090: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
20a0: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
20b0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
20c0: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
20d0: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
20e0: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
20f0: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
2100: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
2110: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
2120: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
2130: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
2140: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2170: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
2180: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
2190: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
21a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21b0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
21c0: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
21d0: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
21e0: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
21f0: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
2200: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2210: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2220: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2230: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2240: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2250: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
2260: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
2270: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
2280: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
2290: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
22a0: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
22b0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
22c0: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
22d0: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
22e0: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
22f0: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
2300: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2310: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2320: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2330: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2340: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2350: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
2360: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
2370: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
2380: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
2390: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
23a0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
23b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
23c0: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
23d0: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
23e0: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
23f0: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
2400: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2410: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2420: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2430: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2440: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2450: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
2460: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
2470: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
2480: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
2490: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
24a0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
24b0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
24c0: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
24d0: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
24e0: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
24f0: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
2500: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2510: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2520: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2530: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2540: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 55 49 56  #define WO_EQUIV
2550: 20 20 30 78 34 30 30 20 20 20 20 20 20 20 2f 2a    0x400       /*
2560: 20 4f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d   Of the form A==
2570: 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20  B, both columns 
2580: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
2590: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
25a0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
25b0: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
25c0: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
25d0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
25e0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
25f0: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2600: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2610: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2620: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2630: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2640: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2650: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2660: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2670: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2680: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
2690: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
26a0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
26b0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
26c0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
26d0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
26e0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
26f0: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2700: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2710: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2720: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2730: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2740: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2750: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2760: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2770: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2780: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
2790: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
27a0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
27b0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
27c0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
27d0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
27e0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
27f0: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2800: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2810: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2820: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2830: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2840: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2850: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2860: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2870: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2880: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
2890: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
28a0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
28b0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
28c0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
28d0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
28e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
28f0: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2900: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2910: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2920: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2930: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2940: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2950: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2960: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2970: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2980: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
2990: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
29a0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
29b0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
29c0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
29d0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
29e0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
29f0: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2a00: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2a10: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2a20: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2a30: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2a40: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2a50: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2a60: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2a70: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2a80: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
2a90: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
2aa0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
2ab0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
2ac0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
2ad0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
2ae0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2af0: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2b00: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2b10: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2b20: 45 20 20 20 20 20 20 30 78 30 38 30 66 31 30 30  E      0x080f100
2b30: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2b40: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2b50: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2b60: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2b70: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2b80: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
2b90: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
2ba0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2bb0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
2bc0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
2bd0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
2be0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2bf0: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2c00: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2c10: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2c20: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2c30: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
2c40: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 34  X_ONLY     0x004
2c50: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
2c60: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
2c70: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
2c80: 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 20 20   WHERE_ORDERED  
2c90: 20 20 20 20 30 78 30 30 38 30 30 30 30 30 20 20      0x00800000  
2ca0: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
2cb0: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
2cc0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2cd0: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
2ce0: 20 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20       0x01000000 
2cf0: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2d00: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2d10: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2d20: 45 20 20 20 20 20 20 20 30 78 30 32 30 30 30 30  E       0x020000
2d30: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2d40: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2d50: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2d60: 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20  HERE_ALL_UNIQUE 
2d70: 20 20 30 78 30 34 30 30 30 30 30 30 20 20 2f 2a    0x04000000  /*
2d80: 20 54 68 69 73 20 61 6e 64 20 61 6c 6c 20 70 72   This and all pr
2d90: 69 6f 72 20 68 61 76 65 20 6f 6e 65 20 72 6f 77  ior have one row
2da0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2db0: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30  E_VIRTUALTABLE 0
2dc0: 78 30 38 30 30 30 30 30 30 20 20 2f 2a 20 55 73  x08000000  /* Us
2dd0: 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20  e virtual-table 
2de0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64  processing */.#d
2df0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54  efine WHERE_MULT
2e00: 49 5f 4f 52 20 20 20 20 20 30 78 31 30 30 30 30  I_OR     0x10000
2e10: 30 30 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67  000  /* OR using
2e20: 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65   multiple indice
2e30: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  s */.#define WHE
2e40: 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20  RE_TEMP_INDEX   
2e50: 30 78 32 30 30 30 30 30 30 30 20 20 2f 2a 20 55  0x20000000  /* U
2e60: 73 65 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ses an ephemeral
2e70: 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e   index */.#defin
2e80: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
2e90: 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30 20       0x40000000 
2ea0: 20 2f 2a 20 43 6f 72 72 65 63 74 20 6f 72 64 65   /* Correct orde
2eb0: 72 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a  r for DISTINCT *
2ec0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2ed0: 43 4f 56 45 52 5f 53 43 41 4e 20 20 20 30 78 38  COVER_SCAN   0x8
2ee0: 30 30 30 30 30 30 30 20 20 2f 2a 20 46 75 6c 6c  0000000  /* Full
2ef0: 20 73 63 61 6e 20 6f 66 20 61 20 63 6f 76 65 72   scan of a cover
2f00: 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a  ing index */../*
2f10: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
2f20: 63 6f 6e 74 61 69 6e 73 20 6d 61 6e 79 20 73 65  contains many se
2f30: 70 61 72 61 74 65 20 73 75 62 72 6f 75 74 69 6e  parate subroutin
2f40: 65 73 20 74 68 61 74 20 77 6f 72 6b 20 74 6f 67  es that work tog
2f50: 65 74 68 65 72 20 74 6f 0a 2a 2a 20 66 69 6e 64  ether to.** find
2f60: 20 74 68 65 20 62 65 73 74 20 69 6e 64 69 63 65   the best indice
2f70: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 61 63 63  s to use for acc
2f80: 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75  essing a particu
2f90: 6c 61 72 20 74 61 62 6c 65 20 69 6e 20 61 20 71  lar table in a q
2fa0: 75 65 72 79 2e 0a 2a 2a 20 41 6e 20 69 6e 73 74  uery..** An inst
2fb0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2fc0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2fd0: 68 6f 6c 64 73 20 63 6f 6e 74 65 78 74 20 69 6e  holds context in
2fe0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
2ff0: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 73 65 61  the.** index sea
3000: 72 63 68 20 73 6f 20 74 68 61 74 20 69 74 20 63  rch so that it c
3010: 61 6e 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c  an be more easil
3020: 79 20 70 61 73 73 65 64 20 62 65 74 77 65 65 6e  y passed between
3030: 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20   the various.** 
3040: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 74 79 70  routines..*/.typ
3050: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
3060: 65 42 65 73 74 49 64 78 20 57 68 65 72 65 42 65  eBestIdx WhereBe
3070: 73 74 49 64 78 3b 0a 73 74 72 75 63 74 20 57 68  stIdx;.struct Wh
3080: 65 72 65 42 65 73 74 49 64 78 20 7b 0a 20 20 50  ereBestIdx {.  P
3090: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
30c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
30d0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
30e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
30f0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
3100: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3110: 65 6d 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  em *pSrc;      /
3120: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
3130: 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
3140: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
3150: 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
3160: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3170: 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61   cursors not ava
3180: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 42 69 74 6d  ilable */.  Bitm
3190: 61 73 6b 20 6e 6f 74 56 61 6c 69 64 3b 20 20 20  ask notValid;   
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
31b0: 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c  ursors not avail
31c0: 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72  able for any pur
31d0: 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pose */.  ExprLi
31e0: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
31f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3200: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
3210: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3220: 70 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  pDistinct;      
3230: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 6c        /* The sel
3240: 65 63 74 2d 6c 69 73 74 20 69 66 20 71 75 65 72  ect-list if quer
3250: 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  y is DISTINCT */
3260: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
3270: 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66  _info **ppIdxInf
3280: 6f 3b 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f  o; /* Index info
3290: 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74  rmation passed t
32a0: 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  o xBestIndex */.
32b0: 20 20 69 6e 74 20 69 2c 20 6e 3b 20 20 20 20 20    int i, n;     
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 20 2f 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20    /* Which loop 
32e0: 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 3b 20  is being coded; 
32f0: 23 20 6f 66 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  # of loops */.  
3300: 57 68 65 72 65 4c 65 76 65 6c 20 2a 61 4c 65 76  WhereLevel *aLev
3310: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
3320: 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6f 75  /* Info about ou
3330: 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57  ter loops */.  W
3340: 68 65 72 65 43 6f 73 74 20 63 6f 73 74 3b 20 20  hereCost cost;  
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3360: 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75  * Lowest cost qu
3370: 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a  ery plan */.};..
3380: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
3390: 45 20 69 66 20 74 68 65 20 70 72 6f 62 65 20 63  E if the probe c
33a0: 6f 73 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ost is less than
33b0: 20 74 68 65 20 62 61 73 65 6c 69 6e 65 20 63 6f   the baseline co
33c0: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  st.*/.static int
33d0: 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 63 6f 6e   compareCost(con
33e0: 73 74 20 57 68 65 72 65 43 6f 73 74 20 2a 70 50  st WhereCost *pP
33f0: 72 6f 62 65 2c 20 63 6f 6e 73 74 20 57 68 65 72  robe, const Wher
3400: 65 43 6f 73 74 20 2a 70 42 61 73 65 6c 69 6e 65  eCost *pBaseline
3410: 29 7b 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d  ){.  if( pProbe-
3420: 3e 72 43 6f 73 74 3c 70 42 61 73 65 6c 69 6e 65  >rCost<pBaseline
3430: 2d 3e 72 43 6f 73 74 20 29 20 72 65 74 75 72 6e  ->rCost ) return
3440: 20 31 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65   1;.  if( pProbe
3450: 2d 3e 72 43 6f 73 74 3e 70 42 61 73 65 6c 69 6e  ->rCost>pBaselin
3460: 65 2d 3e 72 43 6f 73 74 20 29 20 72 65 74 75 72  e->rCost ) retur
3470: 6e 20 30 3b 0a 20 20 69 66 28 20 70 50 72 6f 62  n 0;.  if( pProb
3480: 65 2d 3e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3e 70  e->plan.nOBSat>p
3490: 42 61 73 65 6c 69 6e 65 2d 3e 70 6c 61 6e 2e 6e  Baseline->plan.n
34a0: 4f 42 53 61 74 20 29 20 72 65 74 75 72 6e 20 31  OBSat ) return 1
34b0: 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  ;.  if( pProbe->
34c0: 70 6c 61 6e 2e 6e 52 6f 77 3c 70 42 61 73 65 6c  plan.nRow<pBasel
34d0: 69 6e 65 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 29  ine->plan.nRow )
34e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
34f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
3500: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65  Initialize a pre
3510: 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43  allocated WhereC
3520: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
3530: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3540: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
3550: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
3560: 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  pWC,        /* T
3570: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  he WhereClause t
3580: 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  o be initialized
3590: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
35a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
35b0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
35c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
35d0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
35e0: 74 2c 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  t,  /* Mapping f
35f0: 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72  rom table cursor
3600: 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d   numbers to bitm
3610: 61 73 6b 73 20 2a 2f 0a 20 20 75 31 36 20 77 63  asks */.  u16 wc
3620: 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
3630: 20 20 20 2f 2a 20 4d 69 67 68 74 20 69 6e 63 6c     /* Might incl
3640: 75 64 65 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  ude WHERE_AND_ON
3650: 4c 59 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e  LY */.){.  pWC->
3660: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
3670: 0a 20 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  .  pWC->pMaskSet
3680: 20 3d 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70   = pMaskSet;.  p
3690: 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a  WC->pOuter = 0;.
36a0: 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30    pWC->nTerm = 0
36b0: 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d  ;.  pWC->nSlot =
36c0: 20 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e   ArraySize(pWC->
36d0: 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d  aStatic);.  pWC-
36e0: 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69  >a = pWC->aStati
36f0: 63 3b 0a 20 20 70 57 43 2d 3e 77 63 74 72 6c 46  c;.  pWC->wctrlF
3700: 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
3710: 73 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  s;.}../* Forward
3720: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
3730: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
3740: 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65  lauseClear(Where
3750: 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  Clause*);../*.**
3760: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20   Deallocate all 
3770: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
3780: 64 20 77 69 74 68 20 61 20 57 68 65 72 65 4f 72  d with a WhereOr
3790: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
37a0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
37b0: 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  eOrInfoDelete(sq
37c0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
37d0: 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  OrInfo *p){.  wh
37e0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
37f0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
3800: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
3810: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
3820: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
3830: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
3840: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62   WhereAndInfo ob
3850: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
3860: 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66  void whereAndInf
3870: 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  oDelete(sqlite3 
3880: 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66  *db, WhereAndInf
3890: 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c  o *p){.  whereCl
38a0: 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63  auseClear(&p->wc
38b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
38c0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
38d0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
38e0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
38f0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65  ucture.  The Whe
3900: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
3910: 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20  re.** itself is 
3920: 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73  not freed.  This
3930: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
3940: 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72 65  inverse of where
3950: 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f  ClauseInit()..*/
3960: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
3970: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68  reClauseClear(Wh
3980: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
3990: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
39a0: 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69  eTerm *a;.  sqli
39b0: 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70  te3 *db = pWC->p
39c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72  Parse->db;.  for
39d0: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c  (i=pWC->nTerm-1,
39e0: 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b   a=pWC->a; i>=0;
39f0: 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20   i--, a++){.    
3a00: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
3a10: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
3a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3a30: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  prDelete(db, a->
3a40: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
3a50: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
3a60: 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
3a70: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49  {.      whereOrI
3a80: 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  nfoDelete(db, a-
3a90: 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20  >u.pOrInfo);.   
3aa0: 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74   }else if( a->wt
3ab0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44  Flags & TERM_AND
3ac0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
3ad0: 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65  ereAndInfoDelete
3ae0: 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e  (db, a->u.pAndIn
3af0: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  fo);.    }.  }. 
3b00: 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43   if( pWC->a!=pWC
3b10: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
3b20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3b30: 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a  b, pWC->a);.  }.
3b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
3b50: 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54  ingle new WhereT
3b60: 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65  erm entry to the
3b70: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
3b80: 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20  ect pWC..** The 
3b90: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62  new WhereTerm ob
3ba0: 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63  ject is construc
3bb0: 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20  ted from Expr p 
3bc0: 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73  and with wtFlags
3bd0: 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  ..** The index i
3be0: 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68  n pWC->a[] of th
3bf0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
3c00: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
3c10: 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20  uccess..** 0 is 
3c20: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
3c30: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f  new WhereTerm co
3c40: 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64  uld not be added
3c50: 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79   due to a memory
3c60: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  .** allocation e
3c70: 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72  rror.  The memor
3c80: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
3c90: 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63  lure will be rec
3ca0: 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  orded in.** the 
3cb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3cc0: 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69   flag so that hi
3cd0: 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74  gher-level funct
3ce0: 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20  ions can detect 
3cf0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  it..**.** This r
3d00: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72  outine will incr
3d10: 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
3d20: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
3d30: 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
3d40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
3d50: 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20  tFlags argument 
3d60: 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59  includes TERM_DY
3d70: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70  NAMIC, then resp
3d80: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f  onsibility.** fo
3d90: 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78  r freeing the ex
3da0: 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73  pression p is as
3db0: 73 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65  sumed by the Whe
3dc0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
3dd0: 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  pWC..** This is 
3de0: 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69  true even if thi
3df0: 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
3e00: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
3e10: 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  w WhereTerm..**.
3e20: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69  ** WARNING:  Thi
3e30: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
3e40: 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  reallocate the s
3e50: 70 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f  pace used to sto
3e60: 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73  re.** WhereTerms
3e70: 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20  .  All pointers 
3e80: 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68  to WhereTerms sh
3e90: 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61  ould be invalida
3ea0: 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c  ted after.** cal
3eb0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
3ec0: 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72  e.  Such pointer
3ed0: 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69  s may be reiniti
3ee0: 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65  alized by refere
3ef0: 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43  ncing.** the pWC
3f00: 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ->a[] array..*/.
3f10: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
3f20: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65  ClauseInsert(Whe
3f30: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
3f40: 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61  xpr *p, u8 wtFla
3f50: 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  gs){.  WhereTerm
3f60: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
3f70: 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  dx;.  testcase( 
3f80: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
3f90: 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 45 56  IRTUAL );  /* EV
3fa0: 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 20  : R-00211-15100 
3fb0: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  */.  if( pWC->nT
3fc0: 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20  erm>=pWC->nSlot 
3fd0: 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
3fe0: 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b   *pOld = pWC->a;
3ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4000: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e   = pWC->pParse->
4010: 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d  db;.    pWC->a =
4020: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
4030: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  Raw(db, sizeof(p
4040: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
4050: 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66  Slot*2 );.    if
4060: 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20  ( pWC->a==0 ){. 
4070: 20 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73       if( wtFlags
4080: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
4090: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
40a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
40b0: 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   p);.      }.   
40c0: 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64     pWC->a = pOld
40d0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
40e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
40f0: 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c  py(pWC->a, pOld,
4100: 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30   sizeof(pWC->a[0
4110: 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a  ])*pWC->nTerm);.
4120: 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57      if( pOld!=pW
4130: 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20  C->aStatic ){.  
4140: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4150: 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20  e(db, pOld);.   
4160: 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f   }.    pWC->nSlo
4170: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
4180: 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d  locSize(db, pWC-
4190: 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e  >a)/sizeof(pWC->
41a0: 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65  a[0]);.  }.  pTe
41b0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
41c0: 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d   = pWC->nTerm++]
41d0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  ;.  pTerm->pExpr
41e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
41f0: 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20  ipCollate(p);.  
4200: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d  pTerm->wtFlags =
4210: 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72   wtFlags;.  pTer
4220: 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  m->pWC = pWC;.  
4230: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
4240: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64   -1;.  return id
4250: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  x;.}../*.** This
4260: 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66   routine identif
4270: 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f  ies subexpressio
4280: 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ns in the WHERE 
4290: 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20  clause where.** 
42a0: 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
42b0: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
42c0: 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61  by the AND opera
42d0: 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  tor or some othe
42e0: 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70  r.** operator sp
42f0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f  ecified in the o
4300: 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68  p parameter.  Th
4310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
4320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69  ructure.** is fi
4330: 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65  lled with pointe
4340: 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73  rs to subexpress
4350: 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ions.  For examp
4360: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45  le:.**.**    WHE
4370: 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41  RE  a=='hello' A
4380: 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31  ND coalesce(b,11
4390: 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d  )<10 AND (c+12!=
43a0: 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20  d OR c==22).**  
43b0: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
43c0: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
43d0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
43e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
43f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73  .**            s
4400: 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20  lot[0]          
4410: 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20    slot[1]       
4420: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a          slot[2].
4430: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
4440: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
4450: 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c  in pExpr is unal
4460: 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73  tered.  All this
4470: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
4480: 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20   is make slot[] 
4490: 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f  entries point to
44a0: 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69   substructure wi
44b0: 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a  thin pExpr..**.*
44c0: 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75  * In the previou
44d0: 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69  s sentence and i
44e0: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22  n the diagram, "
44f0: 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74  slot[]" refers t
4500: 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c  o.** the WhereCl
4510: 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20  ause.a[] array. 
4520: 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61   The slot[] arra
4530: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65  y grows as neede
4540: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  d to contain.** 
4550: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
4560: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
4570: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
4580: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c  ereSplit(WhereCl
4590: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
45a0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b  *pExpr, int op){
45b0: 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38  .  pWC->op = (u8
45c0: 29 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72  )op;.  if( pExpr
45d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
45e0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f  if( pExpr->op!=o
45f0: 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  p ){.    whereCl
4600: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
4610: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c  pExpr, 0);.  }el
4620: 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  se{.    whereSpl
4630: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
4640: 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77  Left, op);.    w
4650: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
4660: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
4670: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4680: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78  Initialize an ex
4690: 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
46a0: 74 20 28 61 20 57 68 65 72 65 4d 61 73 6b 53 65  t (a WhereMaskSe
46b0: 74 20 6f 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65  t object).*/.#de
46c0: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
46d0: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
46e0: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
46f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4700: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
4710: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
4720: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
4730: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
4740: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
4750: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
4760: 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d  k getMask(WhereM
4770: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4780: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
4790: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
47a0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d  t( pMaskSet->n<=
47b0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d  (int)sizeof(Bitm
47c0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
47d0: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
47e0: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
47f0: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
4800: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
4810: 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74      return ((Bit
4820: 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20  mask)1)<<i;.    
4830: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
4840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
4850: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
4860: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
4870: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
4880: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
4890: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
48a0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
48b0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
48c0: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
48d0: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
48e0: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
48f0: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
4900: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
4910: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
4920: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
4930: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
4940: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
4950: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
4960: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
4970: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
4980: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
4990: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
49a0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
49b0: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
49c0: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
49d0: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
49e0: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
49f0: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sor;.}../*.** Th
4a00: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
4a10: 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61   (recursively) a
4a20: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
4a30: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a  e and generates.
4a40: 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64  ** a bitmask ind
4a50: 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61  icating which ta
4a60: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  bles are used in
4a70: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
4a80: 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  .** tree..**.** 
4a90: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  In order for thi
4aa0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72  s routine to wor
4ab0: 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  k, the calling f
4ac0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76  unction must hav
4ad0: 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  e.** previously 
4ae0: 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52  invoked sqlite3R
4af0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4b00: 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  ) on the express
4b10: 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65  ion.  See.** the
4b20: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
4b30: 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
4b40: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
4b50: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54  nformation..** T
4b60: 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  he sqlite3Resolv
4b70: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75  eExprNames() rou
4b80: 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20  tines looks for 
4b90: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
4ba0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f  .** sets their o
4bb0: 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c  pcodes to TK_COL
4bc0: 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78  UMN and their Ex
4bd0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
4be0: 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   to.** the VDBE 
4bf0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
4c00: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
4c10: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68  s routine just h
4c20: 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61  as to.** transla
4c30: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
4c40: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61  mbers into bitma
4c50: 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52  sk values and OR
4c60: 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d   all.** the bitm
4c70: 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  asks together..*
4c80: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
4c90: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4ca0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
4cb0: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
4cc0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
4cd0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
4ce0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
4cf0: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
4d00: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
4d10: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4d20: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4d30: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
4d40: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
4d50: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4d60: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
4d70: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
4d80: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
4d90: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
4da0: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
4db0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
4dc0: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
4dd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4de0: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
4df0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4e00: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4e10: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
4e20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4e30: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
4e40: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
4e50: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
4e60: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4e70: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
4e80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
4e90: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
4ea0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4eb0: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
4ec0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
4ed0: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
4ee0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
4ef0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
4f00: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
4f10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
4f20: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
4f30: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
4f40: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
4f50: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
4f60: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4f70: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4f80: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4f90: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
4fa0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
4fb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
4fc0: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
4fd0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
4fe0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4ff0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
5000: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
5010: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
5020: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
5030: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
5040: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
5050: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
5060: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
5070: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
5080: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
5090: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
50a0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
50b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
50c0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
50d0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
50e0: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
50f0: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
5100: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
5110: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
5120: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
5130: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
5140: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
5150: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
5160: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
5170: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
5180: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
5190: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
51a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
51b0: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
51c0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
51d0: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
51e0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
51f0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
5200: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
5210: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
5220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5230: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
5240: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
5250: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
5260: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5270: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
5280: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
5290: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
52a0: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
52b0: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
52c0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
52d0: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
52e0: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
52f0: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
5300: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
5310: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45  IN"..**.** IMPLE
5320: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
5330: 35 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62  59926-26393 To b
5340: 65 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69  e usable by an i
5350: 6e 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74  ndex a term must
5360: 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66   be.** of one of
5370: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
5380: 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65  orms: column = e
5390: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
53a0: 20 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a   > expression.**
53b0: 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65   column >= expre
53c0: 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65  ssion column < e
53d0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
53e0: 20 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   <= expression.*
53f0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63  * expression = c
5400: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
5410: 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73   > column expres
5420: 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a  sion >= column.*
5430: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63  * expression < c
5440: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
5450: 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d   <= column colum
5460: 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73  n IN.** (express
5470: 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e  ion-list) column
5480: 20 49 4e 20 28 73 75 62 71 75 65 72 79 29 20 63   IN (subquery) c
5490: 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f  olumn IS NULL.*/
54a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
54b0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
54c0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
54d0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
54e0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
54f0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
5500: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
5510: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
5520: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
5530: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
5540: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
5550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
5560: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
5570: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
5580: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
5590: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
55a0: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
55b0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
55c0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
55d0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
55e0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
55f0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
5600: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
5610: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
5620: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
5630: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
5640: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
5650: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
5660: 74 2f 72 69 67 68 74 20 70 72 65 63 65 6e 64 65  t/right precende
5670: 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69  nce rules come i
5680: 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65  nto play when de
5690: 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  termining the.**
56a0: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 69   collating.** si
56b0: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
56c0: 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73  ison, it remains
56d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
56e0: 20 74 68 65 20 73 61 6d 65 20 73 69 64 65 20 61   the same side a
56f0: 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d  fter.** the comm
5700: 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63  utation. So "Y c
5710: 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70  ollate NOCASE op
5720: 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20   X" becomes .** 
5730: 22 58 20 6f 70 20 59 22 2e 20 54 68 69 73 20 69  "X op Y". This i
5740: 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f  s because any co
5750: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
5760: 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20   on.** the left 
5770: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63  hand side of a c
5780: 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69  omparison overri
5790: 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  des any collatio
57a0: 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61  n sequence .** a
57b0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72  ttached to the r
57c0: 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61  ight. For the sa
57d0: 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50  me reason the EP
57e0: 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a  _Collate flag.**
57f0: 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64   is not commuted
5800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5810: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72   exprCommute(Par
5820: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5830: 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20   *pExpr){.  u16 
5840: 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70  expRight = (pExp
5850: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
5860: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
5870: 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20    u16 expLeft = 
5880: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66  (pExpr->pLeft->f
5890: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
58a0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c  e);.  assert( al
58b0: 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f  lowedOp(pExpr->o
58c0: 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21  p) && pExpr->op!
58d0: 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28 20  =TK_IN );.  if( 
58e0: 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c 65 66  expRight==expLef
58f0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  t ){.    /* Eith
5900: 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74 68 20  er X and Y both 
5910: 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65  have COLLATE ope
5920: 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68 65 72  rator or neither
5930: 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20 65   do */.    if( e
5940: 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  xpRight ){.     
5950: 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64 20 59   /* Both X and Y
5960: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
5970: 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20 73  erators.  Make s
5980: 75 72 65 20 58 20 69 73 20 61 6c 77 61 79 73 0a  ure X is always.
5990: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79        ** used by
59a0: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 45 50   clearing the EP
59b0: 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66 72  _Collate flag fr
59c0: 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20 70  om Y. */.      p
59d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
59e0: 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61  ags &= ~EP_Colla
59f0: 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  te;.    }else if
5a00: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  ( sqlite3ExprCol
5a10: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
5a20: 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
5a30: 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  .      /* Neithe
5a40: 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65 20 43  r X nor Y have C
5a50: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
5a60: 2c 20 62 75 74 20 58 20 68 61 73 20 61 20 6e 6f  , but X has a no
5a70: 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20 20 20  n-default.      
5a80: 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ** collating seq
5a90: 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64 20 74  uence.  So add t
5aa0: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d 61  he EP_Collate ma
5ab0: 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63 61 75  rker on X to cau
5ac0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 74  se.      ** it t
5ad0: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 66 69  o be searched fi
5ae0: 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45  rst. */.      pE
5af0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
5b00: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b  s |= EP_Collate;
5b10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57 41  .    }.  }.  SWA
5b20: 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70  P(Expr*,pExpr->p
5b30: 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65  Right,pExpr->pLe
5b40: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
5b50: 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op>=TK_GT ){. 
5b60: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
5b70: 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20  ==TK_GT+2 );.   
5b80: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
5b90: 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61  TK_LE+2 );.    a
5ba0: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
5bb0: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
5bc0: 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b  ( TK_GT<TK_LE );
5bd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
5be0: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26  pr->op>=TK_GT &&
5bf0: 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47   pExpr->op<=TK_G
5c00: 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  E );.    pExpr->
5c10: 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
5c20: 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54  -TK_GT)^2)+TK_GT
5c30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
5c40: 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b  ranslate from TK
5c50: 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  _xx operator to 
5c60: 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a  WO_xx bitmask..*
5c70: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70 65  /.static u16 ope
5c80: 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70  ratorMask(int op
5c90: 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73  ){.  u16 c;.  as
5ca0: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
5cb0: 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d  op) );.  if( op=
5cc0: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20  =TK_IN ){.    c 
5cd0: 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65  = WO_IN;.  }else
5ce0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
5cf0: 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  LL ){.    c = WO
5d00: 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  _ISNULL;.  }else
5d10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57  {.    assert( (W
5d20: 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29  O_EQ<<(op-TK_EQ)
5d30: 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20  ) < 0x7fff );.  
5d40: 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45    c = (u16)(WO_E
5d50: 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a  Q<<(op-TK_EQ));.
5d60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70    }.  assert( op
5d70: 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63  !=TK_ISNULL || c
5d80: 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
5d90: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5da0: 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29  IN || c==WO_IN )
5db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
5dc0: 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45  TK_EQ || c==WO_E
5dd0: 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  Q );.  assert( o
5de0: 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57  p!=TK_LT || c==W
5df0: 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_LT );.  assert
5e00: 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63  ( op!=TK_LE || c
5e10: 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73  ==WO_LE );.  ass
5e20: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c  ert( op!=TK_GT |
5e30: 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20  | c==WO_GT );.  
5e40: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47  assert( op!=TK_G
5e50: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b  E || c==WO_GE );
5e60: 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
5e70: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
5e80: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
5e90: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
5ea0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
5eb0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
5ec0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
5ed0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
5ee0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
5ef0: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
5f00: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
5f10: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
5f20: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
5f30: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
5f40: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
5f50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
5f60: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
5f70: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
5f80: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74  .** The term ret
5f90: 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59  urned might by Y
5fa0: 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65  =<expr> if there
5fb0: 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73   is another cons
5fc0: 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  traint in.** the
5fd0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
5fe0: 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61  at specifies tha
5ff0: 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68  t X=Y.  Any such
6000: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c   constraints wil
6010: 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69  l be.** identifi
6020: 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55  ed by the WO_EQU
6030: 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54  IV bit in the pT
6040: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66  erm->eOperator f
6050: 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45  ield.  The.** aE
6060: 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c  quiv[] array hol
6070: 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73  ds X and all its
6080: 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69   equivalents, wi
6090: 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69  th each SQL vari
60a0: 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75  able.** taking u
60b0: 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61  p two slots in a
60c0: 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69  Equiv[].  The fi
60d0: 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20  rst slot is for 
60e0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
60f0: 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63  r.** and the sec
6100: 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63  ond is for the c
6110: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54  olumn number.  T
6120: 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74  here are 22 slot
6130: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a  s in aEquiv[].**
6140: 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77   so that means w
6150: 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58  e can look for X
6160: 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f   plus up to 10 o
6170: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ther equivalent 
6180: 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65  values..** Hence
6190: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20   a search for X 
61a0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70  will return <exp
61b0: 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41  r> if X=A1 and A
61c0: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a  1=A2 and A2=A3.*
61d0: 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39  * and ... and A9
61e0: 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78  =A10 and A10=<ex
61f0: 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pr>..**.** If th
6200: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
6210: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
6220: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
6230: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
6240: 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74  expr>".** then t
6250: 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77  ry for the one w
6260: 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63  ith no dependenc
6270: 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20  ies on <expr> - 
6280: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77  in other words w
6290: 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69  here.** <expr> i
62a0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  s a constant exp
62b0: 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  ression of some 
62c0: 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75  kind.  Only retu
62d0: 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a  rn entries of.**
62e0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
62f0: 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20  > Y" where Y is 
6300: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74  a column in anot
6310: 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20  her table if no 
6320: 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20  terms of.** the 
6330: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f  form "X <op> <co
6340: 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74  nst-expr>" exist
6350: 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20  .   If no terms 
6360: 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
6370: 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72  RHS.** exist, tr
6380: 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65  y to return a te
6390: 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  rm that does not
63a0: 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a   use WO_EQUIV..*
63b0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
63c0: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
63d0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
63e0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
63f0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
6400: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
6410: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
6420: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
6430: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
6440: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
6450: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
6460: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
6470: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
6480: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
6490: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
64a0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
64b0: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
64d0: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
64e0: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
64f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
6500: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
6510: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
6520: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
6530: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
6540: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
6550: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
6560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
6570: 72 6d 20 62 65 69 6e 67 20 65 78 61 6d 69 6e 65  rm being examine
6580: 64 20 61 73 20 70 6f 73 73 69 62 6c 65 20 72 65  d as possible re
6590: 73 75 6c 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  sult */.  WhereT
65a0: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
65b0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  ;      /* The an
65c0: 73 77 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a  swer to return *
65d0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
65e0: 2a 70 57 43 4f 72 69 67 20 3d 20 70 57 43 3b 20  *pWCOrig = pWC; 
65f0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 57 43   /* Original pWC
6600: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
6610: 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
6620: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
6630: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 45   counters */.  E
6640: 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
6650: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
6660: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
6670: 69 6f 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ion */.  Parse *
6680: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
6690: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
66a0: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  text */.  int iO
66b0: 72 69 67 43 6f 6c 20 3d 20 69 43 6f 6c 75 6d 6e  rigCol = iColumn
66c0: 3b 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76  ;  /* Original v
66d0: 61 6c 75 65 20 6f 66 20 69 43 6f 6c 75 6d 6e 20  alue of iColumn 
66e0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 75 69 76 20  */.  int nEquiv 
66f0: 3d 20 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 2;          /*
6700: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 69 72   Number of entir
6710: 65 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a  es in aEquiv[] *
6720: 2f 0a 20 20 69 6e 74 20 69 45 71 75 69 76 20 3d  /.  int iEquiv =
6730: 20 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   2;          /* 
6740: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
6750: 73 20 6f 66 20 61 45 71 75 69 76 5b 5d 20 70 72  s of aEquiv[] pr
6760: 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 20 2a  ocessed so far *
6770: 2f 0a 20 20 69 6e 74 20 61 45 71 75 69 76 5b 32  /.  int aEquiv[2
6780: 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2];          /* 
6790: 69 43 75 72 2c 69 43 6f 6c 75 6d 6e 20 61 6e 64  iCur,iColumn and
67a0: 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20   up to 10 other 
67b0: 65 71 75 69 76 61 6c 65 6e 74 73 20 2a 2f 0a 0a  equivalents */..
67c0: 20 20 61 73 73 65 72 74 28 20 69 43 75 72 3e 3d    assert( iCur>=
67d0: 30 20 29 3b 0a 20 20 61 45 71 75 69 76 5b 30 5d  0 );.  aEquiv[0]
67e0: 20 3d 20 69 43 75 72 3b 0a 20 20 61 45 71 75 69   = iCur;.  aEqui
67f0: 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a  v[1] = iColumn;.
6800: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 66    for(;;){.    f
6810: 6f 72 28 70 57 43 3d 70 57 43 4f 72 69 67 3b 20  or(pWC=pWCOrig; 
6820: 70 57 43 3b 20 70 57 43 3d 70 57 43 2d 3e 70 4f  pWC; pWC=pWC->pO
6830: 75 74 65 72 29 7b 0a 20 20 20 20 20 20 66 6f 72  uter){.      for
6840: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b  (pTerm=pWC->a, k
6850: 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20  =pWC->nTerm; k; 
6860: 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k--, pTerm++){. 
6870: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
6880: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
6890: 75 72 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ur.          && 
68a0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
68b0: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
68c0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
68d0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
68e0: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
68f0: 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20  eady)==0.       
6900: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
6910: 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 20 26 20  Operator & op & 
6920: 57 4f 5f 41 4c 4c 29 21 3d 30 0a 20 20 20 20 20  WO_ALL)!=0.     
6930: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
6940: 20 20 20 20 69 66 28 20 69 4f 72 69 67 43 6f 6c      if( iOrigCol
6950: 3e 3d 30 20 26 26 20 70 49 64 78 20 26 26 20 28  >=0 && pIdx && (
6960: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
6970: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30   & WO_ISNULL)==0
6980: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6990: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
69a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
69b0: 63 68 61 72 20 69 64 78 61 66 66 3b 0a 20 20 20  char idxaff;.   
69c0: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
69d0: 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pX = pTerm->pE
69e0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
69f0: 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 43 2d     pParse = pWC-
6a00: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
6a10: 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20         idxaff = 
6a20: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
6a30: 6f 6c 5b 69 4f 72 69 67 43 6f 6c 5d 2e 61 66 66  ol[iOrigCol].aff
6a40: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20  inity;.         
6a50: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
6a60: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
6a70: 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 7b 0a  (pX, idxaff) ){.
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6aa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
6ac0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
6ad0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
6ae0: 6e 63 65 20 72 65 71 75 69 72 65 64 20 66 72 6f  nce required fro
6af0: 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20  m an index for. 
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
6b10: 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  it to be useful 
6b20: 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20 65  for optimising e
6b30: 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53 74  xpression pX. St
6b40: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20 20  ore this.       
6b50: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
6b60: 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c  in variable pCol
6b70: 6c 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l..             
6b80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6b90: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
6ba0: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ft);.           
6bb0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
6bc0: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
6bd0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 70 58  ollSeq(pParse,pX
6be0: 2d 3e 70 4c 65 66 74 2c 70 58 2d 3e 70 52 69 67  ->pLeft,pX->pRig
6bf0: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
6c00: 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
6c10: 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ) pColl = pParse
6c20: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
6c30: 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20  .      .        
6c40: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70        for(j=0; p
6c50: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
6c60: 21 3d 69 4f 72 69 67 43 6f 6c 3b 20 6a 2b 2b 29  !=iOrigCol; j++)
6c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6c80: 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70    if( NEVER(j>=p
6c90: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
6ca0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6cb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6cc0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6cd0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
6ce0: 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
6cf0: 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20  zColl[j]) ){.   
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
6d10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
6d20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6d30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
6d40: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
6d50: 65 71 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20  eqRight==0 ){.  
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65 73              pRes
6d70: 75 6c 74 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ult = pTerm;.   
6d80: 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
6d90: 66 69 6e 64 54 65 72 6d 5f 73 75 63 63 65 73 73  findTerm_success
6da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
6db0: 6c 73 65 20 69 66 28 20 70 52 65 73 75 6c 74 3d  lse if( pResult=
6dc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6dd0: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 70 54      pResult = pT
6de0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  erm;.           
6df0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
6e00: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
6e10: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
6e20: 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a 20 20   WO_EQUIV)!=0.  
6e30: 20 20 20 20 20 20 20 20 20 26 26 20 6e 45 71 75           && nEqu
6e40: 69 76 3c 41 72 72 61 79 53 69 7a 65 28 61 45 71  iv<ArraySize(aEq
6e50: 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20 29  uiv).          )
6e60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 58  {.            pX
6e70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
6e80: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
6e90: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
6ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
6eb0: 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
6ec0: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
6ed0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
6ee0: 3c 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a  <nEquiv; j+=2){.
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6f00: 28 20 61 45 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d  ( aEquiv[j]==pX-
6f10: 3e 69 54 61 62 6c 65 20 26 26 20 61 45 71 75 69  >iTable && aEqui
6f20: 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c  v[j+1]==pX->iCol
6f30: 75 6d 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  umn ) break;.   
6f40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6f50: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
6f60: 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20  quiv ){.        
6f70: 20 20 20 20 20 20 61 45 71 75 69 76 5b 6a 5d 20        aEquiv[j] 
6f80: 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pX->iTable;.  
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 61 45 71 75              aEqu
6fa0: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
6fb0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
6fc0: 20 20 20 20 20 6e 45 71 75 69 76 20 2b 3d 20 32       nEquiv += 2
6fd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6fe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7000: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 45 71 75    }.    if( iEqu
7010: 69 76 3e 3d 6e 45 71 75 69 76 20 29 20 62 72 65  iv>=nEquiv ) bre
7020: 61 6b 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 61  ak;.    iCur = a
7030: 45 71 75 69 76 5b 69 45 71 75 69 76 2b 2b 5d 3b  Equiv[iEquiv++];
7040: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 61  .    iColumn = a
7050: 45 71 75 69 76 5b 69 45 71 75 69 76 2b 2b 5d 3b  Equiv[iEquiv++];
7060: 0a 20 20 7d 0a 66 69 6e 64 54 65 72 6d 5f 73 75  .  }.findTerm_su
7070: 63 63 65 73 73 3a 0a 20 20 72 65 74 75 72 6e 20  ccess:.  return 
7080: 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46  pResult;.}../* F
7090: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
70a0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
70b0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
70c0: 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73  ist*, WhereClaus
70d0: 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  e*, int);../*.**
70e0: 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a   Call exprAnalyz
70f0: 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69  e on all terms i
7100: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
7110: 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61  .  .**.**.*/.sta
7120: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
7130: 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69  lyzeAll(.  SrcLi
7140: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
7150: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
7160: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
7170: 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20  eClause *pWC    
7180: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
7190: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61  E clause to be a
71a0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
71b0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
71c0: 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  WC->nTerm-1; i>=
71d0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70  0; i--){.    exp
71e0: 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
71f0: 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a  t, pWC, i);.  }.
7200: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7210: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
7220: 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43  MIZATION./*.** C
7230: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
7240: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
7250: 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72  ion is a LIKE or
7260: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74   GLOB operator t
7270: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70  hat.** can be op
7280: 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e  timized using in
7290: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
72a0: 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52  ints.  Return TR
72b0: 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73  UE if it is.** s
72c0: 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  o and false if n
72d0: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  ot..**.** In ord
72e0: 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  er for the opera
72f0: 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69  tor to be optimi
7300: 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d  zible, the RHS m
7310: 75 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a  ust be a string.
7320: 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ** literal that 
7330: 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77  does not begin w
7340: 69 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20  ith a wildcard. 
7350: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
7360: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20  isLikeOrGlob(.  
7370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7380: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
7390: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
73a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
73b0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
73c0: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
73d0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  ression */.  Exp
73e0: 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f  r **ppPrefix,  /
73f0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f  * Pointer to TK_
7400: 53 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f  STRING expressio
7410: 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70  n with pattern p
7420: 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a  refix */.  int *
7430: 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20  pisComplete, /* 
7440: 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79  True if the only
7450: 20 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69   wildcard is % i
7460: 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  n the last chara
7470: 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cter */.  int *p
7480: 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54  noCase      /* T
7490: 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65  rue if uppercase
74a0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
74b0: 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29  o lowercase */.)
74c0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
74d0: 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  z = 0;         /
74e0: 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20  * String on RHS 
74f0: 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  of LIKE operator
7500: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
7510: 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  ht, *pLeft;     
7520: 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65   /* Right and le
7530: 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20  ft size of LIKE 
7540: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78  operator */.  Ex
7550: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
7560: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
7570: 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20   of operands to 
7580: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
7590: 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20  r */.  int c;   
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74    /* One charact
75c0: 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69  er in z[] */.  i
75d0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
75e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
75f0: 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63  ber of non-wildc
7600: 61 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61  ard prefix chara
7610: 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20  cters */.  char 
7620: 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  wc[3];          
7630: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
7640: 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  d characters */.
7650: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7660: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
7670: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
7680: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
7690: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30  _value *pVal = 0
76a0: 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  ;.  int op;     
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
76c0: 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67  * Opcode of pRig
76d0: 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71  ht */..  if( !sq
76e0: 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74  lite3IsLikeFunct
76f0: 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70  ion(db, pExpr, p
7700: 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20  noCase, wc) ){. 
7710: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7730: 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f  BCDIC.  if( *pno
7740: 43 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b  Case ) return 0;
7750: 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20  .#endif.  pList 
7760: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
7770: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73  ;.  pLeft = pLis
7780: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
7790: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d   if( pLeft->op!=
77a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c  TK_COLUMN .   ||
77b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
77c0: 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c  nity(pLeft)!=SQL
77d0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20  ITE_AFF_TEXT .  
77e0: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c   || IsVirtual(pL
77f0: 65 66 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a  eft->pTab).  ){.
7800: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32      /* IMP: R-02
7810: 30 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65  065-49465 The le
7820: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
7830: 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  the LIKE or GLOB
7840: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20   operator must. 
7850: 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d     ** be the nam
7860: 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  e of an indexed 
7870: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54  column with TEXT
7880: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
7890: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
78a0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d    assert( pLeft-
78b0: 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29  >iColumn!=(-1) )
78c0: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b  ; /* Because IPK
78d0: 20 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f 54   never has AFF_T
78e0: 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74  EXT */..  pRight
78f0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70   = pList->a[0].p
7900: 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69  Expr;.  op = pRi
7910: 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  ght->op;.  if( o
7920: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
7930: 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68  {.    op = pRigh
7940: 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66  t->op2;.  }.  if
7950: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
7960: 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70  E ){.    Vdbe *p
7970: 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72  Reprepare = pPar
7980: 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a  se->pReprepare;.
7990: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
79a0: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  Right->iColumn;.
79b0: 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
79c0: 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 70  e3VdbeGetValue(p
79d0: 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c  Reprepare, iCol,
79e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
79f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20  );.    if( pVal 
7a00: 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
7a10: 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c  _type(pVal)==SQL
7a20: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
7a30: 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71    z = (char *)sq
7a40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7a50: 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pVal);.    }.  
7a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7a70: 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
7a80: 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20  pVdbe, iCol);.  
7a90: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
7aa0: 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
7ab0: 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d  E || pRight->op=
7ac0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
7ad0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
7ae0: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
7af0: 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a   z = pRight->u.z
7b00: 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  Token;.  }.  if(
7b10: 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20   z ){.    cnt = 
7b20: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
7b30: 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63  =z[cnt])!=0 && c
7b40: 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63  !=wc[0] && c!=wc
7b50: 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20  [1] && c!=wc[2] 
7b60: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
7b70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e      }.    if( cn
7b80: 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38  t!=0 && 255!=(u8
7b90: 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20  )z[cnt-1] ){.   
7ba0: 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69 78     Expr *pPrefix
7bb0: 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70  ;.      *pisComp
7bc0: 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20  lete = c==wc[0] 
7bd0: 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a  && z[cnt+1]==0;.
7be0: 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d 20        pPrefix = 
7bf0: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
7c00: 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20  TK_STRING, z);. 
7c10: 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69 78       if( pPrefix
7c20: 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54   ) pPrefix->u.zT
7c30: 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20  oken[cnt] = 0;. 
7c40: 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d       *ppPrefix =
7c50: 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20   pPrefix;.      
7c60: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
7c70: 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56  BLE ){.        V
7c80: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
7c90: 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20  >pVdbe;.        
7ca0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
7cb0: 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d  rmask(v, pRight-
7cc0: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
7cd0: 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c     if( *pisCompl
7ce0: 65 74 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75  ete && pRight->u
7cf0: 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20  .zToken[1] ){.  
7d00: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
7d10: 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b  e rhs of the LIK
7d20: 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  E expression is 
7d30: 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20  a variable, and 
7d40: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
7d50: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
7d60: 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d  f the variable m
7d70: 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f  eans there is no
7d80: 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20   need to invoke 
7d90: 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20  the LIKE.       
7da0: 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20     ** function, 
7db0: 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61  then no OP_Varia
7dc0: 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65  ble will be adde
7dd0: 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  d to the program
7de0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54  ..          ** T
7df0: 68 69 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c  his causes probl
7e00: 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ems for the sqli
7e10: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
7e20: 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20  er_name().      
7e30: 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77      ** API. To w
7e40: 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20  orkaround them, 
7e50: 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56  add a dummy OP_V
7e60: 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20  ariable here..  
7e70: 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
7e80: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
7e90: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7ea0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7eb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7ec0: 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
7ed0: 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20  , pRight, r1);. 
7ee0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7ef0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7f00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
7f10: 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b  ntAddr(v)-1, 0);
7f20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7f30: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7f40: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
7f50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7f60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7f70: 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   z = 0;.    }.  
7f80: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  }..  sqlite3Valu
7f90: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72  eFree(pVal);.  r
7fa0: 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a  eturn (z!=0);.}.
7fb0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7fc0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
7fd0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66  IZATION */...#if
7fe0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7ff0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
8000: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
8010: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
8020: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
8030: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
8040: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54        column MAT
8050: 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66  CH expr.**.** If
8060: 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74 75   it is then retu
8070: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74  rn TRUE.  If not
8080: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
8090: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
80a0: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20  MatchOfColumn(. 
80b0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
80c0: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
80d0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
80e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
80f0: 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t;..  if( pExpr-
8100: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
8110: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8120: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
8130: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
8140: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63  ->u.zToken,"matc
8150: 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  h")!=0 ){.    re
8160: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
8170: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
8180: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73  List;.  if( pLis
8190: 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20  t->nExpr!=2 ){. 
81a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
81b0: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b  .  if( pList->a[
81c0: 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20  1].pExpr->op != 
81d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
81e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
81f0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
8200: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
8210: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
8220: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  */../*.** If the
8230: 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69 6f   pBase expressio
8240: 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  n originated in 
8250: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
8260: 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a  clause of.** a j
8270: 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  oin, then transf
8280: 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  er the appropria
8290: 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72  te markings over
82a0: 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a   to derived..*/.
82b0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e  static void tran
82c0: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
82d0: 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c  (Expr *pDerived,
82e0: 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20   Expr *pBase){. 
82f0: 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73   pDerived->flags
8300: 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73   |= pBase->flags
8310: 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a   & EP_FromJoin;.
8320: 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67    pDerived->iRig
8330: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42  htJoinTable = pB
8340: 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ase->iRightJoinT
8350: 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  able;.}..#if !de
8360: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8370: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
8380: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
8390: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
83a0: 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ERY)./*.** Analy
83b0: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 63  ze a term that c
83c0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f  onsists of two o
83d0: 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63  r more OR-connec
83e0: 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e  ted.** subterms.
83f0: 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20    So in:.**.**  
8400: 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61     ... WHERE  (a
8410: 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20  =5) AND (b=7 OR 
8420: 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44  c=9 OR d=13) AND
8430: 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20   (d=13).**      
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e      ^^^^^^^^^^^^
8460: 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54  ^^^^^^^^.**.** T
8470: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
8480: 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68 20  yzes terms such 
8490: 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65  as the middle te
84a0: 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  rm in the above 
84b0: 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68  example..** A Wh
84c0: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
84d0: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
84e0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
84f0: 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61   term under.** a
8500: 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c  nalysis, regardl
8510: 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f  ess of the outco
8520: 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73  me of the analys
8530: 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a  is.  Hence:.**.*
8540: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
8550: 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45  wtFlags   |=  TE
8560: 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20  RM_ORINFO.**    
8570: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
8580: 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d  Info  =  a dynam
8590: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
85a0: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
85b0: 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ect.**.** The te
85c0: 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
85d0: 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20  d must have two 
85e0: 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f  or more of OR-co
85f0: 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d 73  nnected subterms
8600: 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75  ..** A single su
8610: 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61  bterm might be a
8620: 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e   set of AND-conn
8630: 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65 72  ected sub-subter
8640: 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20  ms..** Examples 
8650: 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61  of terms under a
8660: 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  nalysis:.**.**  
8670: 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d     (A)     t1.x=
8680: 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e  t2.y OR t1.x=t2.
8690: 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20  z OR t1.y=15 OR 
86a0: 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20  t1.z=t3.a+5.**  
86b0: 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78 70     (B)     x=exp
86c0: 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52  r1 OR expr2=x OR
86d0: 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20   x=expr3.**     
86e0: 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (C)     t1.x=t2.
86f0: 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20  y OR (t1.x=t2.z 
8700: 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20  AND t1.y=15).** 
8710: 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65 78      (D)     x=ex
8720: 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44  pr1 OR (y>11 AND
8730: 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45   y<22 AND z LIKE
8740: 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20   '*hello*').**  
8750: 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d     (E)     (p.a=
8760: 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20  1 AND q.b=2 AND 
8770: 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34  r.c=3) OR (p.x=4
8780: 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72   AND q.y=5 AND r
8790: 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  .z=6).**.** CASE
87a0: 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   1:.**.** If all
87b0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66   subterms are of
87c0: 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78   the form T.C=ex
87d0: 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  pr for some sing
87e0: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61  le column of C a
87f0: 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74  nd.** a single t
8800: 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e  able T (as shown
8810: 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62   in example B ab
8820: 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65  ove) then create
8830: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
8840: 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61  * term that is a
8850: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20  n equivalent IN 
8860: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20  expression.  In 
8870: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
8880: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e  the term.** bein
8890: 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a  g analyzed is:.*
88a0: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78  *.**      x = ex
88b0: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
88c0: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
88d0: 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65  3.**.** then cre
88e0: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
88f0: 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73  l term like this
8900: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  :.**.**      x I
8910: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
8920: 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  xpr3).**.** CASE
8930: 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   2:.**.** If all
8940: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
8950: 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e  dexable by a sin
8960: 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65  gle table T, the
8970: 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n set.**.**     
8980: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
8990: 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  tor             
89a0: 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20   =  WO_OR.**    
89b0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
89c0: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
89d0: 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20   |=  the cursor 
89e0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
89f0: 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65   T.**.** A subte
8a00: 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65  rm is "indexable
8a10: 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68  " if it is of th
8a20: 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c  e form.** "T.C <
8a30: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
8a40: 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d  e C is any colum
8a50: 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64  n of table T and
8a60: 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   .** <op> is one
8a70: 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c   of "=", "<", "<
8a80: 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22  =", ">", ">=", "
8a90: 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e  IS NULL", or "IN
8aa0: 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  "..** A subterm 
8ab0: 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c  is also indexabl
8ac0: 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e  e if it is an AN
8ad0: 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  D of two or more
8ae0: 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20  .** subsubterms 
8af0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
8b00: 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62  which is indexab
8b10: 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41  le.  Indexable A
8b20: 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20  ND .** subterms 
8b30: 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72  have their eOper
8b40: 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41  ator set to WO_A
8b50: 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65  ND and they have
8b60: 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73  .** u.pAndInfo s
8b70: 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  et to a dynamica
8b80: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
8b90: 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63  ereAndTerm objec
8ba0: 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e  t..**.** From an
8bb0: 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76  other point of v
8bc0: 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22  iew, "indexable"
8bd0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
8be0: 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a  subterm could.**
8bf0: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
8c00: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
8c10: 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  ex if an appropr
8c20: 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74  iate index exist
8c30: 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79  s..** This analy
8c40: 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  sis does not con
8c50: 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72  sider whether or
8c60: 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65   not the index e
8c70: 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69  xists; that.** i
8c80: 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20  s something the 
8c90: 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74  bestIndex() rout
8ca0: 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69  ine will determi
8cb0: 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73  ne.  This analys
8cc0: 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73  is.** only looks
8cd0: 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74   at whether subt
8ce0: 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65  erms appropriate
8cf0: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78   for indexing ex
8d00: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65  ist..**.** All e
8d10: 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67  xamples A throug
8d20: 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61  h E above all sa
8d30: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42  tisfy case 2.  B
8d40: 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20  ut if a term.** 
8d50: 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20  also statisfies 
8d60: 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20  case 1 (such as 
8d70: 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  B) we know that 
8d80: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69  the optimizer wi
8d90: 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65  ll.** always pre
8da0: 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69  fer case 1, so i
8db0: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70  n that case we p
8dc0: 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65  retend that case
8dd0: 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74   2 is not.** sat
8de0: 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74  isfied..**.** It
8df0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
8e00: 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  se that multiple
8e10: 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65   tables are inde
8e20: 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d  xable.  For exam
8e30: 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76  ple,.** (E) abov
8e40: 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f  e is indexable o
8e50: 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61  n tables P, Q, a
8e60: 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  nd R..**.** Term
8e70: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
8e80: 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64  ase 2 are candid
8e90: 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20  ates for lookup 
8ea0: 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61  by using.** sepa
8eb0: 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20  rate indices to 
8ec0: 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20  find rowids for 
8ed0: 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64  each subterm and
8ee0: 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68   composing.** th
8ef0: 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72  e union of all r
8f00: 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f  owids using a Ro
8f10: 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  wSet object.  Th
8f20: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  is is similar.**
8f30: 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69   to "bitmap indi
8f40: 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61  ces" in other da
8f50: 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a  tabase engines..
8f60: 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a  **.** OTHERWISE:
8f70: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
8f80: 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73  r case 1 nor cas
8f90: 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20  e 2 apply, then 
8fa0: 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61  leave the eOpera
8fb0: 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65  tor set to.** ze
8fc0: 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69  ro.  This term i
8fd0: 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72  s not useful for
8fe0: 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74   search..*/.stat
8ff0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
9000: 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63  yzeOrTerm(.  Src
9010: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
9020: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
9030: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
9040: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
9050: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
9060: 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63  complete WHERE c
9070: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
9080: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
9090: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
90a0: 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20   the OR-term to 
90b0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
90c0: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
90d0: 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b  e = pWC->pParse;
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
90f0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
9100: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9110: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
9120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
9130: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9140: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
9150: 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e   *pTerm = &pWC->
9160: 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f  a[idxTerm];    /
9170: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
9180: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45   analyzed */.  E
9190: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
91a0: 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20  rm->pExpr;      
91b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
91c0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
91d0: 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d  term */.  WhereM
91e0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
91f0: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
9200: 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65 20 6d  ; /* Table use m
9210: 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  asks */.  int i;
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9250: 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  rs */.  WhereCla
9260: 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20  use *pOrWc;     
9270: 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20    /* Breakup of 
9280: 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65  pTerm into subte
9290: 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  rms */.  WhereTe
92a0: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20  rm *pOrTerm;    
92b0: 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d     /* A Sub-term
92c0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57   within the pOrW
92d0: 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e  c */.  WhereOrIn
92e0: 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20  fo *pOrInfo;    
92f0: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69   /* Additional i
9300: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63  nformation assoc
9310: 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d  iated with pTerm
9320: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68   */.  Bitmask ch
9330: 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20  ngToIN;         
9340: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
9350: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
9360: 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  e 1 */.  Bitmask
9370: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
9380: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
9390: 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c  t are indexable,
93a0: 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65   satisfying case
93b0: 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   2 */..  /*.  **
93c0: 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c   Break the OR cl
93d0: 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65  ause into its se
93e0: 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e  parate subterms.
93f0: 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61    The subterms a
9400: 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  re.  ** stored i
9410: 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  n a WhereClause 
9420: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
9430: 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20  ning within the 
9440: 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a  WhereOrInfo.  **
9450: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
9460: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
9470: 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75  original OR clau
9480: 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20  se term..  */.  
9490: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
94a0: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
94b0: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49  DYNAMIC|TERM_ORI
94c0: 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  NFO|TERM_ANDINFO
94d0: 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
94e0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
94f0: 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  _OR );.  pTerm->
9500: 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49  u.pOrInfo = pOrI
9510: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
9520: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
9530: 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b  zeof(*pOrInfo));
9540: 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d  .  if( pOrInfo==
9550: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  0 ) return;.  pT
9560: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
9570: 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70  TERM_ORINFO;.  p
9580: 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d  OrWc = &pOrInfo-
9590: 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  >wc;.  whereClau
95a0: 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57  seInit(pOrWc, pW
95b0: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C->pParse, pMask
95c0: 53 65 74 2c 20 70 57 43 2d 3e 77 63 74 72 6c 46  Set, pWC->wctrlF
95d0: 6c 61 67 73 29 3b 0a 20 20 77 68 65 72 65 53 70  lags);.  whereSp
95e0: 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72  lit(pOrWc, pExpr
95f0: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72  , TK_OR);.  expr
9600: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
9610: 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64   pOrWc);.  if( d
9620: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9630: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
9640: 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  rt( pOrWc->nTerm
9650: 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  >=2 );..  /*.  *
9660: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65  * Compute the se
9670: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
9680: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
9690: 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a  ases 1 or 2..  *
96a0: 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20  /.  indexable = 
96b0: 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63  ~(Bitmask)0;.  c
96c0: 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d  hngToIN = ~(Bitm
96d0: 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70  ask)0;.  for(i=p
96e0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
96f0: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
9700: 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62   i>=0 && indexab
9710: 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  le; i--, pOrTerm
9720: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f  ++){.    if( (pO
9730: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
9740: 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30   & WO_SINGLE)==0
9750: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41   ){.      WhereA
9760: 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f  ndInfo *pAndInfo
9770: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9780: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
9790: 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46  s & (TERM_ANDINF
97a0: 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d  O|TERM_ORINFO))=
97b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67  =0 );.      chng
97c0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
97d0: 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pAndInfo = sqlit
97e0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
97f0: 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e  , sizeof(*pAndIn
9800: 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fo));.      if( 
9810: 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pAndInfo ){.    
9820: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
9830: 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20  *pAndWC;.       
9840: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64   WhereTerm *pAnd
9850: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Term;.        in
9860: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74  t j;.        Bit
9870: 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20  mask b = 0;.    
9880: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70      pOrTerm->u.p
9890: 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e  AndInfo = pAndIn
98a0: 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54  fo;.        pOrT
98b0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
98c0: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20  TERM_ANDINFO;.  
98d0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65        pOrTerm->e
98e0: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e  Operator = WO_AN
98f0: 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  D;.        pAndW
9900: 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77  C = &pAndInfo->w
9910: 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  c;.        where
9920: 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57  ClauseInit(pAndW
9930: 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  C, pWC->pParse, 
9940: 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77  pMaskSet, pWC->w
9950: 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
9960: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
9970: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
9980: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
9990: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
99a0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
99b0: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
99c0: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
99d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
99e0: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
99f0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
9a00: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
9a10: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
9a20: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
9a30: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
9a40: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
9a50: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
9a60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
9a70: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
9a80: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
9a90: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
9aa0: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
9ab0: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
9ad0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
9ae0: 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66  t, pAndTerm->lef
9af0: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
9b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9b10: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9b20: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
9b30: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
9b40: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
9b50: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
9b60: 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20  ERM_COPIED ){.  
9b70: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73      /* Skip this
9b80: 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20   term for now.  
9b90: 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68  We revisit it wh
9ba0: 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68  en we process th
9bb0: 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65  e.      ** corre
9bc0: 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49  sponding TERM_VI
9bd0: 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20  RTUAL term */.  
9be0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
9bf0: 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20  itmask b;.      
9c00: 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  b = getMask(pMas
9c10: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
9c20: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
9c30: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77    if( pOrTerm->w
9c40: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
9c50: 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  RTUAL ){.       
9c60: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
9c70: 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70  er = &pOrWc->a[p
9c80: 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  OrTerm->iParent]
9c90: 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67  ;.        b |= g
9ca0: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
9cb0: 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72   pOther->leftCur
9cc0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
9cd0: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
9ce0: 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   b;.      if( (p
9cf0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9d00: 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b  r & WO_EQ)==0 ){
9d10: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
9d20: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  N = 0;.      }el
9d30: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67  se{.        chng
9d40: 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20  ToIN &= b;.     
9d50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
9d60: 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74  /*.  ** Record t
9d70: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
9d80: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
9d90: 73 65 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d  se 2.  The set m
9da0: 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70  ight be.  ** emp
9db0: 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e  ty..  */.  pOrIn
9dc0: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20  fo->indexable = 
9dd0: 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65  indexable;.  pTe
9de0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
9df0: 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30  indexable==0 ? 0
9e00: 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a   : WO_OR;..  /*.
9e10: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f    ** chngToIN ho
9e20: 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62  lds a set of tab
9e30: 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a  les that *might*
9e40: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e   satisfy case 1.
9e50: 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61    But.  ** we ha
9e60: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64  ve to do some ad
9e70: 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e  ditional checkin
9e80: 67 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65  g to see if case
9e90: 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69   1 really.  ** i
9ea0: 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a  s satisfied..  *
9eb0: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
9ec0: 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72  will hold either
9ed0: 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73   0, 1, or 2 bits
9ee0: 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73  .  The 0-bit cas
9ef0: 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  e means.  ** tha
9f00: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  t there is no po
9f10: 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61  ssibility of tra
9f20: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52  nsforming the OR
9f30: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a   clause into an.
9f40: 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72    ** IN operator
9f50: 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20   because one or 
9f60: 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68  more terms in th
9f70: 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74  e OR clause cont
9f80: 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69  ain.  ** somethi
9f90: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d  ng other than ==
9fa0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   on a column in 
9fb0: 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  the single table
9fc0: 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a  .  The 1-bit.  *
9fd0: 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61  * case means tha
9fe0: 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  t every term of 
9ff0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73  the OR clause is
a000: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a   of the form.  *
a010: 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d  * "table.column=
a020: 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73  expr" for some s
a030: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
a040: 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69  e one bit that i
a050: 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20  s set.  ** will 
a060: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
a070: 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20  e common table. 
a080: 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   We still need t
a090: 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a  o check to make.
a0a0: 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61    ** sure the sa
a0b0: 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  me column is use
a0c0: 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20  d on all terms. 
a0d0: 20 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   The 2-bit case 
a0e0: 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65  is when.  ** the
a0f0: 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f   all terms are o
a100: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
a110: 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32  e1.column=table2
a120: 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20  .column".  It.  
a130: 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73  ** might be poss
a140: 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20  ible to form an 
a150: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
a160: 20 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63   either table1.c
a170: 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61  olumn.  ** or ta
a180: 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74  ble2.column as t
a190: 68 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72  he LHS if either
a1a0: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76   is common to ev
a1b0: 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a  ery term of.  **
a1c0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a   the OR clause..
a1d0: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
a1e0: 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  hat terms of the
a1f0: 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c   form "table.col
a200: 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d  umn1=table.colum
a210: 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61  n2" (the.  ** sa
a220: 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68  me table on both
a230: 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d   sizes of the ==
a240: 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  ) cannot be opti
a250: 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  mized..  */.  if
a260: 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ( chngToIN ){.  
a270: 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    int okToChngTo
a280: 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  IN = 0;     /* T
a290: 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65  rue if the conve
a2a0: 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76  rsion to IN is v
a2b0: 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alid */.    int 
a2c0: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  iColumn = -1;   
a2d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
a2e0: 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20  index on lhs of 
a2f0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
a300: 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d     int iCursor =
a310: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
a320: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d  Table cursor com
a330: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73  mon to all terms
a340: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20   */.    int j = 
a350: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
a360: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a370: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  r */..    /* Sea
a380: 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20  rch for a table 
a390: 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  and column that 
a3a0: 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73  appears on one s
a3b0: 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ide or the.    *
a3c0: 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d  * other of the =
a3d0: 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76  = operator in ev
a3e0: 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68  ery subterm.  Th
a3f0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  at table and col
a400: 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  umn.    ** will 
a410: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69  be recorded in i
a420: 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75  Cursor and iColu
a430: 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74  mn.  There might
a440: 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20   not be any.    
a450: 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e  ** such table an
a460: 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f  d column.  Set o
a470: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61  kToChngToIN if a
a480: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61  n appropriate ta
a490: 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63  ble.    ** and c
a4a0: 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62  olumn is found b
a4b0: 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e  ut leave okToChn
a4c0: 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e  gToIN false if n
a4d0: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f  ot found..    */
a4e0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
a4f0: 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f  2 && !okToChngTo
a500: 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  IN; j++){.      
a510: 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d  pOrTerm = pOrWc-
a520: 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  >a;.      for(i=
a530: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20  pOrWc->nTerm-1; 
a540: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
a550: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
a560: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
a570: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
a580: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  Q );.        pOr
a590: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
a5a0: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
a5b0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
a5c0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
a5d0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
a5e0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
a5f0: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e  he 2-bit case an
a600: 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20  d we are on the 
a610: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
a620: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
a630: 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  * current term i
a640: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  s from the first
a650: 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20   iteration.  So 
a660: 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20  skip this term. 
a670: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
a680: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
a690: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
a6a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a6b0: 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e     if( (chngToIN
a6c0: 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
a6d0: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
a6e0: 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b  ftCursor))==0 ){
a6f0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
a700: 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  is term must be 
a710: 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61  of the form t1.a
a720: 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20  ==t2.b where t2 
a730: 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  is in the.      
a740: 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20      ** chngToIN 
a750: 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f  set but t1 is no
a760: 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69  t.  This term wi
a770: 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65  ll be either pre
a780: 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20 20  ceeded.         
a790: 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62   ** or follwed b
a7a0: 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f  y an inverted co
a7b0: 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e  py (t2.b==t1.a).
a7c0: 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d    Skip this term
a7d0: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
a7e0: 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65 72  nd use its inver
a7f0: 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  sion. */.       
a800: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72     testcase( pOr
a810: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
a820: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20  TERM_COPIED );. 
a830: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
a840: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
a850: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
a860: 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  AL );.          
a870: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
a880: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
a890: 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52  _COPIED|TERM_VIR
a8a0: 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20  TUAL) );.       
a8b0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
a8c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a8d0: 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d  Column = pOrTerm
a8e0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
a8f0: 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 20          iCursor 
a900: 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  = pOrTerm->leftC
a910: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62  ursor;.        b
a920: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a930: 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
a940: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e         /* No can
a950: 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c  didate table+col
a960: 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  umn was found.  
a970: 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
a980: 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  cur.        ** o
a990: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65  n the second ite
a9a0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
a9b0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
a9c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a9d0: 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63  ( IsPowerOfTwo(c
a9e0: 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20  hngToIN) );.    
a9f0: 20 20 20 20 61 73 73 65 72 74 28 20 63 68 6e 67      assert( chng
aa00: 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d  ToIN==getMask(pM
aa10: 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29  askSet, iCursor)
aa20: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
aa30: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
aa40: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20   testcase( j==1 
aa50: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  );..      /* We 
aa60: 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e  have found a can
aa70: 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64  didate table and
aa80: 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20   column.  Check 
aa90: 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20  to see if that. 
aaa0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e       ** table an
aab0: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d  d column is comm
aac0: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
aad0: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
aae0: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43  e */.      okToC
aaf0: 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  hngToIN = 1;.   
ab00: 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26     for(; i>=0 &&
ab10: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69   okToChngToIN; i
ab20: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
ab30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ab40: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
ab50: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
ab60: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
ab70: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
ab80: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
ab90: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
aba0: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
abb0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
abc0: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
abd0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
abe0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
abf0: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
ac00: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
ac10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
ac20: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
ac30: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
ac40: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
ac50: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
ac60: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
ac70: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
ac80: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
ac90: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
aca0: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
acb0: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
acc0: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
acd0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
ace0: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
acf0: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
ad00: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
ad10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
ad20: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
ad30: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
ad40: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
ad50: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
ad60: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
ad70: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
ad80: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
ad90: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
ada0: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
adb0: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
adc0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
add0: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
ade0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
adf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ae00: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
ae10: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
ae20: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
ae30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ae40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
ae50: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
ae60: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
ae70: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
ae80: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
ae90: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
aea0: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
aeb0: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
aec0: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
aed0: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
aee0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
aef0: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
af00: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a     **.    ** EV:
af10: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20   R-00211-15100. 
af20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
af30: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
af40: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
af50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
af60: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
af70: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
af80: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
af90: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
afa0: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
afb0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
afc0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
afd0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
afe0: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
aff0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
b000: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
b010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b020: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
b030: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
b040: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
b050: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
b060: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
b070: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
b080: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
b090: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
b0a0: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
b0b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b0c0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
b0d0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
b0e0: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
b0f0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
b100: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
b110: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
b120: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
b130: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
b140: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
b150: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
b160: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
b170: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
b180: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
b190: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
b1a0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
b1b0: 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  WC->pParse, pLis
b1c0: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
b1d0: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
b1e0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
b1f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
b200: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
b210: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
b220: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b230: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
b240: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
b250: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
b260: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
b270: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
b280: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
b290: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
b2a0: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
b2b0: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
b2c0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
b2d0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
b2e0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
b2f0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
b300: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
b310: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
b320: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
b330: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
b340: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
b350: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
b360: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
b370: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
b380: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
b390: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
b3a0: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
b3b0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
b3c0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
b3d0: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
b3e0: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
b3f0: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
b400: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
b410: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
b420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b430: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
b440: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
b450: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
b460: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
b470: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
b480: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
b490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
b4a0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
b4b0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
b4c0: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
b4d0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
b4e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
b4f0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
b500: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
b510: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
b520: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
b530: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
b540: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
b550: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
b560: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
b570: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
b580: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
b590: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
b5a0: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
b5b0: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
b5c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
b5d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
b5e0: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
b5f0: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
b600: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
b610: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
b620: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
b630: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
b640: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b650: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
b660: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
b670: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
b680: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
b690: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
b6a0: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
b6b0: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
b6c0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
b6d0: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
b6e0: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
b6f0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
b700: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
b710: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
b720: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
b730: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
b740: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
b750: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
b760: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
b770: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
b780: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
b790: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
b7a0: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
b7b0: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
b7c0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
b7d0: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
b7e0: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
b7f0: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
b800: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
b810: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
b820: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
b830: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
b840: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
b850: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
b860: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
b870: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
b880: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
b890: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
b8a0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
b8b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
b8c0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
b8d0: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
b8e0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
b8f0: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
b900: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
b910: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
b920: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
b930: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  /* The term to b
b960: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
b970: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
b980: 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20  askSet;         
b990: 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65   /* Set of table
b9a0: 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a   index masks */.
b9b0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
b9e0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
b9f0: 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  zed */.  Bitmask
ba00: 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20   prereqLeft;    
ba10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
ba20: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74 68  requesites of th
ba30: 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a  e pExpr->pLeft *
ba40: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
ba50: 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  eqAll;          
ba60: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
ba70: 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a  sites of pExpr *
ba80: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
ba90: 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20  aRight = 0;     
baa0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65       /* Extra de
bab0: 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45  pendencies on LE
bac0: 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70  FT JOIN */.  Exp
bad0: 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20  r *pStr1 = 0;   
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
baf0: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
bb00: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
bb10: 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d  int isComplete =
bb20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bb30: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
bb40: 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77  GLOB ends with w
bb50: 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74  ildcard */.  int
bb60: 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20   noCase = 0;    
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb80: 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69   LIKE/GLOB disti
bb90: 6e 67 75 69 73 68 65 73 20 63 61 73 65 20 2a 2f  nguishes case */
bba0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c      /* Top-level
bbd0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70   operator.  pExp
bbe0: 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65  r->op */.  Parse
bbf0: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
bc00: 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50  pParse;     /* P
bc10: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
bc20: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
bc30: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
bc40: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
bc50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
bc60: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
bc70: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
bc80: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72  turn;.  }.  pTer
bc90: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
bca0: 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74  erm];.  pMaskSet
bcb0: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
bcc0: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
bcd0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
bce0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
bcf0: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
bd00: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
bd10: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
bd20: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
bd30: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
bd40: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
bd50: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
bd60: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
bd70: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
bd80: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
bd90: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
bda0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
bdb0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
bdc0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
bdd0: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
bde0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
bdf0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
be00: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
be10: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
be20: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
be30: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
be40: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
be50: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
be60: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
be70: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
be80: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
be90: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
bea0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
beb0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
bec0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
bed0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
bee0: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
bef0: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
bf00: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
bf10: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
bf20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
bf30: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
bf40: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
bf50: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
bf60: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
bf70: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
bf80: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
bf90: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
bfa0: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
bfb0: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
bfc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
bfd0: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
c000: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
c010: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
c020: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
c030: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
c040: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
c050: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
c060: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
c070: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
c080: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c090: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
c0a0: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
c0b0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
c0c0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
c0d0: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
c0e0: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
c0f0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
c100: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
c110: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
c120: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
c130: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
c140: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
c150: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
c160: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
c170: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
c180: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
c190: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
c1a0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
c1b0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
c1c0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
c1d0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
c1e0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
c1f0: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
c200: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
c210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c220: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
c230: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
c240: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
c250: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
c260: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
c270: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
c280: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
c290: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
c2a0: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
c2b0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
c2c0: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
c2d0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
c2e0: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
c2f0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
c300: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
c310: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
c320: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c330: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
c340: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
c350: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
c360: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c370: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
c380: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
c390: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
c3a0: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
c3b0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
c3c0: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
c3d0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
c3e0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
c3f0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
c400: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
c410: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
c420: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
c430: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
c440: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
c450: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
c460: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
c470: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
c480: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
c490: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
c4a0: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
c4b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
c4c0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
c4d0: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
c4e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
c4f0: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
c500: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
c510: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
c520: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c530: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
c540: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
c550: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
c560: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
c570: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
c580: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
c590: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
c5a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
c5b0: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
c5c0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
c5d0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
c5e0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
c5f0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
c600: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
c610: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
c620: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
c630: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
c640: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
c650: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
c660: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
c670: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
c680: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
c690: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
c6a0: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
c6b0: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
c6c0: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
c6d0: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
c6e0: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
c6f0: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
c700: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
c710: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
c720: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
c730: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c740: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
c750: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
c760: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
c770: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
c780: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
c790: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
c7a0: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
c7b0: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
c7c0: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
c7d0: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
c7e0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
c7f0: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
c800: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
c810: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
c820: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
c830: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
c840: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
c850: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
c860: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
c870: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
c880: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
c890: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
c8a0: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
c8b0: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
c8c0: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
c8d0: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
c8e0: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
c8f0: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
c900: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
c910: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
c920: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
c930: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
c940: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
c950: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
c960: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
c970: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
c980: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
c990: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
c9a0: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
c9b0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
c9c0: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
c9d0: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
c9e0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
c9f0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
ca00: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
ca10: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
ca20: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
ca30: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
ca40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
ca50: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
ca60: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
ca70: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
ca80: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
ca90: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
caa0: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
cab0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
cac0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
cad0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
cae0: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
cb10: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
cb20: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cb50: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
cb60: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
cb70: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
cb80: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
cb90: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
cba0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
cbb0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
cbc0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
cbd0: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
cbe0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
cbf0: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
cc00: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
cc10: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
cc20: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
cc30: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
cc40: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
cc50: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
cc60: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
cc70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
cc80: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
cc90: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64  ATION */..#if !d
cca0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ccb0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
ccc0: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
ccd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
cce0: 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79  UERY).  /* Analy
ccf0: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69  ze a term that i
cd00: 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77  s composed of tw
cd10: 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72  o or more subter
cd20: 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  ms connected by.
cd30: 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61    ** an OR opera
cd40: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  tor..  */.  else
cd50: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
cd60: 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73  TK_OR ){.    ass
cd70: 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  ert( pWC->op==TK
cd80: 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72  _AND );.    expr
cd90: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53  AnalyzeOrTerm(pS
cda0: 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d  rc, pWC, idxTerm
cdb0: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
cdc0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
cdd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
cde0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
cdf0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
ce00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ce10: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
ce20: 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f  TION.  /* Add co
ce30: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64  nstraints to red
ce40: 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
ce50: 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f  pace on a LIKE o
ce60: 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72  r GLOB.  ** oper
ce70: 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
ce80: 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f  A like pattern o
ce90: 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49  f the form "x LI
cea0: 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68  KE 'abc%'" is ch
ceb0: 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74  anged into const
cec0: 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a  raints.  **.  **
ced0: 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62            x>='ab
cee0: 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41  c' AND x<'abd' A
cef0: 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  ND x LIKE 'abc%'
cf00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
cf10: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ast character of
cf20: 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63   the prefix "abc
cf30: 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  " is incremented
cf40: 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a   to form the.  *
cf50: 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  * termination co
cf60: 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20  ndition "abd".. 
cf70: 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f   */.  if( pWC->o
cf80: 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26  p==TK_AND .   &&
cf90: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50   isLikeOrGlob(pP
cfa0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53  arse, pExpr, &pS
cfb0: 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65  tr1, &isComplete
cfc0: 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a  , &noCase).  ){.
cfd0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
cfe0: 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66         /* LHS of
cff0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
d000: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
d010: 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a  *pStr2;       /*
d020: 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d   Copy of pStr1 -
d030: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
d040: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
d050: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
d060: 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  1;.    Expr *pNe
d070: 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20  wExpr2;.    int 
d080: 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74  idxNew1;.    int
d090: 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f   idxNew2;.    To
d0a0: 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  ken sCollSeqName
d0b0: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ;  /* Name of co
d0c0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d0d0: 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d   */..    pLeft =
d0e0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
d0f0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
d100: 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33   pStr2 = sqlite3
d110: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72  ExprDup(db, pStr
d120: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 0);.    if( !
d130: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d140: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20   ){.      u8 c, 
d150: 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61  *pC;       /* La
d160: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
d170: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69  ore the first wi
d180: 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20  ldcard */.      
d190: 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32  pC = (u8*)&pStr2
d1a0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74  ->u.zToken[sqlit
d1b0: 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32  e3Strlen30(pStr2
d1c0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a  ->u.zToken)-1];.
d1d0: 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20        c = *pC;. 
d1e0: 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20       if( noCase 
d1f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
d200: 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e  e point is to in
d210: 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74  crement the last
d220: 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72   character befor
d230: 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  e the first.    
d240: 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e      ** wildcard.
d250: 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72    But if we incr
d260: 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20  ement '@', that 
d270: 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74  will push it int
d280: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
d290: 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67   alphabetic rang
d2a0: 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e  e where case con
d2b0: 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65  versions will me
d2c0: 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20  ss up the .     
d2d0: 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79     ** inequality
d2e0: 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73  .  To avoid this
d2f0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61  , make sure to a
d300: 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c  lso run the full
d310: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45  .        ** LIKE
d320: 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74   on all candidat
d330: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  e expressions by
d340: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73   clearing the is
d350: 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20  Complete flag.  
d360: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d370: 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20   if( c=='A'-1 ) 
d380: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
d390: 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33 39    /* EV: R-64339
d3a0: 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20 20  -08207 */...    
d3b0: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
d3c0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
d3d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
d3e0: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
d3f0: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
d400: 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
d410: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
d420: 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
d430: 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
d440: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
d450: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
d460: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
d470: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
d480: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
d490: 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
d4a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
d4b0: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
d4c0: 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
d4d0: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
d4e0: 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
d4f0: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20  0);.    idxNew1 
d500: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
d510: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
d520: 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r1, TERM_VIRTUAL
d530: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
d540: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
d550: 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20  xNew1==0 );.    
d560: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
d570: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b  , pWC, idxNew1);
d580: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
d590: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
d5a0: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
d5b0: 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
d5c0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
d5d0: 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20  se, TK_LT,.     
d5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d5f0: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
d600: 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72  (pParse,pNewExpr
d610: 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29  2,&sCollSeqName)
d620: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74  ,.           pSt
d630: 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e  r2, 0);.    idxN
d640: 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
d650: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
d660: 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
d670: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
d680: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
d690: 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a  ( idxNew2==0 );.
d6a0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
d6b0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
d6c0: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
d6d0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
d6e0: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
d6f0: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
d700: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
d710: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
d720: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
d730: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
d740: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
d750: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
d760: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
d770: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d780: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
d790: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
d7a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
d7b0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
d7c0: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
d7d0: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
d7e0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
d7f0: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
d800: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
d810: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
d820: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
d830: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
d840: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
d850: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
d860: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
d870: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
d880: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
d890: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
d8a0: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
d8b0: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
d8c0: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
d8d0: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
d8e0: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
d8f0: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
d900: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
d910: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
d920: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
d930: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
d940: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
d950: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
d960: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
d970: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
d980: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
d990: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
d9a0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
d9b0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
d9c0: 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
d9d0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
d9e0: 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
d9f0: 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
da00: 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
da10: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
da20: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
da30: 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
da40: 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
da50: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
da60: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
da70: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
da80: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
da90: 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
dac0: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
dad0: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
dae0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
daf0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
db00: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
db10: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
db20: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
db30: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
db40: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
db50: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
db60: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
db70: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
db80: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
db90: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
dba0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
dbb0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
dbc0: 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
dbd0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
dbe0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
dbf0: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
dc00: 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
dc10: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
dc20: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
dc30: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
dc40: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
dc50: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
dc60: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
dc70: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
dc80: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
dc90: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
dca0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
dcb0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
dcc0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
dcd0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
dce0: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
dcf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
dd00: 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20  ABLE_STAT3.  /* 
dd10: 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74  When sqlite_stat
dd20: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
dd30: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e   is available an
dd40: 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65   operator of the
dd50: 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53  .  ** form "x IS
dd60: 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73   NOT NULL" can s
dd70: 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c  ometimes be eval
dd80: 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63  uated more effic
dd90: 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22  iently.  ** as "
dda0: 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20  x>NULL" if x is 
ddb0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
ddc0: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20  RIMARY KEY.  So 
ddd0: 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a  construct a.  **
dde0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66   virtual term of
ddf0: 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a   that form..  **
de00: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
de10: 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  the virtual term
de20: 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20   must be tagged 
de30: 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e  with TERM_VNULL.
de40: 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d    This.  ** TERM
de50: 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20  _VNULL tag will 
de60: 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74  suppress the not
de70: 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74  -null check at t
de80: 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
de90: 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  * of the loop.  
dea0: 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d  Without the TERM
deb0: 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65  _VNULL flag, the
dec0: 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
ded0: 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72  at.  ** the star
dee0: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69  t of the loop wi
def0: 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72  ll prevent any r
df00: 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e  esults from bein
df10: 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  g returned..  */
df20: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
df30: 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
df40: 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
df50: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
df60: 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
df70: 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  t->iColumn>=0.  
df80: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
df90: 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
dfa0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
dfb0: 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
dfc0: 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
dfd0: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
dfe0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
dff0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
e000: 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e030: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
e040: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
e070: 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
e080: 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
e090: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
e0a0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
e0b0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
e0e0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
e0f0: 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
e100: 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
e110: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
e120: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
e130: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
e140: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
e150: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
e160: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
e170: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
e180: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
e190: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
e1a0: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
e1b0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
e1c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
e1d0: 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  _GT;.      pNewT
e1e0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
e1f0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
e200: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
e210: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
e220: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
e230: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
e240: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
e250: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
e260: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
e270: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
e280: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
e290: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
e2a0: 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20  NABLE_STAT */.. 
e2b0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63   /* Prevent ON c
e2c0: 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61  lause terms of a
e2d0: 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20   LEFT JOIN from 
e2e0: 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72  being used to dr
e2f0: 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ive.  ** an inde
e300: 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  x for tables to 
e310: 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
e320: 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  join..  */.  pTe
e330: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
e340: 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d  |= extraRight;.}
e350: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
e360: 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74  ction searches t
e370: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
e380: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
e390: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
e3a0: 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78 70 72 65  .** for an expre
e3b0: 73 73 69 6f 6e 20 6f 66 20 74 79 70 65 20 54 4b  ssion of type TK
e3c0: 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65 66  _COLUMN that ref
e3d0: 65 72 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ers to the same 
e3e0: 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a 20 75 73  column and.** us
e3f0: 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
e400: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
e410: 73 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f  s the iCol'th co
e420: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
e430: 64 78 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  dx..** Argument 
e440: 69 42 61 73 65 20 69 73 20 74 68 65 20 63 75 72  iBase is the cur
e450: 73 6f 72 20 6e 75 6d 62 65 72 20 75 73 65 64 20  sor number used 
e460: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 68  for the table th
e470: 61 74 20 70 49 64 78 20 72 65 66 65 72 73 0a 2a  at pIdx refers.*
e480: 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  * to..**.** If s
e490: 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f  uch an expressio
e4a0: 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20  n is found, its 
e4b0: 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e  index in pList->
e4c0: 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  a[] is returned.
e4d0: 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73   If.** no expres
e4e0: 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d  sion is found, -
e4f0: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
e500: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
e510: 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72  dIndexCol(.  Par
e520: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e540: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
e550: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
e560: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
e570: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
e580: 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20   list to search 
e590: 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20  */.  int iBase, 
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66       /* Cursor f
e5c0: 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  or table associa
e5d0: 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f  ted with pIdx */
e5e0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d     /* Index to m
e610: 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a  atch column of *
e620: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66      /* Column of
e650: 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20   index to match 
e660: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
e670: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
e680: 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
e690: 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28  l[iCol];..  for(
e6a0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
e6b0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
e6c0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
e6d0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
e6e0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
e6f0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  r);.    if( p->o
e700: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
e710: 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d    && p->iColumn=
e720: 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
e730: 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d  iCol].     && p-
e740: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20  >iTable==iBase. 
e750: 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c     ){.      Coll
e760: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
e770: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
e780: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
e790: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
e7a0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f    if( ALWAYS(pCo
e7b0: 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  ll) && 0==sqlite
e7c0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
e7d0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  zName, zColl) ){
e7e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e7f0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
e800: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d  .  }..  return -
e810: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  1;.}../*.** This
e820: 20 72 6f 75 74 69 6e 65 20 64 65 74 65 72 6d 69   routine determi
e830: 6e 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20  nes if pIdx can 
e840: 62 65 20 75 73 65 64 20 74 6f 20 61 73 73 69 73  be used to assis
e850: 74 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  t in processing 
e860: 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 71 75  a.** DISTINCT qu
e870: 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f 74 68 65  alifier. In othe
e880: 72 20 77 6f 72 64 73 2c 20 69 74 20 74 65 73 74  r words, it test
e890: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
e8a0: 20 75 73 69 6e 67 20 74 68 69 73 0a 2a 2a 20 69   using this.** i
e8b0: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6f 75 74  ndex for the out
e8c0: 65 72 20 6c 6f 6f 70 20 67 75 61 72 61 6e 74 65  er loop guarante
e8d0: 65 73 20 74 68 61 74 20 72 6f 77 73 20 77 69 74  es that rows wit
e8e0: 68 20 65 71 75 61 6c 20 76 61 6c 75 65 73 20 66  h equal values f
e8f0: 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70 72 65 73  or.** all expres
e900: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 70 44 69  sions in the pDi
e910: 73 74 69 6e 63 74 20 6c 69 73 74 20 61 72 65 20  stinct list are 
e920: 64 65 6c 69 76 65 72 65 64 20 67 72 6f 75 70 65  delivered groupe
e930: 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a  d together..**.*
e940: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  * For example, t
e950: 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a 2a 2a 20  he query .**.** 
e960: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
e970: 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  T a, b, c FROM t
e980: 62 6c 20 57 48 45 52 45 20 61 20 3d 20 3f 0a 2a  bl WHERE a = ?.*
e990: 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65 66 69 74  *.** can benefit
e9a0: 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64 65 78 20   from any index 
e9b0: 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62 22 20 61  on columns "b" a
e9c0: 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74 61 74 69  nd "c"..*/.stati
e9d0: 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74  c int isDistinct
e9e0: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
e9f0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
ea00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
ea10: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ea20: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
ea30: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
ea40: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
ea50: 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ause */.  Index 
ea60: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
ea70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ea80: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e   index being con
ea90: 73 69 64 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  sidered */.  int
eaa0: 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20   base,          
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eac0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
ead0: 72 20 74 68 65 20 74 61 62 6c 65 20 70 49 64 78  r the table pIdx
eae0: 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45 78 70 72   is on */.  Expr
eaf0: 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c  List *pDistinct,
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
eb10: 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72  he DISTINCT expr
eb20: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  essions */.  int
eb30: 20 6e 45 71 43 6f 6c 20 20 20 20 20 20 20 20 20   nEqCol         
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb50: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
eb60: 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20  columns with == 
eb70: 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  */.){.  Bitmask 
eb80: 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  mask = 0;       
eb90: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
eba0: 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65 64 20 66  of unaccounted f
ebb0: 6f 72 20 70 44 69 73 74 69 6e 63 74 20 65 78 70  or pDistinct exp
ebc0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rs */.  int i;  
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
ebf0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
ec00: 0a 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74  .  assert( pDist
ec10: 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  inct!=0 );.  if(
ec20: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 3d 3d 30 20   pIdx->zName==0 
ec30: 7c 7c 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45  || pDistinct->nE
ec40: 78 70 72 3e 3d 42 4d 53 20 29 20 72 65 74 75 72  xpr>=BMS ) retur
ec50: 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28  n 0;.  testcase(
ec60: 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70   pDistinct->nExp
ec70: 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 0a 20 20 2f  r==BMS-1 );..  /
ec80: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
ec90: 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
eca0: 6e 73 20 69 6e 20 74 68 65 20 64 69 73 74 69 6e  ns in the distin
ecb0: 63 74 20 6c 69 73 74 2e 20 49 66 20 61 6e 79 20  ct list. If any 
ecc0: 6f 66 20 74 68 65 6d 0a 20 20 2a 2a 20 61 72 65  of them.  ** are
ecd0: 20 6e 6f 74 20 73 69 6d 70 6c 65 20 63 6f 6c 75   not simple colu
ece0: 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 2c 20 72  mn references, r
ecf0: 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 4f 74 68  eturn early. Oth
ed00: 65 72 77 69 73 65 2c 20 74 65 73 74 20 69 66 20  erwise, test if 
ed10: 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 20 63  the.  ** WHERE c
ed20: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
ed30: 20 22 63 6f 6c 3d 58 22 20 63 6c 61 75 73 65 2e   "col=X" clause.
ed40: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65   If it does, the
ed50: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
ed60: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
ed70: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
ed80: 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20   and the column 
ed90: 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20  does not belong 
eda0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  to the.  ** same
edb0: 20 74 61 62 6c 65 20 61 73 20 69 6e 64 65 78 20   table as index 
edc0: 70 49 64 78 2c 20 72 65 74 75 72 6e 20 65 61 72  pIdx, return ear
edd0: 6c 79 2e 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  ly. Finally, if 
ede0: 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 2a 2a  there is no.  **
edf0: 20 6d 61 74 63 68 69 6e 67 20 22 63 6f 6c 3d 58   matching "col=X
ee00: 22 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  " expression and
ee10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6f   the column is o
ee20: 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
ee30: 20 61 73 20 70 49 64 78 2c 0a 20 20 2a 2a 20 73   as pIdx,.  ** s
ee40: 65 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  et the correspon
ee50: 64 69 6e 67 20 62 69 74 20 69 6e 20 76 61 72 69  ding bit in vari
ee60: 61 62 6c 65 20 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  able mask..  */.
ee70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
ee80: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
ee90: 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  ++){.    WhereTe
eea0: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 45  rm *pTerm;.    E
eeb0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
eec0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
eed0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
eee0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
eef0: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
ef00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
ef10: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
ef20: 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61 62 6c 65  m(pWC, p->iTable
ef30: 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7e 28  , p->iColumn, ~(
ef40: 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
ef50: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
ef60: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  erm ){.      Exp
ef70: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
ef80: 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
ef90: 53 65 71 20 2a 70 31 20 3d 20 73 71 6c 69 74 65  Seq *p1 = sqlite
efa0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
efb0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
efc0: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
efd0: 67 68 74 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  ght);.      Coll
efe0: 53 65 71 20 2a 70 32 20 3d 20 73 71 6c 69 74 65  Seq *p2 = sqlite
eff0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
f000: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  rse, p);.      i
f010: 66 28 20 70 31 3d 3d 70 32 20 29 20 63 6f 6e 74  f( p1==p2 ) cont
f020: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
f030: 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 62  if( p->iTable!=b
f040: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
f050: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28 28 28 42      mask |= (((B
f060: 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 29 3b  itmask)1) << i);
f070: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 45  .  }..  for(i=nE
f080: 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26 20 69 3c  qCol; mask && i<
f090: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
f0a0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 78  ++){.    int iEx
f0b0: 70 72 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f  pr = findIndexCo
f0c0: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
f0d0: 6e 63 74 2c 20 62 61 73 65 2c 20 70 49 64 78 2c  nct, base, pIdx,
f0e0: 20 69 29 3b 0a 20 20 20 20 69 66 28 20 69 45 78   i);.    if( iEx
f0f0: 70 72 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  pr<0 ) break;.  
f100: 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28 28 42 69    mask &= ~(((Bi
f110: 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 45 78 70  tmask)1) << iExp
f120: 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
f130: 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d 0a 0a  n (mask==0);.}..
f140: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
f150: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
f160: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
f170: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
f180: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
f190: 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
f1a0: 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74   A DISTINCT list
f1b0: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66   is redundant if
f1c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
f1d0: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e 49 51  ntains a.** UNIQ
f1e0: 55 45 20 69 6e 64 65 78 20 74 68 61 74 20 67 75  UE index that gu
f1f0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
f200: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
f210: 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 64 69  query will be di
f220: 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77 61 79  stinct.** anyway
f230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f240: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
f250: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
f260: 61 72 73 65 2c 0a 20 20 53 72 63 4c 69 73 74 20  arse,.  SrcList 
f270: 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20 57 68 65  *pTabList,.  Whe
f280: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
f290: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
f2a0: 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c 65 20  inct.){.  Table 
f2b0: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
f2c0: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2e0: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
f2f0: 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
f300: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
f310: 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
f320: 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
f330: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
f340: 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
f350: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
f360: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
f370: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
f380: 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
f390: 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
f3a0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
f3b0: 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
f3c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
f3d0: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
f3e0: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
f3f0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
f400: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
f410: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
f420: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
f430: 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
f440: 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
f450: 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
f460: 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
f470: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
f480: 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
f490: 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
f4a0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
f4b0: 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
f4c0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
f4d0: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
f4e0: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
f4f0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f500: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
f510: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
f520: 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61  ate(pDistinct->a
f530: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
f540: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
f550: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
f560: 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69  e==iBase && p->i
f570: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
f580: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  n 1;.  }..  /* L
f590: 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
f5a0: 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
f5b0: 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65  able, checking e
f5c0: 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74  ach to see if it
f5d0: 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20   makes.  ** the 
f5e0: 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
f5f0: 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74  er redundant. It
f600: 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a   does so if:.  *
f610: 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20  *.  **   1. The 
f620: 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20  index is itself 
f630: 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a  UNIQUE, and.  **
f640: 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f  .  **   2. All o
f650: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
f660: 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65   the index are e
f670: 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68  ither part of th
f680: 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a  e pDistinct.  **
f690: 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65        list, or e
f6a0: 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  lse the WHERE cl
f6b0: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ause contains a 
f6c0: 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
f6d0: 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20   "col=X",.  **  
f6e0: 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61      where X is a
f6f0: 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e   constant value.
f700: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
f710: 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  equences of the.
f720: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72    **      compar
f730: 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d  ison and select-
f740: 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  list expressions
f750: 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73   must match thos
f760: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  e of the index..
f770: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41    **.  **   3. A
f780: 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65  ll of those inde
f790: 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  x columns for wh
f7a0: 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  ich the WHERE cl
f7b0: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ause does not.  
f7c0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
f7d0: 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61  a "col=X" term a
f7e0: 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  re subject to a 
f7f0: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
f800: 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
f810: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f820: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f830: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f840: 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
f850: 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e  r==OE_None ) con
f860: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
f870: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
f880: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
f890: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78   int iCol = pIdx
f8a0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
f8b0: 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64       if( 0==find
f8c0: 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c  Term(pWC, iBase,
f8d0: 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b   iCol, ~(Bitmask
f8e0: 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
f8f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
f900: 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e  iIdxCol = findIn
f910: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
f920: 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c  Distinct, iBase,
f930: 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20   pIdx, i);.     
f940: 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30     if( iIdxCol<0
f950: 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   || pTab->aCol[p
f960: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
f970: 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  ].notNull==0 ){.
f980: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f990: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f9a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
f9b0: 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
f9c0: 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  n ){.      /* Th
f9d0: 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73  is index implies
f9e0: 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
f9f0: 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  CT qualifier is 
fa00: 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20  redundant. */.  
fa10: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
fa20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
fa30: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
fa40: 65 70 61 72 65 20 61 20 63 72 75 64 65 20 65 73  epare a crude es
fa50: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f  timate of the lo
fa60: 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69  garithm of the i
fa70: 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  nput value..** T
fa80: 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20  he results need 
fa90: 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20 54  not be exact.  T
faa0: 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  his is only used
fab0: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
fac0: 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73  ** the total cos
fad0: 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20  t of performing 
fae0: 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20  operations with 
faf0: 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f  O(logN) or O(Nlo
fb00: 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74  gN).** complexit
fb10: 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69 73  y.  Because N is
fb20: 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20 69   just a guess, i
fb30: 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72  t is no great tr
fb40: 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e  agedy if.** logN
fb50: 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66   is a little off
fb60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  ..*/.static doub
fb70: 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65  le estLog(double
fb80: 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f   N){.  double lo
fb90: 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65  gN = 1;.  double
fba0: 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65   x = 10;.  while
fbb0: 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67  ( N>x ){.    log
fbc0: 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d  N += 1;.    x *=
fbd0: 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   10;.  }.  retur
fbe0: 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n logN;.}../*.**
fbf0: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
fc00: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
fc10: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
fc20: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
fc30: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
fc40: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
fc50: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
fc60: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
fc70: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
fc80: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
fc90: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
fca0: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
fcb0: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
fcc0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
fcd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
fce0: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
fcf0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
fd00: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  ).static void TR
fd10: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73  ACE_IDX_INPUTS(s
fd20: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
fd30: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
fd40: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
fd50: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
fd60: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
fd70: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
fd80: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
fd90: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
fda0: 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20  constraint[%d]: 
fdb0: 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64  col=%d termid=%d
fdc0: 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25   op=%d usabled=%
fdd0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
fde0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
fdf0: 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  raint[i].iColumn
fe00: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
fe10: 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d  straint[i].iTerm
fe20: 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70  Offset,.       p
fe30: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
fe40: 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  .op,.       p->a
fe50: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
fe60: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  able);.  }.  for
fe70: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65  (i=0; i<p->nOrde
fe80: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  rBy; i++){.    s
fe90: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
fea0: 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d  f("  orderby[%d]
feb0: 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64  : col=%d desc=%d
fec0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
fed0: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
fee0: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  y[i].iColumn,.  
fef0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
ff00: 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d  [i].desc);.  }.}
ff10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
ff20: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73  CE_IDX_OUTPUTS(s
ff30: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
ff40: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
ff50: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
ff60: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
ff70: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
ff80: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
ff90: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
ffa0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
ffb0: 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49  usage[%d]: argvI
ffc0: 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22  dx=%d omit=%d\n"
ffd0: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
ffe0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
fff0: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
10000 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  dex,.       p->a
10010 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10020 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  i].omit);.  }.  
10030 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
10040 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c  tf("  idxNum=%d\
10050 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a  n", p->idxNum);.
10060 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
10070 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25  intf("  idxStr=%
10080 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29  s\n", p->idxStr)
10090 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
100a0 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42  Printf("  orderB
100b0 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c  yConsumed=%d\n",
100c0 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75   p->orderByConsu
100d0 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  med);.  sqlite3D
100e0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
100f0 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e  timatedCost=%g\n
10100 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43  ", p->estimatedC
10110 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ost);.}.#else.#d
10120 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
10130 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
10140 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
10150 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 2f  UTS(A).#endif../
10160 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65 64 20 62  * .** Required b
10170 65 63 61 75 73 65 20 62 65 73 74 49 6e 64 65 78  ecause bestIndex
10180 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  () is called by 
10190 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
101a0 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  x() .*/.static v
101b0 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 57 68  oid bestIndex(Wh
101c0 65 72 65 42 65 73 74 49 64 78 2a 29 3b 0a 0a 2f  ereBestIdx*);../
101d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
101e0 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  e attempts to fi
101f0 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20 73  nd an scanning s
10200 74 72 61 74 65 67 79 20 74 68 61 74 20 63 61 6e  trategy that can
10210 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   be used .** to 
10220 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52 27  optimize an 'OR'
10230 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
10240 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 57 48   is part of a WH
10250 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a  ERE clause. .**.
10260 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 73 73  ** The table ass
10270 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 52 4f  ociated with FRO
10280 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 53  M clause term pS
10290 72 63 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  rc may be either
102a0 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42 2d   a.** regular B-
102b0 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20 61 20  Tree table or a 
102c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
102d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
102e0 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
102f0 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29  WhereBestIdx *p)
10300 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
10310 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
10320 41 54 49 4f 4e 0a 20 20 57 68 65 72 65 43 6c 61  ATION.  WhereCla
10330 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57  use *pWC = p->pW
10340 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
10350 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
10360 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
10370 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20  List_item *pSrc 
10380 3d 20 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68  = p->pSrc; /* Th
10390 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
103a0 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
103b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 75 72    const int iCur
103c0 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
103d0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ;      /* The cu
103e0 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
103f0 65 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69  e  */.  const Bi
10400 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20  tmask maskSrc = 
10410 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
10420 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20 2f  skSet, iCur);  /
10430 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 70 53  * Bitmask for pS
10440 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  rc */.  WhereTer
10450 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e 64  m * const pWCEnd
10460 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
10470 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f  nTerm];        /
10480 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
10490 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
104a0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
104b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
104c0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
104d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
104e0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 52   */..  /* The OR
104f0 2d 63 6c 61 75 73 65 20 6f 70 74 69 6d 69 7a 61  -clause optimiza
10500 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
10510 65 64 20 69 66 20 74 68 65 20 49 4e 44 45 58 45  ed if the INDEXE
10520 44 20 42 59 20 6f 72 0a 20 20 2a 2a 20 4e 4f 54  D BY or.  ** NOT
10530 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 73   INDEXED clauses
10540 20 61 72 65 20 75 73 65 64 20 6f 72 20 69 66 20   are used or if 
10550 74 68 65 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  the WHERE_AND_ON
10560 4c 59 20 62 69 74 20 69 73 20 73 65 74 2e 20 2a  LY bit is set. *
10570 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f  /.  if( pSrc->no
10580 74 49 6e 64 65 78 65 64 20 7c 7c 20 70 53 72 63  tIndexed || pSrc
10590 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  ->pIndex!=0 ){. 
105a0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
105b0 20 69 66 28 20 70 57 43 2d 3e 77 63 74 72 6c 46   if( pWC->wctrlF
105c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44  lags & WHERE_AND
105d0 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 72 65 74  _ONLY ){.    ret
105e0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  urn;.  }..  /* S
105f0 65 61 72 63 68 20 74 68 65 20 57 48 45 52 45 20  earch the WHERE 
10600 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72  clause terms for
10610 20 61 20 75 73 61 62 6c 65 20 57 4f 5f 4f 52 20   a usable WO_OR 
10620 74 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  term. */.  for(p
10630 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
10640 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
10650 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
10660 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
10670 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
10680 26 26 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72  && ((pTerm->prer
10690 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63  eqAll & ~maskSrc
106a0 29 20 26 20 70 2d 3e 6e 6f 74 52 65 61 64 79 29  ) & p->notReady)
106b0 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  ==0.     && (pTe
106c0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
106d0 6e 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53  ndexable & maskS
106e0 72 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  rc)!=0 .    ){. 
106f0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
10700 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
10710 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
10720 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
10730 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
10740 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
10750 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
10760 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
10770 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
10780 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
10790 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
107a0 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f        double rTo
107b0 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  tal = 0;.      d
107c0 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a  ouble nRow = 0;.
107d0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73        Bitmask us
107e0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 57 68  ed = 0;.      Wh
107f0 65 72 65 42 65 73 74 49 64 78 20 73 42 4f 49 3b  ereBestIdx sBOI;
10800 0a 0a 20 20 20 20 20 20 73 42 4f 49 20 3d 20 2a  ..      sBOI = *
10810 70 3b 0a 20 20 20 20 20 20 73 42 4f 49 2e 70 4f  p;.      sBOI.pO
10820 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
10830 20 20 73 42 4f 49 2e 70 44 69 73 74 69 6e 63 74    sBOI.pDistinct
10840 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 42 4f 49   = 0;.      sBOI
10850 2e 70 70 49 64 78 49 6e 66 6f 20 3d 20 30 3b 0a  .ppIdxInfo = 0;.
10860 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72        for(pOrTer
10870 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54  m=pOrWC->a; pOrT
10880 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
10890 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
108a0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
108b0 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f  .. Multi-index O
108c0 52 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 65  R testing for te
108d0 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c  rm %d of %d....\
108e0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  n", .          (
108f0 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72 57 43 2d  pOrTerm - pOrWC-
10900 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d 20 70 57  >a), (pTerm - pW
10910 43 2d 3e 61 29 0a 20 20 20 20 20 20 20 20 29 29  C->a).        ))
10920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
10930 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
10940 72 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b  r& WO_AND)!=0 ){
10950 0a 20 20 20 20 20 20 20 20 20 20 73 42 4f 49 2e  .          sBOI.
10960 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
10970 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
10980 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49 6e            bestIn
10990 64 65 78 28 26 73 42 4f 49 29 3b 0a 20 20 20 20  dex(&sBOI);.    
109a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
109b0 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
109c0 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
109d0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
109e0 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20   tempWC;.       
109f0 20 20 20 74 65 6d 70 57 43 2e 70 50 61 72 73 65     tempWC.pParse
10a00 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a   = pWC->pParse;.
10a10 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
10a20 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d  .pMaskSet = pWC-
10a30 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20 20  >pMaskSet;.     
10a40 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74       tempWC.pOut
10a50 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20  er = pWC;.      
10a60 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20      tempWC.op = 
10a70 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  TK_AND;.        
10a80 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
10a90 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
10aa0 74 65 6d 70 57 43 2e 77 63 74 72 6c 46 6c 61 67  tempWC.wctrlFlag
10ab0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
10ac0 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20   tempWC.nTerm = 
10ad0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 42 4f  1;.          sBO
10ae0 49 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b  I.pWC = &tempWC;
10af0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49  .          bestI
10b00 6e 64 65 78 28 26 73 42 4f 49 29 3b 0a 20 20 20  ndex(&sBOI);.   
10b10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10b20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
10b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10b40 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 42 4f 49    rTotal += sBOI
10b50 2e 63 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20 20  .cost.rCost;.   
10b60 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73 42 4f       nRow += sBO
10b70 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77  I.cost.plan.nRow
10b80 3b 0a 20 20 20 20 20 20 20 20 75 73 65 64 20 7c  ;.        used |
10b90 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 75 73 65 64  = sBOI.cost.used
10ba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 54  ;.        if( rT
10bb0 6f 74 61 6c 3e 3d 70 2d 3e 63 6f 73 74 2e 72 43  otal>=p->cost.rC
10bc0 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ost ) break;.   
10bd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
10be0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
10bf0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
10c00 6e 63 72 65 61 73 65 20 74 68 65 20 73 63 61 6e  ncrease the scan
10c10 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75 6e 74   cost to account
10c20 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74   .      ** for t
10c30 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73  he cost of the s
10c40 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ort. */.      if
10c50 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ( p->pOrderBy!=0
10c60 20 29 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52   ){.        WHER
10c70 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72  ETRACE(("... sor
10c80 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 4f  ting increases O
10c90 52 20 63 6f 73 74 20 25 2e 39 67 20 74 6f 20 25  R cost %.9g to %
10ca0 2e 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  .9g\n",.        
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 72 54 6f 74              rTot
10cc0 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f 77 2a  al, rTotal+nRow*
10cd0 65 73 74 4c 6f 67 28 6e 52 6f 77 29 29 29 3b 0a  estLog(nRow)));.
10ce0 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b          rTotal +
10cf0 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52  = nRow*estLog(nR
10d00 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ow);.      }..  
10d10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
10d20 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75  st of scanning u
10d30 73 69 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72  sing this OR ter
10d40 6d 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69  m for optimizati
10d50 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  on is.      ** l
10d60 65 73 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ess than the cur
10d70 72 65 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64  rent cost stored
10d80 20 69 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61   in pCost, repla
10d90 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ce the contents.
10da0 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73        ** of pCos
10db0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52  t. */.      WHER
10dc0 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c  ETRACE(("... mul
10dd0 74 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74  ti-index OR cost
10de0 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c  =%.9g nrow=%.9g\
10df0 6e 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77  n", rTotal, nRow
10e00 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54  ));.      if( rT
10e10 6f 74 61 6c 3c 70 2d 3e 63 6f 73 74 2e 72 43 6f  otal<p->cost.rCo
10e20 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  st ){.        p-
10e30 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 72 54  >cost.rCost = rT
10e40 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  otal;.        p-
10e50 3e 63 6f 73 74 2e 75 73 65 64 20 3d 20 75 73 65  >cost.used = use
10e60 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  d;.        p->co
10e70 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e  st.plan.nRow = n
10e80 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Row;.        p->
10e90 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  cost.plan.nOBSat
10ea0 20 3d 20 70 2d 3e 69 20 3f 20 70 2d 3e 61 4c 65   = p->i ? p->aLe
10eb0 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e  vel[p->i-1].plan
10ec0 2e 6e 4f 42 53 61 74 20 3a 20 30 3b 0a 20 20 20  .nOBSat : 0;.   
10ed0 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61       p->cost.pla
10ee0 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c 61 67  n.wsFlags = flag
10ef0 73 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  s;.        p->co
10f00 73 74 2e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 20  st.plan.u.pTerm 
10f10 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
10f20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
10f30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
10f40 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
10f50 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   */.}..#ifndef S
10f60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
10f70 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
10f80 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10f90 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10fa0 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
10fb0 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
10fc0 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
10fd0 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
10fe0 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
10ff0 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
11000 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
11010 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
11020 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
11030 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
11040 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11060 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11070 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
11080 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
11090 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
110a0 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
110b0 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
110c0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
110d0 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
110e0 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
110f0 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
11100 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
11110 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
11120 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
11130 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
11140 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
11150 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
11160 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d  rator & WO_EQ)==
11170 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11180 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
11190 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
111a0 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  dy)!=0 ) return 
111b0 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
111c0 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
111d0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
111e0 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
111f0 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
11200 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
11210 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
11220 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
11230 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   1;.}.#endif..#i
11240 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11250 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
11260 58 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71  X./*.** If the q
11270 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 70 53  uery plan for pS
11280 72 63 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  rc specified in 
11290 70 43 6f 73 74 20 69 73 20 61 20 66 75 6c 6c 20  pCost is a full 
112a0 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 61 6e  table scan.** an
112b0 64 20 69 6e 64 65 78 69 6e 67 20 69 73 20 61 6c  d indexing is al
112c0 6c 6f 77 73 20 28 69 66 20 74 68 65 72 65 20 69  lows (if there i
112d0 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44  s no NOT INDEXED
112e0 20 63 6c 61 75 73 65 29 20 61 6e 64 20 69 74 0a   clause) and it.
112f0 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ** possible to c
11300 6f 6e 73 74 72 75 63 74 20 61 20 74 72 61 6e 73  onstruct a trans
11310 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61 74 20  ient index that 
11320 77 6f 75 6c 64 20 70 65 72 66 6f 72 6d 20 62 65  would perform be
11330 74 74 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20 66  tter.** than a f
11340 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 65  ull table scan e
11350 76 65 6e 20 77 68 65 6e 20 74 68 65 20 63 6f 73  ven when the cos
11360 74 20 6f 66 20 63 6f 6e 73 74 72 75 63 74 69 6e  t of constructin
11370 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69  g the index.** i
11380 73 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63  s taken into acc
11390 6f 75 6e 74 2c 20 74 68 65 6e 20 61 6c 74 65 72  ount, then alter
113a0 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
113b0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 74 72  to use the.** tr
113c0 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 2e 0a 2a  ansient index..*
113d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
113e0 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  stAutomaticIndex
113f0 28 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70  (WhereBestIdx *p
11400 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
11410 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20  se = p->pParse; 
11420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11430 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
11440 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
11450 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43  se *pWC = p->pWC
11460 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
11470 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
11480 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
11490 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20  List_item *pSrc 
114a0 3d 20 70 2d 3e 70 53 72 63 3b 20 20 2f 2a 20 54  = p->pSrc;  /* T
114b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
114c0 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
114d0 0a 20 20 64 6f 75 62 6c 65 20 6e 54 61 62 6c 65  .  double nTable
114e0 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
114f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
11500 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61   in the input ta
11510 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ble */.  double 
11520 6c 6f 67 4e 3b 20 20 20 20 20 20 20 20 20 20 20  logN;           
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11540 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29  * log(nTableRow)
11550 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73   */.  double cos
11560 74 54 65 6d 70 49 64 78 3b 20 20 20 20 20 20 20  tTempIdx;       
11570 20 20 2f 2a 20 70 65 72 2d 71 75 65 72 79 20 63    /* per-query c
11580 6f 73 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ost of the trans
11590 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
115a0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
115b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
115c0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
115d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
115e0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
115f0 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20  *pWCEnd;        
11600 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
11610 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20  >a[] */.  Table 
11620 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
11630 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
11640 68 74 20 6d 69 67 68 74 20 62 65 20 69 6e 64 65  ht might be inde
11650 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  xed */..  if( pP
11660 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
11670 3c 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20  <=(double)1 ){. 
11680 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
11690 6f 20 70 6f 69 6e 74 20 69 6e 20 62 75 69 6c 64  o point in build
116a0 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
116b0 20 69 6e 64 65 78 20 66 6f 72 20 61 20 73 69 6e   index for a sin
116c0 67 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  gle scan */.    
116d0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
116e0 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  ( (pParse->db->f
116f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
11700 74 6f 49 6e 64 65 78 29 3d 3d 30 20 29 7b 0a 20  toIndex)==0 ){. 
11710 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20     /* Automatic 
11720 69 6e 64 69 63 65 73 20 61 72 65 20 64 69 73 61  indices are disa
11730 62 6c 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  bled at run-time
11740 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
11750 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 63 6f    }.  if( (p->co
11760 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
11770 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
11780 53 43 41 4e 29 21 3d 30 0a 20 20 20 26 26 20 28  SCAN)!=0.   && (
11790 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46  p->cost.plan.wsF
117a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 56  lags & WHERE_COV
117b0 45 52 5f 53 43 41 4e 29 3d 3d 30 0a 20 20 29 7b  ER_SCAN)==0.  ){
117c0 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c 72 65 61  .    /* We alrea
117d0 64 79 20 68 61 76 65 20 73 6f 6d 65 20 6b 69 6e  dy have some kin
117e0 64 20 6f 66 20 69 6e 64 65 78 20 69 6e 20 75 73  d of index in us
117f0 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
11800 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
11810 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
11820 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  >viaCoroutine ){
11830 0a 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 69  .    /* Cannot i
11840 6e 64 65 78 20 61 20 63 6f 2d 72 6f 75 74 69 6e  ndex a co-routin
11850 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  e */.    return;
11860 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
11870 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a 20  >notIndexed ){. 
11880 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20 49 4e     /* The NOT IN
11890 44 45 58 45 44 20 63 6c 61 75 73 65 20 61 70 70  DEXED clause app
118a0 65 61 72 73 20 69 6e 20 74 68 65 20 53 51 4c 2e  ears in the SQL.
118b0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
118c0 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
118d0 69 73 43 6f 72 72 65 6c 61 74 65 64 20 29 7b 0a  isCorrelated ){.
118e0 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63      /* The sourc
118f0 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
11900 64 20 73 75 62 2d 71 75 65 72 79 2e 20 4e 6f 20  d sub-query. No 
11910 70 6f 69 6e 74 20 69 6e 20 69 6e 64 65 78 69 6e  point in indexin
11920 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74  g it. */.    ret
11930 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  urn;.  }..  asse
11940 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  rt( pParse->nQue
11950 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62 6c  ryLoop >= (doubl
11960 65 29 31 20 29 3b 0a 20 20 70 54 61 62 6c 65 20  e)1 );.  pTable 
11970 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
11980 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70 54 61 62  nTableRow = pTab
11990 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 6c  le->nRowEst;.  l
119a0 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54 61  ogN = estLog(nTa
119b0 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74 54  bleRow);.  costT
119c0 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a  empIdx = 2*logN*
119d0 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61 72 73  (nTableRow/pPars
119e0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 20  e->nQueryLoop + 
119f0 31 29 3b 0a 20 20 69 66 28 20 63 6f 73 74 54 65  1);.  if( costTe
11a00 6d 70 49 64 78 3e 3d 70 2d 3e 63 6f 73 74 2e 72  mpIdx>=p->cost.r
11a10 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Cost ){.    /* T
11a20 68 65 20 63 6f 73 74 20 6f 66 20 63 72 65 61 74  he cost of creat
11a30 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
11a40 74 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 62 65  t table would be
11a50 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20   greater than.  
11a60 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20 66    ** doing the f
11a70 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a  ull table scan *
11a80 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
11a90 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  }..  /* Search f
11aa0 6f 72 20 61 6e 79 20 65 71 75 61 6c 69 74 79 20  or any equality 
11ab0 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d 20  comparison term 
11ac0 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  */.  pWCEnd = &p
11ad0 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
11ae0 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ];.  for(pTerm=p
11af0 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
11b00 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
11b10 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
11b20 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
11b30 70 53 72 63 2c 20 70 2d 3e 6e 6f 74 52 65 61 64  pSrc, p->notRead
11b40 79 29 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52  y) ){.      WHER
11b50 45 54 52 41 43 45 28 28 22 61 75 74 6f 2d 69 6e  ETRACE(("auto-in
11b60 64 65 78 20 72 65 64 75 63 65 73 20 63 6f 73 74  dex reduces cost
11b70 20 66 72 6f 6d 20 25 2e 31 66 20 74 6f 20 25 2e   from %.1f to %.
11b80 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  1f\n",.         
11b90 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63 6f             p->co
11ba0 73 74 2e 72 43 6f 73 74 2c 20 63 6f 73 74 54 65  st.rCost, costTe
11bb0 6d 70 49 64 78 29 29 3b 0a 20 20 20 20 20 20 70  mpIdx));.      p
11bc0 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 63  ->cost.rCost = c
11bd0 6f 73 74 54 65 6d 70 49 64 78 3b 0a 20 20 20 20  ostTempIdx;.    
11be0 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e    p->cost.plan.n
11bf0 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20 31 3b 0a  Row = logN + 1;.
11c00 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c        p->cost.pl
11c10 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  an.wsFlags = WHE
11c20 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  RE_TEMP_INDEX;. 
11c30 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 75 73 65       p->cost.use
11c40 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  d = pTerm->prere
11c50 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62 72  qRight;.      br
11c60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
11c70 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
11c80 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  bestAutomaticInd
11c90 65 78 28 41 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ex(A)  /* no-op 
11ca0 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  */.#endif /* SQL
11cb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
11cc0 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69  IC_INDEX */...#i
11cd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11ce0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
11cf0 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  X./*.** Generate
11d00 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75   code to constru
11d10 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
11d20 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d  ect for an autom
11d30 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  atic index.** an
11d40 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20  d to set up the 
11d50 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63  WhereLevel objec
11d60 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74  t pLevel so that
11d70 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
11d80 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65  tor.** makes use
11d90 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69   of the automati
11da0 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  c index..*/.stat
11db0 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63  ic void construc
11dc0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
11dd0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11df0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
11e00 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
11e10 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
11e20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
11e30 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
11e40 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
11e50 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
11e60 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
11e70 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e  erm to get the n
11e80 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  ext index */.  B
11e90 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
11ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
11eb0 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
11ec0 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
11ed0 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  able */.  WhereL
11ee0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20  evel *pLevel    
11ef0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
11f00 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f  ew index here */
11f10 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d  .){.  int nColum
11f20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
11f30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
11f40 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
11f50 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20  nstructed index 
11f60 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
11f70 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
11f80 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
11f90 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
11fa0 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
11fb0 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
11fc0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
11fd0 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69   pWC->a[] */.  i
11fe0 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
11ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
12000 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65  te of memory nee
12010 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a  ded for pIdx */.
12020 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12040 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   Object describi
12050 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  ng the transient
12060 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
12070 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
12080 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
12090 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
120a0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
120b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e   */.  int addrIn
120c0 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
120d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
120e0 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
120f0 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a  on bypass jump *
12100 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  /.  Table *pTabl
12110 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12120 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
12130 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  ng indexed */.  
12140 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66  KeyInfo *pKeyinf
12150 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  o;          /* K
12160 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ey information f
12170 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20  or the index */ 
12180 20 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70    .  int addrTop
12190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
121a0 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
121b0 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
121c0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
121d0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
121e0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
121f0 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
12200 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12220 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
12230 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
12240 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
12250 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
12260 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
12270 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
12280 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
12290 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
122a0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
122b0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122d0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
122e0 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
122f0 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  n */.  Bitmask i
12300 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  dxCols;         
12310 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
12320 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72  columns used for
12330 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
12340 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73  itmask extraCols
12350 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69  ;          /* Bi
12360 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e  tmap of addition
12370 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  al columns */.. 
12380 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
12390 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
123a0 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
123b0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
123c0 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
123d0 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
123e0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
123f0 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
12400 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
12410 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
12420 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
12430 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
12440 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
12450 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43  pParse);..  /* C
12460 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
12470 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
12480 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
12490 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
124a0 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
124b0 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
124c0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
124d0 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70  nColumn = 0;.  p
124e0 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
124f0 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
12500 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
12510 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20  m];.  idxCols = 
12520 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
12530 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
12540 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
12550 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
12560 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
12570 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
12580 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
12590 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
125a0 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
125b0 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
125c0 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74  Col>=BMS ? ((Bit
125d0 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
125e0 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   : ((Bitmask)1)<
125f0 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73  <iCol;.      tes
12600 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
12610 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12620 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
12630 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  );.      if( (id
12640 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
12650 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f  0 ){.        nCo
12660 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
12670 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
12680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12690 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43    }.  assert( nC
126a0 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65  olumn>0 );.  pLe
126b0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20  vel->plan.nEq = 
126c0 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43  nColumn;..  /* C
126d0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
126e0 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
126f0 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
12700 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
12710 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
12720 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
12730 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
12740 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
12750 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
12760 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
12770 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
12780 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
12790 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
127a0 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
127b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
127c0 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
127d0 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
127e0 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
127f0 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
12800 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
12810 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
12820 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
12830 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
12840 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
12850 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
12860 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
12870 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
12880 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
12890 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
128a0 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
128b0 64 78 43 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d  dxCols | (((Bitm
128c0 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29  ask)1)<<(BMS-1))
128d0 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
128e0 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d  (pTable->nCol >=
128f0 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20   BMS-1) ? BMS-1 
12900 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a  : pTable->nCol;.
12910 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
12920 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
12930 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
12940 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
12950 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
12960 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
12970 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
12980 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73  Cols & (((Bitmas
12990 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75  k)1)<<i) ) nColu
129a0 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
129b0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
129c0 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
129d0 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e  BMS-1)) ){.    n
129e0 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65  Column += pTable
129f0 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
12a00 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e  ;.  }.  pLevel->
12a10 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
12a20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
12a30 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  | WHERE_IDX_ONLY
12a40 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20   | WO_EQ;..  /* 
12a50 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
12a60 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
12a70 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
12a80 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73  x */.  nByte = s
12a90 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20  izeof(Index);.  
12aa0 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
12ab0 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20  *sizeof(int);   
12ac0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
12ad0 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  umn */.  nByte +
12ae0 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
12af0 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e  (char*);   /* In
12b00 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20  dex.azColl */.  
12b10 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
12b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12b30 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
12b40 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20  Order */.  pIdx 
12b50 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
12b60 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
12b70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
12b80 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
12b90 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  ;.  pLevel->plan
12ba0 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  .u.pIdx = pIdx;.
12bb0 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d    pIdx->azColl =
12bc0 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78 5b 31   (char**)&pIdx[1
12bd0 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ];.  pIdx->aiCol
12be0 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 64  umn = (int*)&pId
12bf0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d  x->azColl[nColum
12c00 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72  n];.  pIdx->aSor
12c10 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
12c20 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  Idx->aiColumn[nC
12c30 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e  olumn];.  pIdx->
12c40 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e  zName = "auto-in
12c50 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43  dex";.  pIdx->nC
12c60 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  olumn = nColumn;
12c70 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
12c80 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
12c90 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
12ca0 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
12cb0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
12cc0 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
12cd0 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
12ce0 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
12cf0 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
12d00 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
12d10 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
12d20 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
12d30 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
12d40 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d  ol>=BMS ? ((Bitm
12d50 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20  ask)1)<<(BMS-1) 
12d60 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  : ((Bitmask)1)<<
12d70 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  iCol;.      if( 
12d80 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
12d90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12da0 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
12db0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
12dc0 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
12dd0 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
12de0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
12df0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
12e00 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
12e10 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
12e20 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
12e30 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
12e40 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
12e50 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
12e60 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53  Coll[n] = ALWAYS
12e70 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d  (pColl) ? pColl-
12e80 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59  >zName : "BINARY
12e90 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  ";.        n++;.
12ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12eb0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32  }.  assert( (u32
12ec0 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  )n==pLevel->plan
12ed0 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
12ee0 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
12ef0 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
12f00 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
12f10 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
12f20 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
12f30 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
12f40 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
12f50 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
12f60 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73  Cols & (((Bitmas
12f70 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20 20 20 20  k)1)<<i) ){.    
12f80 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
12f90 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
12fa0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
12fb0 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
12fc0 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
12fd0 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
12fe0 73 65 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b  sed & (((Bitmask
12ff0 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b  )1)<<(BMS-1)) ){
13000 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31  .    for(i=BMS-1
13010 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
13020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  ; i++){.      pI
13030 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
13040 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
13050 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
13060 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
13070 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
13080 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e  sert( n==nColumn
13090 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   );..  /* Create
130a0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
130b0 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e  ndex */.  pKeyin
130c0 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  fo = sqlite3Inde
130d0 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
130e0 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65 72 74   pIdx);.  assert
130f0 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
13100 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  r>=0 );.  sqlite
13110 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13120 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c  P_OpenAutoindex,
13130 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
13140 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a  , nColumn+1, 0,.
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69      (char*)pKeyi
13170 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
13180 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65  HANDOFF);.  Vdbe
13190 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72  Comment((v, "for
131a0 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e   %s", pTable->zN
131b0 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ame));..  /* Fil
131c0 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  l the automatic 
131d0 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65  index with conte
131e0 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  nt */.  addrTop 
131f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13200 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
13210 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
13220 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  r);.  regRecord 
13230 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
13240 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
13250 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
13260 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
13270 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  Idx, pLevel->iTa
13280 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  bCur, regRecord,
13290 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   1);.  sqlite3Vd
132a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
132b0 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
132c0 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
132d0 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
132e0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
132f0 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
13300 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
13310 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13320 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  _Next, pLevel->i
13330 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b  TabCur, addrTop+
13340 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
13350 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
13360 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
13370 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c  UTOINDEX);.  sql
13380 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
13390 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
133a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
133b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
133c0 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f  gRecord);.  .  /
133d0 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
133e0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
133f0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
13400 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13410 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69  pHere(v, addrIni
13420 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  t);.}.#endif /* 
13430 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13440 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
13450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13460 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13470 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
13480 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
13490 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
134a0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
134b0 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
134c0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
134d0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
134e0 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
134f0 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
13500 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
13510 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
13520 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
13530 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
13540 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
13550 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13560 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
13570 6e 66 6f 28 57 68 65 72 65 42 65 73 74 49 64 78  nfo(WhereBestIdx
13580 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
13590 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
135a0 65 3b 20 0a 20 20 57 68 65 72 65 43 6c 61 75 73  e; .  WhereClaus
135b0 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b  e *pWC = p->pWC;
135c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
135d0 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70  t_item *pSrc = p
135e0 2d 3e 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69  ->pSrc;.  ExprLi
135f0 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
13600 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
13610 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
13620 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
13630 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13640 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
13650 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
13660 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
13670 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
13680 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
13690 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
136a0 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
136b0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
136c0 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
136d0 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
136e0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
136f0 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43  fo;..  WHERETRAC
13700 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20  E(("Recomputing 
13710 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25  index info for %
13720 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  s...\n", pSrc->p
13730 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  Tab->zName));.. 
13740 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
13750 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
13760 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
13770 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
13780 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ing.  ** to this
13790 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
137a0 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d  /.  for(i=nTerm=
137b0 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
137c0 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
137d0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
137e0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
137f0 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
13800 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
13810 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
13820 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
13830 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
13840 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
13850 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
13860 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
13870 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
13880 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
13890 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
138a0 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ULL );.    if( p
138b0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
138c0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  & (WO_ISNULL) ) 
138d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
138e0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
138f0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
13900 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
13910 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
13920 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
13930 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
13940 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
13950 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
13960 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
13970 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
13980 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
13990 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
139a0 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
139b0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
139c0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
139d0 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
139e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
139f0 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
13a00 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
13a10 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
13a20 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
13a30 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
13a40 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
13a50 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
13a60 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
13a70 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
13a80 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
13a90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
13aa0 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
13ab0 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
13ac0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
13ad0 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
13ae0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
13af0 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
13b00 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
13b10 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
13b20 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
13b30 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b50 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
13b60 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
13b70 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
13b80 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
13ba0 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
13bb0 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
13bc0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
13bd0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13be0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13bf0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
13c00 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62  ");.    /* (doub
13c10 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
13c20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
13c30 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
13c40 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13c50 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
13c60 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
13c70 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
13c80 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
13c90 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
13ca0 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
13cb0 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
13cc0 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
13cd0 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
13ce0 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
13cf0 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
13d00 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
13d10 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
13d20 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
13d30 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
13d40 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
13d50 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
13d60 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13d70 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
13d80 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
13d90 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
13da0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
13db0 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
13dc0 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
13dd0 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
13de0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
13df0 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
13e00 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
13e10 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
13e20 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
13e30 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
13e40 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
13e50 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
13e60 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
13e70 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13e80 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
13e90 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
13ea0 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
13eb0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
13ec0 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
13ed0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
13ee0 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
13ef0 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
13f00 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13f10 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
13f20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
13f30 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f80 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
13f90 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
13fa0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
13fb0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
13fc0 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
13fd0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
13fe0 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
13ff0 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
14000 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
14010 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
14020 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
14030 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
14040 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
14050 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
14060 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
14070 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
14080 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
14090 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
140a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
140b0 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  (WO_ISNULL) ) co
140c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
140d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
140e0 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
140f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
14100 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
14110 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
14120 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
14130 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
14140 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
14150 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
14160 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
14170 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
14180 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
14190 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
141a0 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
141b0 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
141c0 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
141d0 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
141e0 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
141f0 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
14200 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
14210 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
14220 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
14230 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
14240 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
14250 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
14260 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
14270 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
14280 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
14290 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
142a0 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
142b0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
142c0 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
142d0 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
142e0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
142f0 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
14300 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
14310 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
14320 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
14330 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
14340 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14350 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
14360 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
14370 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
14380 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
14390 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
143a0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
143b0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
143c0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
143d0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
143e0 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
143f0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
14400 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
14410 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
14420 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
14430 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
14440 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
14450 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
14460 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
14470 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
14480 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
14490 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
144a0 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
144b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
144c0 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
144d0 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
144e0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
144f0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
14500 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
14510 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
14520 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
14530 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
14540 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
14550 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
14560 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
14570 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
14580 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65 72 20  ex_info pointer 
14590 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
145a0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
145b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
145c0 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
145d0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
145e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
145f0 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
14600 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
14610 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
14620 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
14630 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
14640 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
14650 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14660 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
14670 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
14680 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
14690 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
146a0 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
146b0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
146c0 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
146d0 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
146e0 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
146f0 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
14700 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
14710 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
14720 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
14730 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
14740 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
14750 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
14760 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14770 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
14780 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
14790 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
147a0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
147b0 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
147c0 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
147d0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78 42   WHERETRACE(("xB
147e0 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c  estIndex for %s\
147f0 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
14800 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  );.  TRACE_IDX_I
14810 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
14820 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
14830 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
14840 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
14850 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
14860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14870 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
14880 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
14890 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
148a0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
148b0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
148c0 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
148d0 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
148e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
148f0 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
14900 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
14910 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14920 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14930 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
14940 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
14950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
14960 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
14970 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
14980 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
14990 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
149a0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
149b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  +){.    if( !p->
149c0 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
149d0 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e  sable && p->aCon
149e0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
149f0 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
14a00 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14a10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
14a20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
14a30 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65  s: xBestIndex re
14a40 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
14a50 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a  d plan", pTab->z
14a60 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
14a70 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ..  return pPars
14a80 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a  e->nErr;.}.../*.
14a90 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 62  ** Compute the b
14aa0 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20  est index for a 
14ab0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
14ac0 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69 6e  *.** The best in
14ad0 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64 20  dex is computed 
14ae0 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
14af0 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  x method of the 
14b00 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65  virtual.** table
14b10 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20 72   module.  This r
14b20 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c 79  outine is really
14b30 20 6a 75 73 74 20 61 20 77 72 61 70 70 65 72 20   just a wrapper 
14b40 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a 20  that sets up.** 
14b50 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
14b60 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14b70 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
14b80 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74   communicate wit
14b90 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e  h.** xBestIndex.
14ba0 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e  .**.** In a join
14bb0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
14bc0 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20 6d  ight be called m
14bd0 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66 6f  ultiple times fo
14be0 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69  r the.** same vi
14bf0 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
14c00 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
14c10 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
14c20 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
14c30 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20   initialized on 
14c40 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61  the first invoca
14c50 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
14c60 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  on all subsequen
14c70 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73  t.** invocations
14c80 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
14c90 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
14ca0 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ure is also used
14cb0 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73   when.** code is
14cc0 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61 63   generated to ac
14cd0 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61 6c  cess the virtual
14ce0 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68 65   table.  The whe
14cf0 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a  reInfoDelete() .
14d00 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65 73  ** routine takes
14d10 20 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e 67   care of freeing
14d20 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
14d30 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14d40 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72 79  e after.** every
14d50 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68 65  body has finishe
14d60 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74  d with it..*/.st
14d70 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 56 69  atic void bestVi
14d80 72 74 75 61 6c 49 6e 64 65 78 28 57 68 65 72 65  rtualIndex(Where
14d90 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20 20 50  BestIdx *p){.  P
14da0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
14db0 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 2f  ->pParse;      /
14dc0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
14dd0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
14de0 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d  Clause *pWC = p-
14df0 3e 70 57 43 3b 20 20 20 20 20 20 2f 2a 20 54 68  >pWC;      /* Th
14e00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
14e10 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
14e20 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20  st_item *pSrc = 
14e30 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65 20  p->pSrc; /* The 
14e40 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
14e50 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
14e60 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53  Table *pTab = pS
14e70 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  rc->pTab;.  sqli
14e80 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
14e90 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75  pIdxInfo;.  stru
14ea0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14eb0 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
14ec0 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
14ed0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
14ee0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
14ef0 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
14f00 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
14f10 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74  t i, j, k;.  int
14f20 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74   nOrderBy;.  int
14f30 20 73 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20   sortOrder;     
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f50 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 49  Sort order for I
14f60 4e 20 63 6c 61 75 73 65 73 20 2a 2f 0a 20 20 69  N clauses */.  i
14f70 6e 74 20 62 41 6c 6c 6f 77 49 4e 3b 20 20 20 20  nt bAllowIN;    
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14f90 2a 20 41 6c 6c 6f 77 20 49 4e 20 6f 70 74 69 6d  * Allow IN optim
14fa0 69 7a 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 64 6f  izations */.  do
14fb0 75 62 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f  uble rCost;..  /
14fc0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c  * Make sure wsFl
14fd0 61 67 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ags is initializ
14fe0 65 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20  ed to some sane 
14ff0 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65  value. Otherwise
15000 2c 20 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d  , if the .  ** m
15010 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74  alloc in allocat
15020 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69  eIndexInfo() fai
15030 6c 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ls and this func
15040 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61  tion returns lea
15050 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67  ving.  ** wsFlag
15060 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61  s in an uninitia
15070 6c 69 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65  lized state, the
15080 20 63 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61   caller may beha
15090 76 65 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79  ve unpredictably
150a0 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
150b0 26 70 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69 7a  &p->cost, 0, siz
150c0 65 6f 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a 20  eof(p->cost));. 
150d0 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73   p->cost.plan.ws
150e0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
150f0 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f  RTUALTABLE;..  /
15100 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33  * If the sqlite3
15110 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
15120 63 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65  cture has not be
15130 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  en previously.  
15140 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
15150 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68   initialized, th
15160 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  en allocate and 
15170 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f  initialize it no
15180 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  w..  */.  pIdxIn
15190 66 6f 20 3d 20 2a 70 2d 3e 70 70 49 64 78 49 6e  fo = *p->ppIdxIn
151a0 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  fo;.  if( pIdxIn
151b0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 2d  fo==0 ){.    *p-
151c0 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64  >ppIdxInfo = pId
151d0 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
151e0 49 6e 64 65 78 49 6e 66 6f 28 70 29 3b 0a 20 20  IndexInfo(p);.  
151f0 7d 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  }.  if( pIdxInfo
15200 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
15210 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  n;.  }..  /* At 
15220 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
15230 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
15240 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
15250 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74  t pIdxInfo point
15260 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68  s.  ** to will h
15270 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ave been initial
15280 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75 72  ized, either dur
15290 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
152a0 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20  invocation or.  
152b0 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70  ** during some p
152c0 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  rior invocation.
152d0 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61    Now we just ha
152e0 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20  ve to customize 
152f0 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73  the.  ** details
15300 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72   of pIdxInfo for
15310 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76   the current inv
15320 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73  ocation and pass
15330 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73   it to.  ** xBes
15340 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20  tIndex..  */..  
15350 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61  /* The module na
15360 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  me must be defin
15370 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69  ed. Also, by thi
15380 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75  s point there mu
15390 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69  st.  ** be a poi
153a0 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
153b0 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
153c0 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a  e. Otherwise.  *
153d0 2a 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  * sqlite3ViewGet
153e0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f  ColumnNames() wo
153f0 75 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64 20  uld have picked 
15400 75 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20  up the error. . 
15410 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
15420 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20  ab->azModuleArg 
15430 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  && pTab->azModul
15440 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73  eArg[0] );.  ass
15450 65 72 74 28 20 73 71 6c 69 74 65 33 47 65 74 56  ert( sqlite3GetV
15460 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
15470 2c 20 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a  , pTab) );..  /*
15480 20 54 72 79 20 6f 6e 63 65 20 6f 72 20 74 77 69   Try once or twi
15490 63 65 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  ce.  On the firs
154a0 74 20 61 74 74 65 6d 70 74 2c 20 61 6c 6c 6f 77  t attempt, allow
154b0 20 49 4e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   IN optimization
154c0 73 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 20 49 4e  s..  ** If an IN
154d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
154e0 20 61 63 63 65 70 74 65 64 20 62 79 20 74 68 65   accepted by the
154f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78   virtual table x
15500 42 65 73 74 49 6e 64 65 78 0a 20 20 2a 2a 20 6d  BestIndex.  ** m
15510 65 74 68 6f 64 2c 20 62 75 74 20 74 68 65 20 20  ethod, but the  
15520 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  pInfo->aConstrai
15530 6e 55 73 61 67 65 2e 6f 6d 69 74 20 66 6c 61 67  nUsage.omit flag
15540 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
15550 6e 0a 20 20 2a 2a 20 74 68 65 20 71 75 65 72 79  n.  ** the query
15560 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 62   will not work b
15570 65 63 61 75 73 65 20 69 74 20 6d 69 67 68 74 20  ecause it might 
15580 61 6c 6c 6f 77 20 64 75 70 6c 69 63 61 74 65 20  allow duplicate 
15590 72 6f 77 73 20 69 6e 0a 20 20 2a 2a 20 6f 75 74  rows in.  ** out
155a0 70 75 74 2e 20 20 49 6e 20 74 68 61 74 20 63 61  put.  In that ca
155b0 73 65 2c 20 72 75 6e 20 74 68 65 20 78 42 65 73  se, run the xBes
155c0 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 20  tIndex method a 
155d0 73 65 63 6f 6e 64 20 74 69 6d 65 0a 20 20 2a 2a  second time.  **
155e0 20 77 69 74 68 6f 75 74 20 74 68 65 20 49 4e 20   without the IN 
155f0 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 55 73  constraints.  Us
15600 75 61 6c 6c 79 20 74 68 69 73 20 6c 6f 6f 70 20  ually this loop 
15610 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
15620 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 77 69    ** The loop wi
15630 6c 6c 20 65 78 69 74 20 75 73 69 6e 67 20 61 20  ll exit using a 
15640 22 62 72 65 61 6b 22 20 73 74 61 74 65 6d 65 6e  "break" statemen
15650 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 62 41  t..  */.  for(bA
15660 6c 6c 6f 77 49 4e 3d 31 3b 20 31 3b 20 62 41 6c  llowIN=1; 1; bAl
15670 6c 6f 77 49 4e 2d 2d 29 7b 0a 20 20 20 20 61 73  lowIN--){.    as
15680 73 65 72 74 28 20 62 41 6c 6c 6f 77 49 4e 3d 3d  sert( bAllowIN==
15690 30 20 7c 7c 20 62 41 6c 6c 6f 77 49 4e 3d 3d 31  0 || bAllowIN==1
156a0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   );..    /* Set 
156b0 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  the aConstraint[
156c0 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20  ].usable fields 
156d0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
156e0 6c 6c 20 0a 20 20 20 20 2a 2a 20 6f 75 74 70 75  ll .    ** outpu
156f0 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a  t variables to z
15700 65 72 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ero..    **.    
15710 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  ** aConstraint[]
15720 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75 65 20  .usable is true 
15730 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
15740 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
15750 68 61 6e 64 0a 20 20 20 20 2a 2a 20 73 69 64 65  hand.    ** side
15760 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72   contains only r
15770 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
15780 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
15790 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
157a0 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e     ** table.  In
157b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
157c0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
157d0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
157e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
157f0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d          column =
15800 20 65 78 70 72 0a 20 20 20 20 2a 2a 0a 20 20 20   expr.    **.   
15810 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65   ** and we are e
15820 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e  valuating a join
15830 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
15840 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20  raint on column 
15850 69 73 20 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20  is .    ** only 
15860 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62  valid if all tab
15870 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 69  les referenced i
15880 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20  n expr occur to 
15890 74 68 65 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  the left.    ** 
158a0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e  of the table con
158b0 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a  taining column..
158c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
158d0 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d  e aConstraints[]
158e0 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
158f0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
15900 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
15910 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
15920 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77  t table.  That w
15930 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20  ay we only have 
15940 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e  to compute it on
15950 63 65 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 74  ce.    ** even t
15960 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74  hough we might t
15970 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62  ry to pick the b
15980 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70  est index multip
15990 6c 65 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2a  le times..    **
159a0 20 46 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70   For each attemp
159b0 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20  t at picking an 
159c0 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72  index, the order
159d0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
159e0 65 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69  e.    ** join mi
159f0 67 68 74 20 62 65 20 64 69 66 66 65 72 65 6e 74  ght be different
15a00 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72   so we have to r
15a10 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61  ecompute the usa
15a20 62 6c 65 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ble flag.    ** 
15a30 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 2a  each time..    *
15a40 2f 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  /.    pIdxCons =
15a50 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
15a60 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
15a70 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
15a80 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
15a90 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
15aa0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
15ab0 73 61 67 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  sage;.    for(i=
15ac0 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
15ad0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
15ae0 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
15af0 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
15b00 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
15b10 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
15b20 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  C->a[j];.      i
15b30 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
15b40 71 52 69 67 68 74 26 70 2d 3e 6e 6f 74 52 65 61  qRight&p->notRea
15b50 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  dy)==0.       &&
15b60 20 28 62 41 6c 6c 6f 77 49 4e 20 7c 7c 20 28 70   (bAllowIN || (p
15b70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
15b80 26 20 57 4f 5f 49 4e 29 3d 3d 30 29 0a 20 20 20  & WO_IN)==0).   
15b90 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49     ){.        pI
15ba0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
15bb0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
15bc0 0a 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e  .        pIdxCon
15bd0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
15be0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15bf0 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
15c00 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
15c10 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e  [0])*pIdxInfo->n
15c20 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
15c30 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
15c40 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
15c50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15c60 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
15c70 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20  idxStr);.    }. 
15c80 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
15c90 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
15ca0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
15cb0 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
15cc0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
15cd0 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
15ce0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
15cf0 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  umed = 0;.    /*
15d00 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49 6e 20   ((double)2) In 
15d10 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  case of SQLITE_O
15d20 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
15d30 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 70 49 64  NT... */.    pId
15d40 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
15d50 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
15d60 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65  G_DBL / ((double
15d70 29 32 29 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42  )2);.    nOrderB
15d80 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  y = pIdxInfo->nO
15d90 72 64 65 72 42 79 3b 0a 20 20 20 20 69 66 28 20  rderBy;.    if( 
15da0 21 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  !p->pOrderBy ){.
15db0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
15dc0 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
15dd0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 76    }.  .    if( v
15de0 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61  tabBestIndex(pPa
15df0 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49  rse, pTab, pIdxI
15e00 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65  nfo) ){.      re
15e10 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  turn;.    }.  . 
15e20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
15e30 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20  QLITE_SO_ASC;.  
15e40 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
15e50 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15e60 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
15e70 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
15e80 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72  straint;.    for
15e90 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
15ea0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
15eb0 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
15ec0 0a 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67  .      if( pUsag
15ed0 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
15ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   ){.        j = 
15ef0 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
15f00 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70  ffset;.        p
15f10 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
15f20 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  ];.        p->co
15f30 73 74 2e 75 73 65 64 20 7c 3d 20 70 54 65 72 6d  st.used |= pTerm
15f40 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
15f50 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
15f60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
15f70 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
15f80 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67 65        if( pUsage
15f90 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20  [i].omit==0 ){. 
15fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
15fb0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
15fc0 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  use an IN constr
15fd0 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72 74  aint if the virt
15fe0 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
15ff0 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68        ** says th
16000 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  at the equivalen
16010 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  t EQ constraint 
16020 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79  cannot be safely
16030 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20   omitted..      
16040 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64        ** If we d
16050 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  o attempt to use
16060 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69   such a constrai
16070 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69  nt, some rows mi
16080 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20 20  ght be.         
16090 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69     ** repeated i
160a0 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f  n the output. */
160b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
160c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
160d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
160e0 30 3b 20 6b 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; k<pIdxInfo->n
160f0 4f 72 64 65 72 42 79 3b 20 6b 2b 2b 29 7b 0a 20  OrderBy; k++){. 
16100 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
16110 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
16120 79 5b 6b 5d 2e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  y[k].iColumn==pI
16130 64 78 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 20  dxCons->iColumn 
16140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
16150 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64   sortOrder = pId
16160 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b  xInfo->aOrderBy[
16170 6b 5d 2e 64 65 73 63 3b 0a 20 20 20 20 20 20 20  k].desc;.       
16180 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
161a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
161b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
161c0 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78 49      if( i>=pIdxI
161d0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
161e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
161f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
16200 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
16210 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20 73 65  ause, and the se
16220 6c 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 74  lected virtual t
16230 61 62 6c 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20  able index.  ** 
16240 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79  does not satisfy
16250 20 69 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68   it, increase th
16260 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73 63  e cost of the sc
16270 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  an accordingly. 
16280 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74 63 68 65  This.  ** matche
16290 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
162a0 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74 75 61 6c   for non-virtual
162b0 20 74 61 62 6c 65 73 20 69 6e 20 62 65 73 74 42   tables in bestB
162c0 74 72 65 65 49 6e 64 65 78 28 29 2e 0a 20 20 2a  treeIndex()..  *
162d0 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70 49 64 78  /.  rCost = pIdx
162e0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
162f0 6f 73 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  ost;.  if( p->pO
16300 72 64 65 72 42 79 20 26 26 20 70 49 64 78 49 6e  rderBy && pIdxIn
16310 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
16320 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43  med==0 ){.    rC
16330 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43  ost += estLog(rC
16340 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a  ost)*rCost;.  }.
16350 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69  .  /* The cost i
16360 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
16370 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
16380 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28  SQLITE_BIG_DBL (
16390 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20  the.  ** inital 
163a0 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43  value of lowestC
163b0 6f 73 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70  ost in this loop
163c0 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  . If it is, then
163d0 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c   the.  ** (cost<
163e0 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74  lowestCost) test
163f0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65   below will neve
16400 72 20 62 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20  r be true..  ** 
16410 0a 20 20 2a 2a 20 55 73 65 20 22 28 64 6f 75 62  .  ** Use "(doub
16420 6c 65 29 32 22 20 69 6e 73 74 65 61 64 20 6f 66  le)2" instead of
16430 20 22 32 2e 30 22 20 69 6e 20 63 61 73 65 20 4f   "2.0" in case O
16440 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
16450 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64 65 66 69  NT .  ** is defi
16460 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
16470 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f  (SQLITE_BIG_DBL/
16480 28 28 64 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f  ((double)2))<rCo
16490 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73  st ){.    p->cos
164a0 74 2e 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54  t.rCost = (SQLIT
164b0 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62  E_BIG_DBL/((doub
164c0 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  le)2));.  }else{
164d0 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f  .    p->cost.rCo
164e0 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 7d 0a  st = rCost;.  }.
164f0 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75    p->cost.plan.u
16500 2e 70 56 74 61 62 49 64 78 20 3d 20 70 49 64 78  .pVtabIdx = pIdx
16510 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78  Info;.  if( pIdx
16520 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
16530 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 61 73 73  sumed ){.    ass
16540 65 72 74 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d  ert( sortOrder==
16550 30 20 7c 7c 20 73 6f 72 74 4f 72 64 65 72 3d 3d  0 || sortOrder==
16560 31 20 29 3b 0a 20 20 20 20 70 2d 3e 63 6f 73 74  1 );.    p->cost
16570 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
16580 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 20 2b   WHERE_ORDERED +
16590 20 73 6f 72 74 4f 72 64 65 72 2a 57 48 45 52 45   sortOrder*WHERE
165a0 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 70 2d  _REVERSE;.    p-
165b0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61  >cost.plan.nOBSa
165c0 74 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  t = nOrderBy;.  
165d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f  }else{.    p->co
165e0 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d  st.plan.nOBSat =
165f0 20 70 2d 3e 69 20 3f 20 70 2d 3e 61 4c 65 76 65   p->i ? p->aLeve
16600 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e  l[p->i-1].plan.n
16610 4f 42 53 61 74 20 3a 20 30 3b 0a 20 20 7d 0a 20  OBSat : 0;.  }. 
16620 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 45   p->cost.plan.nE
16630 71 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  q = 0;.  pIdxInf
16640 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f  o->nOrderBy = nO
16650 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72  rderBy;..  /* Tr
16660 79 20 74 6f 20 66 69 6e 64 20 61 20 6d 6f 72 65  y to find a more
16670 20 65 66 66 69 63 69 65 6e 74 20 61 63 63 65 73   efficient acces
16680 73 20 70 61 74 74 65 72 6e 20 62 79 20 75 73 69  s pattern by usi
16690 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 65  ng multiple inde
166a0 78 65 73 0a 20 20 2a 2a 20 74 6f 20 6f 70 74 69  xes.  ** to opti
166b0 6d 69 7a 65 20 61 6e 20 4f 52 20 65 78 70 72 65  mize an OR expre
166c0 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
166d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a   WHERE clause. .
166e0 20 20 2a 2f 0a 20 20 62 65 73 74 4f 72 43 6c 61    */.  bestOrCla
166f0 75 73 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 23  useIndex(p);.}.#
16700 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16710 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
16720 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
16730 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
16740 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
16750 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
16760 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
16770 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
16780 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
16790 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
167a0 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
167b0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
167c0 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
167d0 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
167e0 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61  ws less than pVa
167f0 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  l.**    aStat[1]
16800 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
16810 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
16820 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65  to pVal.**.** Re
16830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
16840 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
16850 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
16860 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
16870 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16880 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16890 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
168a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
168c0 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
168d0 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
168e0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
168f0 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a  *pVal,        /*
16900 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64   Value to consid
16910 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
16920 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
16930 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
16940 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
16950 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
16960 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
16970 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
16980 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
16990 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
169a0 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49    tRowcnt n;.  I
169b0 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
169c0 70 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54  ple;.  int i, eT
169d0 79 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20  ype;.  int isEq 
169e0 3d 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  = 0;.  i64 v;.  
169f0 64 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20  double r, rS;.. 
16a00 20 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70   assert( roundUp
16a10 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d  ==0 || roundUp==
16a20 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
16a30 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  Idx->nSample>0 )
16a40 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20  ;.  if( pVal==0 
16a50 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16a60 45 52 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64  ERROR;.  n = pId
16a70 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  x->aiRowEst[0];.
16a80 20 20 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78    aSample = pIdx
16a90 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79  ->aSample;.  eTy
16aa0 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
16ab0 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a  ue_type(pVal);..
16ac0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
16ad0 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
16ae0 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76     v = sqlite3_v
16af0 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29  alue_int64(pVal)
16b00 3b 0a 20 20 20 20 72 20 3d 20 28 69 36 34 29 76  ;.    r = (i64)v
16b10 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
16b20 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
16b30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
16b40 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16b50 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
16b60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16b70 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
16b80 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58  Type>=SQLITE_TEX
16b90 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  T ) break;.     
16ba0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16bb0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e  eType==SQLITE_IN
16bc0 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
16bd0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16be0 75 2e 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20  u.i>=v ){.      
16bf0 20 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70      isEq = aSamp
16c00 6c 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20  le[i].u.i==v;.  
16c10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
16c40 73 65 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d  sert( aSample[i]
16c50 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46  .eType==SQLITE_F
16c60 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20  LOAT );.        
16c70 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  if( aSample[i].u
16c80 2e 72 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20  .r>=r ){.       
16c90 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c     isEq = aSampl
16ca0 65 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20  e[i].u.r==r;.   
16cb0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16cd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
16ce0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
16cf0 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d  FLOAT ){.    r =
16d00 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
16d10 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20  ouble(pVal);.   
16d20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
16d30 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
16d40 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
16d50 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
16d60 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
16d70 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61  nue;.      if( a
16d80 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e  Sample[i].eType>
16d90 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62  =SQLITE_TEXT ) b
16da0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
16db0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16dc0 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29  ==SQLITE_FLOAT )
16dd0 7b 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61  {.        rS = a
16de0 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20  Sample[i].u.r;. 
16df0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16e00 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65      rS = aSample
16e10 5b 69 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d  [i].u.i;.      }
16e20 0a 20 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72  .      if( rS>=r
16e30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71   ){.        isEq
16e40 20 3d 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20   = rS==r;.      
16e50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16e60 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
16e70 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
16e80 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d  _NULL ){.    i =
16e90 20 30 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d   0;.    if( aSam
16ea0 70 6c 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[0].eType==SQ
16eb0 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71  LITE_NULL ) isEq
16ec0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
16ed0 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
16ee0 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
16ef0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42   eType==SQLITE_B
16f00 4c 4f 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  LOB );.    for(i
16f10 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  =0; i<pIdx->nSam
16f20 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
16f30 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16f40 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45  eType==SQLITE_TE
16f50 58 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d  XT || aSample[i]
16f60 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42  .eType==SQLITE_B
16f70 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62  LOB ){.        b
16f80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
16f90 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49    }.    if( i<pI
16fa0 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20  dx->nSample ){  
16fb0 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74      .      sqlit
16fc0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16fd0 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  >db;.      CollS
16fe0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
16ff0 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20   const u8 *z;.  
17000 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53      if( eType==S
17010 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20  QLITE_BLOB ){.  
17020 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74        z = (const
17030 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61   u8 *)sqlite3_va
17040 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a  lue_blob(pVal);.
17050 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
17060 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
17070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17080 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Coll->enc==SQLIT
17090 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20  E_UTF8 );.      
170a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
170b0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
170c0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
170d0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
170e0 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b   *pIdx->azColl);
170f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
17100 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
17110 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17120 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
17130 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63  }.        z = (c
17140 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65  onst u8 *)sqlite
17150 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
17160 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
17170 20 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a        if( !z ){.
17180 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17190 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
171a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
171b0 20 61 73 73 65 72 74 28 20 7a 20 26 26 20 70 43   assert( z && pC
171c0 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
171d0 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mp );.      }.  
171e0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56      n = sqlite3V
171f0 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20  alueBytes(pVal, 
17200 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 0a  pColl->enc);.  .
17210 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3c 70 49        for(; i<pI
17220 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  dx->nSample; i++
17230 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  ){.        int c
17240 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53  ;.        int eS
17250 61 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d  ampletype = aSam
17260 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20  ple[i].eType;.  
17270 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c        if( eSampl
17280 65 74 79 70 65 3c 65 54 79 70 65 20 29 20 63 6f  etype<eType ) co
17290 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
172a0 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65 21  if( eSampletype!
172b0 3d 65 54 79 70 65 20 29 20 62 72 65 61 6b 3b 0a  =eType ) break;.
172c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
172d0 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 20  MIT_UTF16.      
172e0 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63    if( pColl->enc
172f0 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b  !=SQLITE_UTF8 ){
17300 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
17310 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20 20  Sample;.        
17320 20 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20    char *zSample 
17330 3d 20 73 71 6c 69 74 65 33 55 74 66 38 74 6f 31  = sqlite3Utf8to1
17340 36 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  6(.             
17350 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c   db, pColl->enc,
17360 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c   aSample[i].u.z,
17370 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74   aSample[i].nByt
17380 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20  e, &nSample.    
17390 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
173a0 20 20 20 69 66 28 20 21 7a 53 61 6d 70 6c 65 20     if( !zSample 
173b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
173c0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
173d0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
173e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
173f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
17400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17410 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d    c = pColl->xCm
17420 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
17430 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65  nSample, zSample
17440 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  , n, z);.       
17450 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
17460 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20  (db, zSample);. 
17470 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
17480 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
17490 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c          c = pCol
174a0 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
174b0 55 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  User, aSample[i]
174c0 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b  .nByte, aSample[
174d0 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20  i].u.z, n, z);. 
174e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
174f0 20 69 66 28 20 63 3e 3d 30 20 29 7b 0a 20 20 20   if( c>=0 ){.   
17500 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20         if( c==0 
17510 29 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 20 20  ) isEq = 1;.    
17520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17540 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
17550 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53  t this point, aS
17560 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20  ample[i] is the 
17570 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61  first sample tha
17580 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
17590 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20  n.  ** or equal 
175a0 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20  to pVal.  Or if 
175b0 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
175c0 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c  , then all sampl
175d0 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a  es are less.  **
175e0 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20   than pVal.  If 
175f0 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c  aSample[i]==pVal
17600 2c 20 74 68 65 6e 20 69 73 45 71 3d 3d 31 2e 0a  , then isEq==1..
17610 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 71 20    */.  if( isEq 
17620 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
17630 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  <pIdx->nSample )
17640 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  ;.    aStat[0] =
17650 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b   aSample[i].nLt;
17660 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
17670 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b 0a  aSample[i].nEq;.
17680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f    }else{.    tRo
17690 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70  wcnt iLower, iUp
176a0 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
176b0 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
176c0 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
176d0 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d     iUpper = aSam
176e0 70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20 20  ple[0].nLt;.    
176f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70  }else{.      iUp
17700 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e  per = i>=pIdx->n
17710 53 61 6d 70 6c 65 20 3f 20 6e 20 3a 20 61 53 61  Sample ? n : aSa
17720 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20  mple[i].nLt;.   
17730 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
17740 70 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20 61  ple[i-1].nEq + a
17750 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74 3b  Sample[i-1].nLt;
17760 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74  .    }.    aStat
17770 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 76 67 45  [1] = pIdx->avgE
17780 71 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65  q;.    if( iLowe
17790 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20  r>=iUpper ){.   
177a0 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20     iGap = 0;.   
177b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
177c0 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  ap = iUpper - iL
177d0 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ower;.    }.    
177e0 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20  if( roundUp ){. 
177f0 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61       iGap = (iGa
17800 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73  p*2)/3;.    }els
17810 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
17820 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20  iGap/3;.    }.  
17830 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f    aStat[0] = iLo
17840 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a  wer + iGap;.  }.
17850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17860 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
17870 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
17880 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  AT3 */../*.** If
17890 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
178a0 72 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 6c  r represents a l
178b0 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20 73 65  iteral value, se
178c0 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
178d0 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f  o.** an sqlite3_
178e0 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
178f0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
17900 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74 68 20  ame value, with 
17910 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20  affinity.** aff 
17920 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 62  applied to it, b
17930 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
17940 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
17950 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
17960 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65   .** caller to e
17970 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
17980 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
17990 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74   by passing it t
179a0 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c  o .** sqlite3Val
179b0 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  ueFree()..**.** 
179c0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  If the current p
179d0 61 72 73 65 20 69 73 20 61 20 72 65 63 6f 6d 70  arse is a recomp
179e0 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65 70 72  ile (sqlite3Repr
179f0 65 70 61 72 65 28 29 29 20 61 6e 64 20 70 45 78  epare()) and pEx
17a00 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20  pr.** is an SQL 
17a10 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 63 75  variable that cu
17a20 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f  rrently has a no
17a30 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75  n-NULL value bou
17a40 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65  nd to it,.** cre
17a50 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  ate an sqlite3_v
17a60 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
17a70 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 76  ontaining this v
17a80 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69 74 68  alue, again with
17a90 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61 66 66  .** affinity aff
17aa0 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20   applied to it, 
17ab0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
17ac0 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68 65  f neither of the
17ad0 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20 73 65   above apply, se
17ae0 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  t *pp to NULL..*
17af0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
17b00 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
17b10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
17b20 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
17b30 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  _OK..*/.#ifdef S
17b40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17b50 54 33 0a 73 74 61 74 69 63 20 69 6e 74 20 76 61  T3.static int va
17b60 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50  lueFromExpr(.  P
17b70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
17b80 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20   Expr *pExpr, . 
17b90 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71 6c 69   u8 aff, .  sqli
17ba0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29  te3_value **pp.)
17bb0 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
17bc0 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20  p==TK_VARIABLE. 
17bd0 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d    || (pExpr->op=
17be0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
17bf0 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56  pExpr->op2==TK_V
17c00 41 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20  ARIABLE).  ){.  
17c10 20 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45 78    int iVar = pEx
17c20 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
17c30 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
17c40 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
17c50 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20  Vdbe, iVar);.   
17c60 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56 64   *pp = sqlite3Vd
17c70 62 65 47 65 74 56 61 6c 75 65 28 70 50 61 72 73  beGetValue(pPars
17c80 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
17c90 56 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 72  Var, aff);.    r
17ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
17cc0 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78  lite3ValueFromEx
17cd0 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
17ce0 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46  Expr, SQLITE_UTF
17cf0 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23  8, aff, pp);.}.#
17d00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
17d10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
17d20 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
17d30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
17d40 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
17d50 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
17d60 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
17d70 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
17d80 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
17d90 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
17da0 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
17db0 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
17dc0 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
17dd0 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
17de0 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
17df0 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
17e00 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
17e10 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
17e20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
17e30 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
17e40 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
17e50 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
17e60 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
17e70 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
17e80 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
17e90 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
17eb0 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17ee0 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
17ef0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
17f00 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
17f10 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
17f20 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
17f30 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
17f40 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
17f50 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
17f60 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
17f70 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
17f80 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
17f90 20 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20 69   nEq parameter i
17fa0 73 20 70 61 73 73 65 64 20 74 68 65 20 69 6e 64  s passed the ind
17fb0 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ex of the index 
17fc0 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
17fd0 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63  o the.** range c
17fe0 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
17ff0 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
18000 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   number of equal
18010 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
18020 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ** optimized by 
18030 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
18040 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
18050 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69  mple, assuming i
18060 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20  ndex p is.** on 
18070 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
18080 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
18090 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
180a0 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
180b0 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
180c0 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
180d0 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65  en nEq should be
180e0 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75   passed the valu
180f0 65 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  e 1 (as the rang
18100 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
18110 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68  umn,.** b, is th
18120 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f  e second left-mo
18130 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
18140 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
18150 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
18160 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
18170 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
18180 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
18190 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c  * then nEq shoul
181a0 64 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a  d be passed 0..*
181b0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
181c0 64 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  d value is an in
181d0 74 65 67 65 72 20 64 69 76 69 73 6f 72 20 74 6f  teger divisor to
181e0 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69   reduce the esti
181f0 6d 61 74 65 64 0a 2a 2a 20 73 65 61 72 63 68 20  mated.** search 
18200 73 70 61 63 65 2e 20 20 41 20 72 65 74 75 72 6e  space.  A return
18210 20 76 61 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e   value of 1 mean
18220 73 20 74 68 61 74 20 72 61 6e 67 65 20 63 6f 6e  s that range con
18230 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20  straints are.** 
18240 6e 6f 20 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20  no help at all. 
18250 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20   A return value 
18260 6f 66 20 32 20 6d 65 61 6e 73 20 72 61 6e 67 65  of 2 means range
18270 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
18280 0a 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20  .** expected to 
18290 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
182a0 68 20 73 70 61 63 65 20 62 79 20 68 61 6c 66 2e  h space by half.
182b0 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e    And so forth..
182c0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61  ..**.** In the a
182d0 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65  bsence of sqlite
182e0 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a 45 20 64  _stat3 ANALYZE d
182f0 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67 65 20  ata, each range 
18300 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65  inequality.** re
18310 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
18320 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74   space by a fact
18330 6f 72 20 6f 66 20 34 2e 20 20 48 65 6e 63 65 20  or of 4.  Hence 
18340 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61  a single constra
18350 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73  int (x>?).** res
18360 75 6c 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e  ults in a return
18370 20 6f 66 20 34 20 61 6e 64 20 61 20 72 61 6e 67   of 4 and a rang
18380 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e  e constraint (x>
18390 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c  ? AND x<?) resul
183a0 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72  ts.** in a retur
183b0 6e 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74  n of 16..*/.stat
183c0 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
183d0 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  eScanEst(.  Pars
183e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
183f0 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
18400 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
18410 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
18420 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
18430 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63 6f 6e  /* The index con
18440 74 61 69 6e 69 6e 67 20 74 68 65 20 72 61 6e 67  taining the rang
18450 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d  e-compared colum
18460 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20  n; "x" */.  int 
18470 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  nEq,            
18480 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 70   /* index into p
18490 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20  ->aCol[] of the 
184a0 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63  range-compared c
184b0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
184c0 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
184d0 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
184e0 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
184f0 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
18500 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
18510 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
18520 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
18530 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
18540 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
18550 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 64 6f 75  be NULL */.  dou
18560 62 6c 65 20 2a 70 52 61 6e 67 65 44 69 76 20 20  ble *pRangeDiv  
18570 20 2f 2a 20 4f 55 54 3a 20 52 65 64 75 63 65 20   /* OUT: Reduce 
18580 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
18590 74 68 69 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a  this divisor */.
185a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
185b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66  LITE_OK;..#ifdef
185c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
185d0 54 41 54 33 0a 0a 20 20 69 66 28 20 6e 45 71 3d  TAT3..  if( nEq=
185e0 3d 30 20 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65  =0 && p->nSample
185f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
18600 76 61 6c 75 65 20 2a 70 52 61 6e 67 65 56 61 6c  value *pRangeVal
18610 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  ;.    tRowcnt iL
18620 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 74 52  ower = 0;.    tR
18630 6f 77 63 6e 74 20 69 55 70 70 65 72 20 3d 20 70  owcnt iUpper = p
18640 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
18650 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
18660 0a 20 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d  .    u8 aff = p-
18670 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
18680 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66  >aiColumn[0]].af
18690 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66 28  finity;..    if(
186a0 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20   pLower ){.     
186b0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
186c0 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
186d0 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  ight;.      rc =
186e0 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70   valueFromExpr(p
186f0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66  Parse, pExpr, af
18700 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a  f, &pRangeVal);.
18710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
18720 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
18730 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
18740 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
18750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
18760 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b         && whereK
18770 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
18780 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c  p, pRangeVal, 0,
18790 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   a)==SQLITE_OK. 
187a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
187b0 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iLower = a[0];. 
187c0 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 77         if( (pLow
187d0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
187e0 57 4f 5f 47 54 29 21 3d 30 20 29 20 69 4c 6f 77  WO_GT)!=0 ) iLow
187f0 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  er += a[1];.    
18800 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
18810 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67  3ValueFree(pRang
18820 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eVal);.    }.   
18830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18840 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a  OK && pUpper ){.
18850 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
18860 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
18870 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
18880 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45   rc = valueFromE
18890 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
188a0 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56  r, aff, &pRangeV
188b0 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
188c0 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  t( (pUpper->eOpe
188d0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
188e0 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_LE))!=0 );.   
188f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18900 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77  E_OK.       && w
18910 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
18920 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61  rse, p, pRangeVa
18930 6c 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45  l, 1, a)==SQLITE
18940 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  _OK.      ){.   
18950 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b       iUpper = a[
18960 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
18970 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
18980 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
18990 20 69 55 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b   iUpper += a[1];
189a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
189b0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
189c0 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20  pRangeVal);.    
189d0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
189e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
189f0 20 69 66 28 20 69 55 70 70 65 72 3c 3d 69 4c 6f   if( iUpper<=iLo
18a00 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  wer ){.        *
18a10 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75  pRangeDiv = (dou
18a20 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b  ble)p->aiRowEst[
18a30 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0];.      }else{
18a40 0a 20 20 20 20 20 20 20 20 2a 70 52 61 6e 67 65  .        *pRange
18a50 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d  Div = (double)p-
18a60 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f 28 64 6f  >aiRowEst[0]/(do
18a70 75 62 6c 65 29 28 69 55 70 70 65 72 20 2d 20 69  uble)(iUpper - i
18a80 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Lower);.      }.
18a90 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
18aa0 28 28 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65  (("range scan re
18ab0 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64  gions: %u..%u  d
18ac0 69 76 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20  iv=%g\n",.      
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
18ae0 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
18af0 70 70 65 72 2c 20 2a 70 52 61 6e 67 65 44 69 76  pper, *pRangeDiv
18b00 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18b10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18b20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
18b30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
18b40 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44  Parse);.  UNUSED
18b50 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
18b60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18b70 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20  R(nEq);.#endif. 
18b80 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20   assert( pLower 
18b90 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20 2a  || pUpper );.  *
18ba0 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75  pRangeDiv = (dou
18bb0 62 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 4c 6f  ble)1;.  if( pLo
18bc0 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e  wer && (pLower->
18bd0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
18be0 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70 52 61 6e  NULL)==0 ) *pRan
18bf0 67 65 44 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65  geDiv *= (double
18c00 29 34 3b 0a 20 20 69 66 28 20 70 55 70 70 65 72  )4;.  if( pUpper
18c10 20 29 20 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d   ) *pRangeDiv *=
18c20 20 28 64 6f 75 62 6c 65 29 34 3b 0a 20 20 72 65   (double)4;.  re
18c30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
18c40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18c50 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT3./*.** Est
18c60 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
18c70 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
18c80 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
18c90 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
18ca0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
18cb0 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
18cc0 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
18cd0 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
18ce0 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
18cf0 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
18d00 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
18d10 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
18d20 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
18d30 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
18d40 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
18d50 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
18d60 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
18d70 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
18d80 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
18d90 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
18da0 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
18db0 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
18dc0 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
18dd0 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
18de0 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
18df0 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
18e00 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
18e10 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
18e20 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
18e30 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
18e40 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
18e50 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
18e60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
18e70 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
18e80 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
18e90 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
18ea0 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
18eb0 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
18ec0 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
18ed0 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
18ee0 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
18ef0 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
18f00 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
18f10 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
18f20 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
18f30 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
18f40 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
18f50 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
18f60 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
18f70 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18f80 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
18f90 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
18fa0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
18fb0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
18fc0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
18fd0 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  se left-most col
18fe0 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a  umn is pTerm */.
18ff0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
19000 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
19010 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
19020 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
19030 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 64 6f  nstraint */.  do
19040 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20 20  uble *pnRow     
19050 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
19060 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
19070 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
19080 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
19090 2a 70 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56  *pRhs = 0;  /* V
190a0 41 4c 55 45 20 6f 6e 20 72 69 67 68 74 2d 68 61  ALUE on right-ha
190b0 6e 64 20 73 69 64 65 20 6f 66 20 70 54 65 72 6d  nd side of pTerm
190c0 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20 20 20   */.  u8 aff;   
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  /* Column affini
190f0 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ty */.  int rc; 
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
19120 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
19130 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20    tRowcnt a[2]; 
19140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19150 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20  tatistics */..  
19160 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
19170 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
19180 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  t( p->nSample>0 
19190 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  );.  aff = p->pT
191a0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
191b0 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e  Column[0]].affin
191c0 69 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ity;.  if( pExpr
191d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c   ){.    rc = val
191e0 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
191f0 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26  e, pExpr, aff, &
19200 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 72  pRhs);.    if( r
19210 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71  c ) goto whereEq
19220 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65  ualScanEst_cance
19230 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
19240 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56 61  pRhs = sqlite3Va
19250 6c 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e 64  lueNew(pParse->d
19260 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52  b);.  }.  if( pR
19270 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  hs==0 ) return S
19280 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
19290 20 20 72 63 20 3d 20 77 68 65 72 65 4b 65 79 53    rc = whereKeyS
192a0 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
192b0 70 52 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69  pRhs, 0, a);.  i
192c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
192d0 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
192e0 43 45 28 28 22 65 71 75 61 6c 69 74 79 20 73 63  CE(("equality sc
192f0 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
19300 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  ", (int)a[1]));.
19310 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31      *pnRow = a[1
19320 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45 71 75 61  ];.  }.whereEqua
19330 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a  lScanEst_cancel:
19340 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
19350 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74  ree(pRhs);.  ret
19360 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
19370 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
19380 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
19390 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
193a0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
193b0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
193c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
193d0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
193e0 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
193f0 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
19400 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
19410 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
19420 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
19430 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
19440 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
19450 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
19460 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
19470 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
19480 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
19490 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
194a0 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
194b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
194c0 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
194d0 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
194e0 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
194f0 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
19500 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
19510 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19520 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
19530 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
19540 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
19550 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
19560 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
19570 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
19580 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
19590 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
195a0 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
195b0 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
195c0 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
195d0 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
195e0 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
195f0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
19600 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
19610 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  nScanEst(.  Pars
19620 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19630 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
19640 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
19650 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
19660 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
19670 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
19680 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  se left-most col
19690 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a  umn is pTerm */.
196a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
196b0 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
196c0 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
196d0 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
196e0 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
196f0 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20    double *pnRow 
19700 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
19710 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
19720 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
19730 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
19740 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
19750 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
19760 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
19770 20 20 64 6f 75 62 6c 65 20 6e 45 73 74 3b 20 20    double nEst;  
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19790 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
197a0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
197b0 6d 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52  m */.  double nR
197c0 6f 77 45 73 74 20 3d 20 28 64 6f 75 62 6c 65 29  owEst = (double)
197d0 30 3b 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61  0; /* New estima
197e0 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
197f0 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e   of rows */.  in
19800 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
19810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
19820 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
19830 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
19840 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  le!=0 );.  for(i
19850 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
19860 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  K && i<pList->nE
19870 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  xpr; i++){.    n
19880 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  Est = p->aiRowEs
19890 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77  t[0];.    rc = w
198a0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
198b0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 69 73  (pParse, p, pLis
198c0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
198d0 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
198e0 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a  st += nEst;.  }.
198f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19900 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
19910 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f  RowEst > p->aiRo
19920 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73  wEst[0] ) nRowEs
19930 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
19940 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  0];.    *pnRow =
19950 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
19960 45 52 45 54 52 41 43 45 28 28 22 49 4e 20 72 6f  ERETRACE(("IN ro
19970 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
19980 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %g\n", nRowEst))
19990 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
199a0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64  c;.}.#endif /* d
199b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
199c0 41 42 4c 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a  ABLE_STAT3) */..
199d0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
199e0 65 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 43 6f  ee if column iCo
199f0 6c 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  l of the table w
19a00 69 74 68 20 63 75 72 73 6f 72 20 69 54 61 62 20  ith cursor iTab 
19a10 77 69 6c 6c 20 61 70 70 65 61 72 0a 2a 2a 20 69  will appear.** i
19a20 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 61  n sorted order a
19a30 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
19a40 63 75 72 72 65 6e 74 20 71 75 65 72 79 20 70 6c  current query pl
19a50 61 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  an..**.** Return
19a60 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
19a70 20 20 30 20 20 20 69 43 6f 6c 20 69 73 20 6e 6f    0   iCol is no
19a80 74 20 6f 72 64 65 72 65 64 0a 2a 2a 20 20 20 20  t ordered.**    
19a90 31 20 20 20 69 43 6f 6c 20 68 61 73 20 6f 6e 6c  1   iCol has onl
19aa0 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65  y a single value
19ab0 0a 2a 2a 20 20 20 20 32 20 20 20 69 43 6f 6c 20  .**    2   iCol 
19ac0 69 73 20 69 6e 20 41 53 43 20 6f 72 64 65 72 0a  is in ASC order.
19ad0 2a 2a 20 20 20 20 33 20 20 20 69 43 6f 6c 20 69  **    3   iCol i
19ae0 73 20 69 6e 20 44 45 53 43 20 6f 72 64 65 72 0a  s in DESC order.
19af0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
19b00 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28 0a 20  OrderedColumn(. 
19b10 20 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70   WhereBestIdx *p
19b20 2c 0a 20 20 69 6e 74 20 69 54 61 62 2c 0a 20 20  ,.  int iTab,.  
19b30 69 6e 74 20 69 43 6f 6c 0a 29 7b 0a 20 20 69 6e  int iCol.){.  in
19b40 74 20 69 2c 20 6a 3b 0a 20 20 57 68 65 72 65 4c  t i, j;.  WhereL
19b50 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26  evel *pLevel = &
19b60 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31  p->aLevel[p->i-1
19b70 5d 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ];.  Index *pIdx
19b80 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72  ;.  u8 sortOrder
19b90 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 69 2d 31  ;.  for(i=p->i-1
19ba0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4c 65  ; i>=0; i--, pLe
19bb0 76 65 6c 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  vel--){.    if( 
19bc0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 21  pLevel->iTabCur!
19bd0 3d 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  =iTab ) continue
19be0 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  ;.    if( (pLeve
19bf0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
19c00 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51  & WHERE_ALL_UNIQ
19c10 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  UE)!=0 ){.      
19c20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
19c30 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 65      assert( (pLe
19c40 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
19c50 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 45  s & WHERE_ORDERE
19c60 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  D)!=0 );.    if(
19c70 20 28 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d   (pIdx = pLevel-
19c80 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 29 21 3d 30  >plan.u.pIdx)!=0
19c90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43   ){.      if( iC
19ca0 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
19cb0 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  sortOrder = 0;. 
19cc0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19cd0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
19ce0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
19cf0 45 56 45 52 53 45 29 21 3d 30 20 29 3b 0a 20 20  EVERSE)!=0 );.  
19d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19d10 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 64 78 2d     int n = pIdx-
19d20 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
19d30 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
19d40 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
19d50 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e  if( iCol==pIdx->
19d60 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 20 62 72  aiColumn[j] ) br
19d70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
19d80 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 6e 20         if( j>=n 
19d90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
19da0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
19db0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
19dc0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 74 65 73  [j];.        tes
19dd0 74 63 61 73 65 28 20 28 70 4c 65 76 65 6c 2d 3e  tcase( (pLevel->
19de0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
19df0 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
19e00 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
19e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
19e20 20 69 43 6f 6c 21 3d 28 2d 31 29 20 29 20 72 65   iCol!=(-1) ) re
19e30 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 73 6f  turn 0;.      so
19e40 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20  rtOrder = 0;.   
19e50 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 4c     testcase( (pL
19e60 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
19e70 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52  gs & WHERE_REVER
19e80 53 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  SE)!=0 );.    }.
19e90 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
19ea0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
19eb0 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d  WHERE_REVERSE)!=
19ec0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
19ed0 74 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20  t( sortOrder==0 
19ee0 7c 7c 20 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20  || sortOrder==1 
19ef0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19f00 65 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20  e( sortOrder==1 
19f10 29 3b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64  );.      sortOrd
19f20 65 72 20 3d 20 31 20 2d 20 73 6f 72 74 4f 72 64  er = 1 - sortOrd
19f30 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  er;.    }.    re
19f40 74 75 72 6e 20 73 6f 72 74 4f 72 64 65 72 2b 32  turn sortOrder+2
19f50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
19f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19f70 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20  routine decides 
19f80 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75  if pIdx can be u
19f90 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  sed to satisfy t
19fa0 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
19fb0 6c 61 75 73 65 2c 20 65 69 74 68 65 72 20 69 6e  lause, either in
19fc0 20 77 68 6f 6c 65 20 6f 72 20 69 6e 20 70 61 72   whole or in par
19fd0 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  t.  The return v
19fe0 61 6c 75 65 20 69 73 20 74 68 65 20 0a 2a 2a 20  alue is the .** 
19ff0 63 75 6d 75 6c 61 74 69 76 65 20 6e 75 6d 62 65  cumulative numbe
1a000 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
1a010 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1a020 65 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73  e that are satis
1a030 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 69  fied.** by the i
1a040 6e 64 65 78 20 70 49 64 78 20 61 6e 64 20 6f 74  ndex pIdx and ot
1a050 68 65 72 20 69 6e 64 69 63 65 73 20 69 6e 20 6f  her indices in o
1a060 75 74 65 72 20 6c 6f 6f 70 73 2e 0a 2a 2a 0a 2a  uter loops..**.*
1a070 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
1a080 67 20 71 75 65 72 69 65 64 20 68 61 73 20 61 20  g queried has a 
1a090 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
1a0a0 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
1a0b0 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 74  s the.** index t
1a0c0 68 61 74 20 69 73 20 70 6f 73 74 75 6c 61 74 65  hat is postulate
1a0d0 64 20 66 6f 72 20 75 73 65 20 74 6f 20 61 63 63  d for use to acc
1a0e0 65 73 73 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  ess the table..*
1a0f0 2a 0a 2a 2a 20 54 68 65 20 2a 70 62 52 65 76 20  *.** The *pbRev 
1a100 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
1a110 30 20 6f 72 64 65 72 20 31 20 64 65 70 65 6e 64  0 order 1 depend
1a120 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1a130 72 20 6e 6f 74 0a 2a 2a 20 70 49 64 78 20 73 68  r not.** pIdx sh
1a140 6f 75 6c 64 20 62 65 20 72 75 6e 20 69 6e 20 74  ould be run in t
1a150 68 65 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72  he forward order
1a160 20 6f 72 20 69 6e 20 72 65 76 65 72 73 65 20 6f   or in reverse o
1a170 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1a180 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
1a190 65 78 28 0a 20 20 57 68 65 72 65 42 65 73 74 49  ex(.  WhereBestI
1a1a0 64 78 20 2a 70 2c 20 20 20 20 2f 2a 20 42 65 73  dx *p,    /* Bes
1a1b0 74 20 69 6e 64 65 78 20 73 65 61 72 63 68 20 63  t index search c
1a1c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
1a1d0 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
1a1e0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
1a1f0 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20  are testing */. 
1a200 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
1a210 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
1a220 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
1a230 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
1a240 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
1a250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
1a260 20 74 6f 20 31 20 66 6f 72 20 72 65 76 65 72 73   to 1 for revers
1a270 65 2d 6f 72 64 65 72 20 73 63 61 6e 20 6f 66 20  e-order scan of 
1a280 70 49 64 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pIdx */.){.  int
1a290 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1a2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a2b0 6d 62 65 72 20 6f 66 20 70 49 64 78 20 74 65 72  mber of pIdx ter
1a2c0 6d 73 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ms used */.  int
1a2d0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
1a2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a2f0 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
1a300 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64   terms satisfied
1a310 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
1a320 64 65 72 20 3d 20 32 3b 20 20 20 20 20 20 20 20  der = 2;        
1a330 20 20 20 20 2f 2a 20 30 3a 20 66 6f 72 77 61 72      /* 0: forwar
1a340 64 2e 20 20 31 3a 20 62 61 63 6b 77 61 72 64 2e  d.  1: backward.
1a350 20 20 32 3a 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a    2: unknown */.
1a360 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a380 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
1a390 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
1a3a0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a3b0 5f 69 74 65 6d 20 2a 70 4f 42 49 74 65 6d 3b 2f  _item *pOBItem;/
1a3c0 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
1a3d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1a3e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1a3f0 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
1a400 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 61 74     /* Table that
1a410 20 6f 77 6e 73 20 69 6e 64 65 78 20 70 49 64 78   owns index pIdx
1a420 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1a430 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
1a440 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
1a450 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1a460 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1a470 70 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 2f 2a  p->pParse;    /*
1a480 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
1a490 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1a4a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
1a4b0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1a4c0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
1a4d0 6e 74 20 6e 50 72 69 6f 72 53 61 74 3b 20 20 20  nt nPriorSat;   
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a4f0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
1a500 61 74 69 73 66 69 65 64 20 62 79 20 6f 75 74 65  atisfied by oute
1a510 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 69 6e 74  r loops */.  int
1a520 20 73 65 65 6e 52 6f 77 69 64 20 3d 20 30 3b 20   seenRowid = 0; 
1a530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1a540 75 65 20 69 66 20 61 6e 20 4f 52 44 45 52 20 42  ue if an ORDER B
1a550 59 20 72 6f 77 69 64 20 74 65 72 6d 20 69 73 20  Y rowid term is 
1a560 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 75 6e  seen */.  int un
1a570 69 71 75 65 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20  iqueNotNull;    
1a580 20 20 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20          /* pIdx 
1a590 69 73 20 55 4e 49 51 55 45 20 77 69 74 68 20 61  is UNIQUE with a
1a5a0 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 4e 4f 54  ll terms are NOT
1a5b0 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 69 66 28 20   NULL */..  if( 
1a5c0 70 2d 3e 69 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  p->i==0 ){.    n
1a5d0 50 72 69 6f 72 53 61 74 20 3d 20 30 3b 0a 20 20  PriorSat = 0;.  
1a5e0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 69 6f  }else{.    nPrio
1a5f0 72 53 61 74 20 3d 20 70 2d 3e 61 4c 65 76 65 6c  rSat = p->aLevel
1a600 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f  [p->i-1].plan.nO
1a610 42 53 61 74 3b 0a 20 20 20 20 69 66 28 20 28 70  BSat;.    if( (p
1a620 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
1a630 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1a640 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 3d 3d  WHERE_ORDERED)==
1a650 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
1a660 69 73 20 6c 6f 6f 70 20 63 61 6e 6e 6f 74 20 62  is loop cannot b
1a670 65 20 6f 72 64 65 72 65 64 20 75 6e 6c 65 73 73  e ordered unless
1a680 20 74 68 65 20 6e 65 78 74 20 6f 75 74 65 72 20   the next outer 
1a690 6c 6f 6f 70 20 69 73 0a 20 20 20 20 20 20 2a 2a  loop is.      **
1a6a0 20 61 6c 73 6f 20 6f 72 64 65 72 65 64 20 2a 2f   also ordered */
1a6b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 50  .      return nP
1a6c0 72 69 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a 20  riorSat;.    }. 
1a6d0 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74     if( Optimizat
1a6e0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
1a6f0 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
1a700 78 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  xJoin) ){.      
1a710 2f 2a 20 4f 6e 6c 79 20 6c 6f 6f 6b 20 61 74 20  /* Only look at 
1a720 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 20 6c  the outer-most l
1a730 6f 6f 70 20 69 66 20 74 68 65 20 4f 72 64 65 72  oop if the Order
1a740 42 79 49 64 78 4a 6f 69 6e 0a 20 20 20 20 20 20  ByIdxJoin.      
1a750 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
1a760 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
1a770 20 20 20 20 20 72 65 74 75 72 6e 20 6e 50 72 69       return nPri
1a780 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  orSat;.    }.  }
1a790 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
1a7a0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
1a7b0 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
1a7c0 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e   );.  if( pIdx->
1a7d0 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20  bUnordered ){.  
1a7e0 20 20 2f 2a 20 48 61 73 68 20 69 6e 64 69 63 65    /* Hash indice
1a7f0 73 20 28 69 6e 64 69 63 61 74 65 64 20 62 79 20  s (indicated by 
1a800 74 68 65 20 22 75 6e 6f 72 64 65 72 65 64 22 20  the "unordered" 
1a810 74 61 67 20 6f 6e 20 73 71 6c 69 74 65 5f 73 74  tag on sqlite_st
1a820 61 74 31 29 20 63 61 6e 6e 6f 74 0a 20 20 20 20  at1) cannot.    
1a830 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 73  ** be used for s
1a840 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65  orting */.    re
1a850 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a  turn nPriorSat;.
1a860 20 20 7d 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f    }.  nTerm = pO
1a870 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
1a880 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d   uniqueNotNull =
1a890 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
1a8a0 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 61 73 73 65 72  OE_None;.  asser
1a8b0 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20  t( nTerm>0 );.. 
1a8c0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64   /* Argument pId
1a8d0 78 20 6d 75 73 74 20 65 69 74 68 65 72 20 70 6f  x must either po
1a8e0 69 6e 74 20 74 6f 20 61 20 27 72 65 61 6c 27 20  int to a 'real' 
1a8f0 6e 61 6d 65 64 20 69 6e 64 65 78 20 73 74 72 75  named index stru
1a900 63 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20  cture, .  ** or 
1a910 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  an index structu
1a920 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  re allocated on 
1a930 74 68 65 20 73 74 61 63 6b 20 62 79 20 62 65 73  the stack by bes
1a940 74 42 74 72 65 65 49 6e 64 65 78 28 29 20 74 6f  tBtreeIndex() to
1a950 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20  .  ** represent 
1a960 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78 20  the rowid index 
1a970 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
1a980 65 76 65 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f  every table.  */
1a990 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
1a9a0 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d  >zName || (pIdx-
1a9b0 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70  >nColumn==1 && p
1a9c0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
1a9d0 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==-1) );..  /* M
1a9e0 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68  atch terms of th
1a9f0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1aa00 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e  e against column
1aa10 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e  s of.  ** the in
1aa20 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  dex..  **.  ** N
1aa30 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73  ote that indices
1aa40 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c   have pIdx->nCol
1aa50 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75  umn regular colu
1aa60 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e  mns plus.  ** on
1aa70 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  e additional col
1aa80 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  umn containing t
1aa90 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72  he rowid.  The r
1aaa0 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a  owid column.  **
1aab0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
1aac0 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f   also allowed to
1aad0 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
1aae0 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
1aaf0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
1ab00 6a 20 3d 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20  j = nPriorSat;. 
1ab10 20 66 6f 72 28 69 3d 30 2c 70 4f 42 49 74 65 6d   for(i=0,pOBItem
1ab20 3d 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a 5d  =&pOrderBy->a[j]
1ab30 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d  ; j<nTerm && i<=
1ab40 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
1ab50 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1ab60 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  OBExpr;         
1ab70 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1ab80 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  on of the ORDER 
1ab90 42 59 20 70 4f 42 49 74 65 6d 20 2a 2f 0a 20 20  BY pOBItem */.  
1aba0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1abb0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
1abc0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1abd0 6e 63 65 20 6f 66 20 70 4f 42 45 78 70 72 20 2a  nce of pOBExpr *
1abe0 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f  /.    int termSo
1abf0 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 2f 2a  rtOrder;      /*
1ac00 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20   Sort order for 
1ac10 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20  this term */.   
1ac20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
1ac30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ac40 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i-th column of t
1ac50 68 65 20 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f  he index.  -1 fo
1ac60 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  r rowid */.    i
1ac70 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 3b 20 20  nt iSortOrder;  
1ac80 20 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20         /* 1 for 
1ac90 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20  DESC, 0 for ASC 
1aca0 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  on the i-th inde
1acb0 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e  x term */.    in
1acc0 74 20 69 73 45 71 3b 20 20 20 20 20 20 20 20 20  t isEq;         
1acd0 20 20 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74        /* Subject
1ace0 20 74 6f 20 61 6e 20 3d 3d 20 6f 72 20 49 53 20   to an == or IS 
1acf0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
1ad00 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 61 74  */.    int isMat
1ad10 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ch;            /
1ad20 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  * ORDER BY term 
1ad30 6d 61 74 63 68 65 73 20 74 68 65 20 69 6e 64 65  matches the inde
1ad40 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f  x term */.    co
1ad50 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
1ad60 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1ad70 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1ad80 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64  nce for i-th ind
1ad90 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 57  ex term */.    W
1ada0 68 65 72 65 54 65 72 6d 20 2a 70 43 6f 6e 73 74  hereTerm *pConst
1adb0 72 61 69 6e 74 3b 20 2f 2a 20 41 20 63 6f 6e 73  raint; /* A cons
1adc0 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 57 48  traint in the WH
1add0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20  ERE clause */.. 
1ade0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 78     /* If the nex
1adf0 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  t term of the OR
1ae00 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 72 65  DER BY clause re
1ae10 66 65 72 73 20 74 6f 20 61 6e 79 74 68 69 6e 67  fers to anything
1ae20 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 20 20   other than.    
1ae30 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
1ae40 68 65 20 22 62 61 73 65 22 20 74 61 62 6c 65 2c  he "base" table,
1ae50 20 74 68 65 6e 20 74 68 69 73 20 69 6e 64 65 78   then this index
1ae60 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6f 66 20   will not be of 
1ae70 61 6e 79 0a 20 20 20 20 2a 2a 20 66 75 72 74 68  any.    ** furth
1ae80 65 72 20 75 73 65 20 69 6e 20 68 61 6e 64 6c 69  er use in handli
1ae90 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  ng the ORDER BY.
1aea0 20 2a 2f 0a 20 20 20 20 70 4f 42 45 78 70 72 20   */.    pOBExpr 
1aeb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1aec0 70 43 6f 6c 6c 61 74 65 28 70 4f 42 49 74 65 6d  pCollate(pOBItem
1aed0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ->pExpr);.    if
1aee0 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
1aef0 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 4f 42 45  K_COLUMN || pOBE
1af00 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73  xpr->iTable!=bas
1af10 65 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  e ){.      break
1af20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1af30 46 69 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  Find column numb
1af40 65 72 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  er and collating
1af50 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
1af60 65 20 6e 65 78 74 20 65 6e 74 72 79 0a 20 20 20  e next entry.   
1af70 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
1af80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
1af90 2d 3e 7a 4e 61 6d 65 20 26 26 20 69 3c 70 49 64  ->zName && i<pId
1afa0 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
1afb0 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
1afc0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
1afd0 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75  .      if( iColu
1afe0 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65  mn==pIdx->pTable
1aff0 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
1b000 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
1b010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b020 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78  SortOrder = pIdx
1b030 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
1b040 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
1b050 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
1b060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43        assert( zC
1b070 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 7d 65  oll!=0 );.    }e
1b080 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  lse{.      iColu
1b090 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  mn = -1;.      i
1b0a0 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  SortOrder = 0;. 
1b0b0 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a       zColl = 0;.
1b0c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
1b0d0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1b0e0 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
1b0f0 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
1b100 71 75 65 6e 63 65 20 6f 66 20 74 68 65 0a 20 20  quence of the.  
1b110 20 20 2a 2a 20 69 6e 64 65 78 20 6d 61 74 63 68    ** index match
1b120 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
1b130 65 72 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  er and collating
1b140 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65   sequence of the
1b150 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a   ORDER BY.    **
1b160 20 63 6c 61 75 73 65 20 65 6e 74 72 79 2e 20 20   clause entry.  
1b170 53 65 74 20 69 73 4d 61 74 63 68 20 74 6f 20 31  Set isMatch to 1
1b180 20 69 66 20 74 68 65 79 20 62 6f 74 68 20 6d 61   if they both ma
1b190 74 63 68 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tch. */.    if( 
1b1a0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
1b1b0 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
1b1c0 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a     if( zColl ){.
1b1d0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1b1e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1b1f0 65 71 28 70 50 61 72 73 65 2c 20 70 4f 42 49 74  eq(pParse, pOBIt
1b200 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
1b210 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1b220 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
1b230 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
1b240 69 73 4d 61 74 63 68 20 3d 20 73 71 6c 69 74 65  isMatch = sqlite
1b250 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
1b260 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 3d 3d 30  zName, zColl)==0
1b270 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b280 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
1b290 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1b2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 73 4d  }else{.      isM
1b2b0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  atch = 0;.    }.
1b2c0 0a 20 20 20 20 2f 2a 20 74 65 72 6d 53 6f 72 74  .    /* termSort
1b2d0 4f 72 64 65 72 20 69 73 20 30 20 6f 72 20 31 20  Order is 0 or 1 
1b2e0 66 6f 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  for whether or n
1b2f0 6f 74 20 74 68 65 20 61 63 63 65 73 73 20 6c 6f  ot the access lo
1b300 6f 70 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a  op should.    **
1b310 20 72 75 6e 20 66 6f 72 77 61 72 64 20 6f 72 20   run forward or 
1b320 62 61 63 6b 77 61 72 64 73 20 28 72 65 73 70 65  backwards (respe
1b330 63 74 69 76 65 6c 79 29 20 69 6e 20 6f 72 64 65  ctively) in orde
1b340 72 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 69  r to satisfy thi
1b350 73 20 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20 6f  s .    ** term o
1b360 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1b370 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 61 73  lause. */.    as
1b380 73 65 72 74 28 20 70 4f 42 49 74 65 6d 2d 3e 73  sert( pOBItem->s
1b390 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70  ortOrder==0 || p
1b3a0 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  OBItem->sortOrde
1b3b0 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  r==1 );.    asse
1b3c0 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d  rt( iSortOrder==
1b3d0 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d  0 || iSortOrder=
1b3e0 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f  =1 );.    termSo
1b3f0 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f  rtOrder = iSortO
1b400 72 64 65 72 20 5e 20 70 4f 42 49 74 65 6d 2d 3e  rder ^ pOBItem->
1b410 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20  sortOrder;..    
1b420 2f 2a 20 49 66 20 58 20 69 73 20 74 68 65 20 63  /* If X is the c
1b430 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64  olumn in the ind
1b440 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  ex and ORDER BY 
1b450 63 6c 61 75 73 65 2c 20 63 68 65 63 6b 20 74 6f  clause, check to
1b460 20 73 65 65 0a 20 20 20 20 2a 2a 20 69 66 20 74   see.    ** if t
1b470 68 65 72 65 20 61 72 65 20 61 6e 79 20 58 3d 20  here are any X= 
1b480 6f 72 20 58 20 49 53 20 4e 55 4c 4c 20 63 6f 6e  or X IS NULL con
1b490 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
1b4a0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 2a 2f  WHERE clause. */
1b4b0 0a 20 20 20 20 70 43 6f 6e 73 74 72 61 69 6e 74  .    pConstraint
1b4c0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 2d 3e 70   = findTerm(p->p
1b4d0 57 43 2c 20 62 61 73 65 2c 20 69 43 6f 6c 75 6d  WC, base, iColum
1b4e0 6e 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 0a  n, p->notReady,.
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 20 20 20 20 20 20 20 20 20 20 57 4f 5f 45 51             WO_EQ
1b510 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  |WO_ISNULL|WO_IN
1b520 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , pIdx);.    if(
1b530 20 70 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20   pConstraint==0 
1b540 29 7b 0a 20 20 20 20 20 20 69 73 45 71 20 3d 20  ){.      isEq = 
1b550 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1b560 20 28 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 65   (pConstraint->e
1b570 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1b580 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73  )!=0 ){.      is
1b590 45 71 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Eq = 0;.    }els
1b5a0 65 20 69 66 28 20 28 70 43 6f 6e 73 74 72 61 69  e if( (pConstrai
1b5b0 6e 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nt->eOperator & 
1b5c0 57 4f 5f 49 53 4e 55 4c 4c 29 21 3d 30 20 29 7b  WO_ISNULL)!=0 ){
1b5d0 0a 20 20 20 20 20 20 75 6e 69 71 75 65 4e 6f 74  .      uniqueNot
1b5e0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Null = 0;.      
1b5f0 69 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 22 58  isEq = 1;  /* "X
1b600 20 49 53 20 4e 55 4c 4c 22 20 6d 65 61 6e 73 20   IS NULL" means 
1b610 58 20 68 61 73 20 6f 6e 6c 79 20 61 20 73 69 6e  X has only a sin
1b620 67 6c 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  gle value */.   
1b630 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e 73   }else if( pCons
1b640 74 72 61 69 6e 74 2d 3e 70 72 65 72 65 71 52 69  traint->prereqRi
1b650 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
1b660 69 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 43 6f  isEq = 1;  /* Co
1b670 6e 73 74 72 61 69 6e 74 20 22 58 3d 63 6f 6e 73  nstraint "X=cons
1b680 74 61 6e 74 22 20 6d 65 61 6e 73 20 58 20 68 61  tant" means X ha
1b690 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
1b6a0 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 7d 65 6c  value */.    }el
1b6b0 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1b6c0 70 52 69 67 68 74 20 3d 20 70 43 6f 6e 73 74 72  pRight = pConstr
1b6d0 61 69 6e 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69  aint->pExpr->pRi
1b6e0 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ght;.      if( p
1b6f0 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
1b700 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
1b710 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20 20  WHERETRACE(("   
1b720 20 20 20 20 2e 2e 20 69 73 4f 72 64 65 72 65 64      .. isOrdered
1b730 43 6f 6c 75 6d 6e 28 74 61 62 3d 25 64 2c 63 6f  Column(tab=%d,co
1b740 6c 3d 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20  l=%d)",.        
1b750 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
1b760 68 74 2d 3e 69 54 61 62 6c 65 2c 20 70 52 69 67  ht->iTable, pRig
1b770 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 29 3b 0a 20  ht->iColumn));. 
1b780 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 69 73         isEq = is
1b790 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28 70 2c  OrderedColumn(p,
1b7a0 20 70 52 69 67 68 74 2d 3e 69 54 61 62 6c 65 2c   pRight->iTable,
1b7b0 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
1b7c0 29 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  );.        WHERE
1b7d0 54 52 41 43 45 28 28 22 20 2d 3e 20 69 73 45 71  TRACE((" -> isEq
1b7e0 3d 25 64 5c 6e 22 2c 20 69 73 45 71 29 29 3b 0a  =%d\n", isEq));.
1b7f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
1b800 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
1b810 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 59   of the form X=Y
1b820 20 77 68 65 72 65 20 59 20 69 73 20 61 6e 20 6f   where Y is an o
1b830 72 64 65 72 65 64 20 76 61 6c 75 65 0a 20 20 20  rdered value.   
1b840 20 20 20 20 20 2a 2a 20 69 6e 20 61 6e 20 6f 75       ** in an ou
1b850 74 65 72 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 6d  ter loop, then m
1b860 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72  ake sure the sor
1b870 74 20 6f 72 64 65 72 20 6f 66 20 59 20 6d 61 74  t order of Y mat
1b880 63 68 65 73 20 74 68 65 0a 20 20 20 20 20 20 20  ches the.       
1b890 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 20 72   ** sort order r
1b8a0 65 71 75 69 72 65 64 20 66 6f 72 20 58 2e 20 2a  equired for X. *
1b8b0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  /.        if( is
1b8c0 4d 61 74 63 68 20 26 26 20 69 73 45 71 3e 3d 32  Match && isEq>=2
1b8d0 20 26 26 20 69 73 45 71 21 3d 70 4f 42 49 74 65   && isEq!=pOBIte
1b8e0 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 2b 32 20 29  m->sortOrder+2 )
1b8f0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
1b900 63 61 73 65 28 20 69 73 45 71 3d 3d 32 20 29 3b  case( isEq==2 );
1b910 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
1b920 61 73 65 28 20 69 73 45 71 3d 3d 33 20 29 3b 0a  ase( isEq==3 );.
1b930 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1b940 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b960 69 73 45 71 20 3d 20 30 3b 20 20 2f 2a 20 22 58  isEq = 0;  /* "X
1b970 3d 65 78 70 72 22 20 70 6c 61 63 65 73 20 6e 6f  =expr" places no
1b980 20 6f 72 64 65 72 69 6e 67 20 63 6f 6e 73 74 72   ordering constr
1b990 61 69 6e 74 73 20 6f 6e 20 58 20 2a 2f 0a 20 20  aints on X */.  
1b9a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b9b0 69 66 28 20 21 69 73 4d 61 74 63 68 20 29 7b 0a  if( !isMatch ){.
1b9c0 20 20 20 20 20 20 69 66 28 20 69 73 45 71 3d 3d        if( isEq==
1b9d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
1b9e0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
1b9f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
1ba00 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
1ba10 65 6c 73 65 20 69 66 28 20 69 73 45 71 21 3d 31  else if( isEq!=1
1ba20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 6f   ){.      if( so
1ba30 72 74 4f 72 64 65 72 3d 3d 32 20 29 7b 0a 20 20  rtOrder==2 ){.  
1ba40 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
1ba50 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b  = termSortOrder;
1ba60 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1ba70 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d   termSortOrder!=
1ba80 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  sortOrder ){.   
1ba90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1baa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b    }.    }.    j+
1bab0 2b 3b 0a 20 20 20 20 70 4f 42 49 74 65 6d 2b 2b  +;.    pOBItem++
1bac0 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d  ;.    if( iColum
1bad0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 65 65  n<0 ){.      see
1bae0 6e 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20  nRowid = 1;.    
1baf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
1bb00 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f  se if( pTab->aCo
1bb10 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  l[iColumn].notNu
1bb20 6c 6c 3d 3d 30 20 26 26 20 69 73 45 71 21 3d 31  ll==0 && isEq!=1
1bb30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
1bb40 73 65 28 20 69 73 45 71 3d 3d 30 20 29 3b 0a 20  se( isEq==0 );. 
1bb50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1bb60 73 45 71 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20  sEq==2 );.      
1bb70 74 65 73 74 63 61 73 65 28 20 69 73 45 71 3d 3d  testcase( isEq==
1bb80 33 20 29 3b 0a 20 20 20 20 20 20 75 6e 69 71 75  3 );.      uniqu
1bb90 65 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  eNotNull = 0;.  
1bba0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1bbb0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 66 6f 75   we have not fou
1bbc0 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  nd at least one 
1bbd0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68  ORDER BY term th
1bbe0 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 0a 20  at matches the. 
1bbf0 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
1bc00 73 68 6f 77 20 6e 6f 20 70 72 6f 67 72 65 73 73  show no progress
1bc10 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 42 49 74  . */.  if( pOBIt
1bc20 65 6d 3d 3d 26 70 4f 72 64 65 72 42 79 2d 3e 61  em==&pOrderBy->a
1bc30 5b 6e 50 72 69 6f 72 53 61 74 5d 20 29 20 72 65  [nPriorSat] ) re
1bc40 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a  turn nPriorSat;.
1bc50 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  .  /* Return the
1bc60 20 6e 65 63 65 73 73 61 72 79 20 73 63 61 6e 20   necessary scan 
1bc70 6f 72 64 65 72 20 62 61 63 6b 20 74 6f 20 74 68  order back to th
1bc80 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 2a 70  e caller */.  *p
1bc90 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
1bca0 20 26 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   & 1;..  /* If t
1bcb0 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
1bcc0 45 52 20 42 59 20 72 6f 77 69 64 22 20 74 65 72  ER BY rowid" ter
1bcd0 6d 20 74 68 61 74 20 6d 61 74 63 68 65 64 2c 20  m that matched, 
1bce0 6f 72 20 69 74 20 69 73 20 6f 6e 6c 79 0a 20 20  or it is only.  
1bcf0 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
1bd00 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 72 6f  a single row fro
1bd10 6d 20 74 68 69 73 20 74 61 62 6c 65 20 74 6f 20  m this table to 
1bd20 6d 61 74 63 68 2c 20 74 68 65 6e 20 73 6b 69 70  match, then skip
1bd30 20 6f 76 65 72 0a 20 20 2a 2a 20 61 6e 79 20 61   over.  ** any a
1bd40 64 64 69 74 69 6f 6e 61 6c 20 4f 52 44 45 52 20  dditional ORDER 
1bd50 42 59 20 74 65 72 6d 73 20 64 65 61 6c 69 6e 67  BY terms dealing
1bd60 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
1bd70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 65 65  ..  */.  if( see
1bd80 6e 52 6f 77 69 64 20 7c 7c 20 28 75 6e 69 71 75  nRowid || (uniqu
1bd90 65 4e 6f 74 4e 75 6c 6c 20 26 26 20 69 3e 3d 70  eNotNull && i>=p
1bda0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 7b  Idx->nColumn) ){
1bdb0 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
1bdc0 6a 20 6f 76 65 72 20 61 64 64 69 74 69 6f 6e 61  j over additiona
1bdd0 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
1bde0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1bdf0 20 62 61 73 65 20 2a 2f 0a 20 20 20 20 57 68 65   base */.    Whe
1be00 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 53 20 3d  reMaskSet *pMS =
1be10 20 70 2d 3e 70 57 43 2d 3e 70 4d 61 73 6b 53 65   p->pWC->pMaskSe
1be20 74 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  t;.    Bitmask m
1be30 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 53 2c   = ~getMask(pMS,
1be40 20 62 61 73 65 29 3b 0a 20 20 20 20 77 68 69 6c   base);.    whil
1be50 65 28 20 6a 3c 6e 54 65 72 6d 20 26 26 20 28 65  e( j<nTerm && (e
1be60 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
1be70 53 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a  S, pOrderBy->a[j
1be80 5d 2e 70 45 78 70 72 29 26 6d 29 3d 3d 30 20 29  ].pExpr)&m)==0 )
1be90 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1bea0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1beb0 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  j;.}../*.** Find
1bec0 20 74 68 65 20 62 65 73 74 20 71 75 65 72 79 20   the best query 
1bed0 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69  plan for accessi
1bee0 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ng a particular 
1bef0 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74 68  table.  Write th
1bf00 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
1bf10 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
1bf20 74 20 69 6e 74 6f 20 74 68 65 20 70 2d 3e 63 6f  t into the p->co
1bf30 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f  st..**.** The lo
1bf40 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20 77  west cost plan w
1bf50 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69  ins.  The cost i
1bf60 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1bf70 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a   the amount of.*
1bf80 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49  * CPU and disk I
1bf90 2f 4f 20 6e 65 65 64 65 64 20 74 6f 20 70 72 6f  /O needed to pro
1bfa0 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74  cess the request
1bfb0 65 64 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 46 61  ed result..** Fa
1bfc0 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75  ctors that influ
1bfd0 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64  ence cost includ
1bfe0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54  e:.**.**    *  T
1bff0 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
1c000 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
1c010 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76   will be retriev
1c020 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20  ed.  (The.**    
1c030 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74     fewer the bet
1c040 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ter.).**.**    *
1c050 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
1c060 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63   sorting must oc
1c070 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  cur..**.**    * 
1c080 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
1c090 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65  there must be se
1c0a0 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69  parate lookups i
1c0b0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69  n the.**       i
1c0c0 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20  ndex and in the 
1c0d0 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  main table..**.*
1c0e0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1c0f0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
1c100 75 73 65 20 28 70 53 72 63 2d 3e 70 49 6e 64 65  use (pSrc->pInde
1c110 78 29 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  x) attached to t
1c120 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  he table in.** t
1c130 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1c140 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1c150 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64  tion only consid
1c160 65 72 73 20 70 6c 61 6e 73 20 75 73 69 6e 67 20  ers plans using 
1c170 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e  the .** named in
1c180 64 65 78 2e 20 49 66 20 6e 6f 20 73 75 63 68 20  dex. If no such 
1c190 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74  plan is found, t
1c1a0 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64  hen the returned
1c1b0 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c 49   cost is.** SQLI
1c1c0 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20 61  TE_BIG_DBL. If a
1c1d0 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 20 74   plan is found t
1c1e0 68 61 74 20 75 73 65 73 20 74 68 65 20 6e 61 6d  hat uses the nam
1c1f0 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68  ed index, .** th
1c200 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 63  en the cost is c
1c210 61 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68 65  alculated in the
1c220 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a   usual way..**.*
1c230 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45 58  * If a NOT INDEX
1c240 45 44 20 63 6c 61 75 73 65 20 77 61 73 20 61 74  ED clause was at
1c250 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61  tached to the ta
1c260 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53  ble .** in the S
1c270 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1c280 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73   then no indexes
1c290 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
1c2a0 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 2a   However, the .*
1c2b0 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 20  * selected plan 
1c2c0 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61  may still take a
1c2d0 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
1c2e0 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20 70  built-in rowid p
1c2f0 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69 6e  rimary key.** in
1c300 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
1c310 6f 69 64 20 62 65 73 74 42 74 72 65 65 49 6e 64  oid bestBtreeInd
1c320 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20  ex(WhereBestIdx 
1c330 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
1c340 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
1c350 3b 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e  ;  /* The parsin
1c360 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1c370 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
1c380 3d 20 70 2d 3e 70 57 43 3b 20 20 2f 2a 20 54 68  = p->pWC;  /* Th
1c390 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1c3a0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1c3b0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20  st_item *pSrc = 
1c3c0 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65 20  p->pSrc; /* The 
1c3d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1c3e0 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
1c3f0 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d  int iCur = pSrc-
1c400 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54  >iCursor;   /* T
1c410 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
1c420 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63   table to be acc
1c430 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  essed */.  Index
1c440 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20   *pProbe;       
1c450 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1c460 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  ex we are evalua
1c470 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ting */.  Index 
1c480 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
1c490 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
1c4a0 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72 6f   pProbe, or zero
1c4b0 20 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20 2a   for IPK index *
1c4c0 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61  /.  int eqTermMa
1c4d0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1c4e0 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b 20  /* Current mask 
1c4f0 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74  of valid equalit
1c500 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  y operators */. 
1c510 20 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d 61   int idxEqTermMa
1c520 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  sk;          /* 
1c530 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76 61  Index mask of va
1c540 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  lid equality ope
1c550 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64 65  rators */.  Inde
1c560 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20  x sPk;          
1c570 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b          /* A fak
1c580 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e index object f
1c590 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  or the primary k
1c5a0 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  ey */.  tRowcnt 
1c5b0 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
1c5c0 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
1c5d0 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  Est[] value for 
1c5e0 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
1c5f0 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50  .  int aiColumnP
1c600 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f  k = -1;        /
1c610 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20  * The aColumn[] 
1c620 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
1c630 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  k index */.  int
1c640 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20 20   wsFlagMask;    
1c650 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
1c660 77 65 64 20 66 6c 61 67 73 20 69 6e 20 70 2d 3e  wed flags in p->
1c670 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
1c680 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 69 6f 72   */.  int nPrior
1c690 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sat;            
1c6a0 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
1c6b0 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62 79  rms satisfied by
1c6c0 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   outer loops */.
1c6d0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c6f0 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
1c700 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 63   BY terms */.  c
1c710 68 61 72 20 62 53 6f 72 74 49 6e 69 74 3b 20 20  har bSortInit;  
1c720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c730 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 62 53  itializer for bS
1c740 6f 72 74 20 69 6e 20 69 6e 6e 65 72 20 6c 6f 6f  ort in inner loo
1c750 70 20 2a 2f 0a 20 20 63 68 61 72 20 62 44 69 73  p */.  char bDis
1c760 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  tInit;          
1c770 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1c780 72 20 66 6f 72 20 62 44 69 73 74 20 69 6e 20 69  r for bDist in i
1c790 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 0a 0a 20  nner loop */... 
1c7a0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1c7b0 68 65 20 63 6f 73 74 20 74 6f 20 61 20 77 6f 72  he cost to a wor
1c7c0 73 74 2d 63 61 73 65 20 76 61 6c 75 65 20 2a 2f  st-case value */
1c7d0 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 63 6f  .  memset(&p->co
1c7e0 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  st, 0, sizeof(p-
1c7f0 3e 63 6f 73 74 29 29 3b 0a 20 20 70 2d 3e 63 6f  >cost));.  p->co
1c800 73 74 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54  st.rCost = SQLIT
1c810 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a  E_BIG_DBL;..  /*
1c820 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62   If the pSrc tab
1c830 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20  le is the right 
1c840 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
1c850 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79  JOIN then we may
1c860 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e   not.  ** use an
1c870 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66   index to satisf
1c880 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  y IS NULL constr
1c890 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61  aints on that ta
1c8a0 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20  ble.  This is.  
1c8b0 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d  ** because colum
1c8c0 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ns might end up 
1c8d0 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68  being NULL if th
1c8e0 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
1c8f0 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20   match -.  ** a 
1c900 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69  circumstance whi
1c910 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  ch the index can
1c920 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63  not help us disc
1c930 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32  over.  Ticket #2
1c940 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  177..  */.  if( 
1c950 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  pSrc->jointype &
1c960 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20   JT_LEFT ){.    
1c970 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20  idxEqTermMask = 
1c980 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d  WO_EQ|WO_IN;.  }
1c990 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 45 71 54  else{.    idxEqT
1c9a0 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c  ermMask = WO_EQ|
1c9b0 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b  WO_IN|WO_ISNULL;
1c9c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72 63  .  }..  if( pSrc
1c9d0 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
1c9e0 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
1c9f0 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
1ca00 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
1ca10 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
1ca20 20 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62 65     pIdx = pProbe
1ca30 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b   = pSrc->pIndex;
1ca40 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20  .    wsFlagMask 
1ca50 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f  = ~(WHERE_ROWID_
1ca60 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
1ca70 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72  ANGE);.    eqTer
1ca80 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72  mMask = idxEqTer
1ca90 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mMask;.  }else{.
1caa0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
1cab0 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
1cac0 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20  ause.  Create a 
1cad0 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63  fake Index objec
1cae0 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a  t in local.    *
1caf0 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74  * variable sPk t
1cb00 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
1cb10 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1cb20 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74  y index.  Make t
1cb30 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20  his.    ** fake 
1cb40 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20  index the first 
1cb50 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e  in a chain of In
1cb60 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68  dex objects with
1cb70 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c   all of the real
1cb80 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  .    ** indices 
1cb90 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20  to follow */.   
1cba0 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20   Index *pFirst; 
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61   /* First of rea
1cbd0 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
1cbe0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65   table */.    me
1cbf0 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69  mset(&sPk, 0, si
1cc00 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
1cc10 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
1cc20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
1cc30 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
1cc40 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
1cc50 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
1cc60 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
1cc70 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
1cc80 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
1cc90 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20   pSrc->pTab;.   
1cca0 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
1ccb0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f   pSrc->pTab->nRo
1ccc0 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  wEst;.    aiRowE
1ccd0 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20  stPk[1] = 1;.   
1cce0 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
1ccf0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1cd00 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49    if( pSrc->notI
1cd10 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
1cd20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
1cd30 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
1cd40 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
1cd50 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
1cd60 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
1cd70 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
1cd80 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
1cd90 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1cda0 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
1cdb0 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
1cdc0 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
1cdd0 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61  Pk;.    wsFlagMa
1cde0 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20 20  sk = ~(.        
1cdf0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
1ce00 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
1ce10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
1ce20 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  L|WHERE_COLUMN_R
1ce30 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  ANGE.    );.    
1ce40 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  eqTermMask = WO_
1ce50 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49  EQ|WO_IN;.    pI
1ce60 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 6e  dx = 0;.  }..  n
1ce70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1ce80 64 65 72 42 79 20 3f 20 70 2d 3e 70 4f 72 64 65  derBy ? p->pOrde
1ce90 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  rBy->nExpr : 0;.
1cea0 20 20 69 66 28 20 70 2d 3e 69 20 29 7b 0a 20 20    if( p->i ){.  
1ceb0 20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 70 2d    nPriorSat = p-
1cec0 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e  >aLevel[p->i-1].
1ced0 70 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20 20  plan.nOBSat;.   
1cee0 20 62 53 6f 72 74 49 6e 69 74 20 3d 20 6e 50 72   bSortInit = nPr
1cef0 69 6f 72 53 61 74 3c 6e 4f 72 64 65 72 42 79 3b  iorSat<nOrderBy;
1cf00 0a 20 20 20 20 62 44 69 73 74 49 6e 69 74 20 3d  .    bDistInit =
1cf10 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1cf20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 30 3b 0a   nPriorSat = 0;.
1cf30 20 20 20 20 62 53 6f 72 74 49 6e 69 74 20 3d 20      bSortInit = 
1cf40 6e 4f 72 64 65 72 42 79 3e 30 3b 0a 20 20 20 20  nOrderBy>0;.    
1cf50 62 44 69 73 74 49 6e 69 74 20 3d 20 70 2d 3e 70  bDistInit = p->p
1cf60 44 69 73 74 69 6e 63 74 21 3d 30 3b 0a 20 20 7d  Distinct!=0;.  }
1cf70 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
1cf80 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f   all indices loo
1cf90 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73  king for the bes
1cfa0 74 20 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a  t one to use.  *
1cfb0 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65  /.  for(; pProbe
1cfc0 3b 20 70 49 64 78 3d 70 50 72 6f 62 65 3d 70 50  ; pIdx=pProbe=pP
1cfd0 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  robe->pNext){.  
1cfe0 20 20 63 6f 6e 73 74 20 74 52 6f 77 63 6e 74 20    const tRowcnt 
1cff0 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45 73 74  * const aiRowEst
1d000 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
1d010 45 73 74 3b 0a 20 20 20 20 57 68 65 72 65 43 6f  Est;.    WhereCo
1d020 73 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  st pc;          
1d030 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
1d040 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a  using pProbe */.
1d050 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 67 31 30      double log10
1d060 4e 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 20 20  N = (double)1;  
1d070 2f 2a 20 62 61 73 65 2d 31 30 20 6c 6f 67 61 72  /* base-10 logar
1d080 69 74 68 6d 20 6f 66 20 6e 52 6f 77 20 28 69 6e  ithm of nRow (in
1d090 65 78 61 63 74 29 20 2a 2f 0a 0a 20 20 20 20 2f  exact) */..    /
1d0a0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1d0b0 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 70 6f  variables are po
1d0c0 70 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  pulated based on
1d0d0 20 74 68 65 20 70 72 6f 70 65 72 74 69 65 73 20   the properties 
1d0e0 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  of.    ** index 
1d0f0 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 2e  being evaluated.
1d100 20 54 68 65 79 20 61 72 65 20 74 68 65 6e 20 75   They are then u
1d110 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
1d120 20 74 68 65 20 65 78 70 65 63 74 65 64 0a 20 20   the expected.  
1d130 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20 6e 75    ** cost and nu
1d140 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74  mber of rows ret
1d150 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  urned..    **.  
1d160 20 20 2a 2a 20 20 70 63 2e 70 6c 61 6e 2e 6e 45    **  pc.plan.nE
1d170 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75  q: .    **    Nu
1d180 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
1d190 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20   terms that can 
1d1a0 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  be implemented u
1d1b0 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 0a  sing the index..
1d1c0 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68      **    In oth
1d1d0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6e 75  er words, the nu
1d1e0 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61 6c 20  mber of initial 
1d1f0 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 69 6e  fields in the in
1d200 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  dex that.    ** 
1d210 20 20 20 61 72 65 20 75 73 65 64 20 69 6e 20 3d     are used in =
1d220 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e  = or IN or NOT N
1d230 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
1d240 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1d250 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  use..    **.    
1d260 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20  **  nInMul:  .  
1d270 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d    **    The "in-
1d280 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69  multiplier". Thi
1d290 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  s is an estimate
1d2a0 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65   of how many see
1d2b0 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20  k operations .  
1d2c0 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d    **    SQLite m
1d2d0 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74  ust perform on t
1d2e0 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73  he index in ques
1d2f0 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tion. For exampl
1d300 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
1d310 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73  *    WHERE claus
1d320 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e is:.    **.   
1d330 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61   **      WHERE a
1d340 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e   IN (1, 2, 3) AN
1d350 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29  D b IN (4, 5, 6)
1d360 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d370 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65    SQLite must pe
1d380 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20  rform 9 lookups 
1d390 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  on an index on (
1d3a0 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c  a, b), so nInMul
1d3b0 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73   is .    **    s
1d3c0 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74  et to 9. Given t
1d3d0 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61  he same schema a
1d3e0 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  nd either of the
1d3f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45   following WHERE
1d400 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75   .    **    clau
1d410 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ses:.    **.    
1d420 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
1d430 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  =  1.    **     
1d440 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20   WHERE a >= 2.  
1d450 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e    **.    **    n
1d460 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20  InMul is set to 
1d470 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  1..    **.    **
1d480 20 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69      If there exi
1d490 73 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d  sts a WHERE term
1d4a0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
1d4b0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1d4c0 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20  , then .    **  
1d4d0 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74    the sub-select
1d4e0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72   is assumed to r
1d4f0 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f  eturn 25 rows fo
1d500 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
1d510 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74  f .    **    det
1d520 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e  ermining nInMul.
1d530 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d540 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a  bInEst:  .    **
1d550 20 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20      Set to true 
1d560 69 66 20 74 68 65 72 65 20 77 61 73 20 61 74 20  if there was at 
1d570 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20  least one "x IN 
1d580 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65  (SELECT ...)" te
1d590 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20  rm used .    ** 
1d5a0 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e     in determinin
1d5b0 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  g the value of n
1d5c0 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61  InMul.  Note tha
1d5d0 74 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  t the RHS of the
1d5e0 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70  .    **    IN op
1d5f0 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 61  erator must be a
1d600 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76   SELECT, not a v
1d610 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72 20 74  alue list, for t
1d620 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20 20 20  his variable.   
1d630 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74 72 75   **    to be tru
1d640 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1d650 20 20 72 61 6e 67 65 44 69 76 3a 0a 20 20 20 20    rangeDiv:.    
1d660 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d 61 74  **    An estimat
1d670 65 20 6f 66 20 61 20 64 69 76 69 73 6f 72 20 62  e of a divisor b
1d680 79 20 77 68 69 63 68 20 74 6f 20 72 65 64 75 63  y which to reduc
1d690 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
1d6a0 63 65 20 64 75 65 0a 20 20 20 20 2a 2a 20 20 20  ce due.    **   
1d6b0 20 74 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63   to inequality c
1d6c0 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 49 6e 20  onstraints.  In 
1d6d0 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
1d6e0 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c  qlite_stat3 ANAL
1d6f0 59 5a 45 0a 20 20 20 20 2a 2a 20 20 20 20 64 61  YZE.    **    da
1d700 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65  ta, a single ine
1d710 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
1d720 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
1d730 20 74 6f 20 31 2f 34 72 64 20 69 74 73 0a 20 20   to 1/4rd its.  
1d740 20 20 2a 2a 20 20 20 20 6f 72 69 67 69 6e 61 6c    **    original
1d750 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69 76 3d   size (rangeDiv=
1d760 3d 34 29 2e 20 20 54 77 6f 20 69 6e 65 71 75 61  =4).  Two inequa
1d770 6c 69 74 69 65 73 20 72 65 64 75 63 65 20 74 68  lities reduce th
1d780 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20  e search.    ** 
1d790 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f 31 36     space to 1/16
1d7a0 74 68 20 6f 66 20 69 74 73 20 6f 72 69 67 69 6e  th of its origin
1d7b0 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69  al size (rangeDi
1d7c0 76 3d 3d 31 36 29 2e 0a 20 20 20 20 2a 2a 0a 20  v==16)..    **. 
1d7d0 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20     **  bSort:   
1d7e0 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65  .    **    Boole
1d7f0 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68 65 72  an. True if ther
1d800 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1d810 20 63 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c   clause that wil
1d820 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20  l require an .  
1d830 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c    **    external
1d840 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63 61 6e   sort (i.e. scan
1d850 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 62  ning the index b
1d860 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 77  eing evaluated w
1d870 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20  ill not .    ** 
1d880 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f 72 64     correctly ord
1d890 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20 20 20  er records)..   
1d8a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 44 69 73   **.    **  bDis
1d8b0 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f  t:.    **    Boo
1d8c0 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68  lean. True if th
1d8d0 65 72 65 20 69 73 20 61 20 44 49 53 54 49 4e 43  ere is a DISTINC
1d8e0 54 20 63 6c 61 75 73 65 20 74 68 61 74 20 77 69  T clause that wi
1d8f0 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20  ll require an . 
1d900 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61     **    externa
1d910 6c 20 62 74 72 65 65 2e 0a 20 20 20 20 2a 2a 0a  l btree..    **.
1d920 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a      **  bLookup:
1d930 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c   .    **    Bool
1d940 65 61 6e 2e 20 54 72 75 65 20 69 66 20 61 20 74  ean. True if a t
1d950 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 69 73 20 72  able lookup is r
1d960 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
1d970 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 20 20 20   index entry.   
1d980 20 2a 2a 20 20 20 20 76 69 73 69 74 65 64 2e 20   **    visited. 
1d990 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1d9a0 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
1d9b0 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e 67 20   not a covering 
1d9c0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20 20  index..    **   
1d9d0 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
1d9e0 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 72 6f  false for the ro
1d9f0 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
1da00 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65  index of a table
1da10 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f 72 20  ..    **    For 
1da20 6f 74 68 65 72 20 69 6e 64 65 78 65 73 2c 20 69  other indexes, i
1da30 74 20 69 73 20 74 72 75 65 20 75 6e 6c 65 73 73  t is true unless
1da40 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 73   all the columns
1da50 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   of the table.  
1da60 20 20 2a 2a 20 20 20 20 75 73 65 64 20 62 79 20    **    used by 
1da70 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1da80 6d 65 6e 74 20 61 72 65 20 70 72 65 73 65 6e 74  ment are present
1da90 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 28 73   in the index (s
1daa0 75 63 68 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  uch an.    **   
1dab0 20 69 6e 64 65 78 20 69 73 20 73 6f 6d 65 74 69   index is someti
1dac0 6d 65 73 20 64 65 73 63 72 69 62 65 64 20 61 73  mes described as
1dad0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1dae0 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f  x)..    **    Fo
1daf0 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e  r example, given
1db00 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 28 61   the index on (a
1db10 2c 20 62 29 2c 20 74 68 65 20 73 65 63 6f 6e 64  , b), the second
1db20 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1db30 67 20 0a 20 20 20 20 2a 2a 20 20 20 20 74 77 6f  g .    **    two
1db40 20 71 75 65 72 69 65 73 20 72 65 71 75 69 72 65   queries require
1db50 73 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6c  s table b-tree l
1db60 6f 6f 6b 75 70 73 20 69 6e 20 6f 72 64 65 72 20  ookups in order 
1db70 74 6f 20 66 69 6e 64 20 74 68 65 20 76 61 6c 75  to find the valu
1db80 65 0a 20 20 20 20 2a 2a 20 20 20 20 6f 66 20 63  e.    **    of c
1db90 6f 6c 75 6d 6e 20 63 2c 20 62 75 74 20 74 68 65  olumn c, but the
1dba0 20 66 69 72 73 74 20 64 6f 65 73 20 6e 6f 74 20   first does not 
1dbb0 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20  because columns 
1dbc0 61 20 61 6e 64 20 62 20 61 72 65 0a 20 20 20 20  a and b are.    
1dbd0 2a 2a 20 20 20 20 62 6f 74 68 20 61 76 61 69 6c  **    both avail
1dbe0 61 62 6c 65 20 69 6e 20 74 68 65 20 69 6e 64 65  able in the inde
1dbf0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c               SEL
1dc10 45 43 54 20 61 2c 20 62 20 20 20 20 46 52 4f 4d  ECT a, b    FROM
1dc20 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31   tbl WHERE a = 1
1dc30 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ;.    **        
1dc40 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62       SELECT a, b
1dc50 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57 48 45  , c FROM tbl WHE
1dc60 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2f  RE a = 1;.    */
1dc70 0a 20 20 20 20 69 6e 74 20 62 49 6e 45 73 74 20  .    int bInEst 
1dc80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1dc90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 78     /* True if "x
1dca0 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22   IN (SELECT...)"
1dcb0 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   seen */.    int
1dcc0 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b 20 20 20 20   nInMul = 1;    
1dcd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dce0 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74  mber of distinct
1dcf0 20 65 71 75 61 6c 69 74 69 65 73 20 74 6f 20 6c   equalities to l
1dd00 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 64 6f 75  ookup */.    dou
1dd10 62 6c 65 20 72 61 6e 67 65 44 69 76 20 3d 20 28  ble rangeDiv = (
1dd20 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a 20 45 73  double)1;  /* Es
1dd30 74 69 6d 61 74 65 64 20 72 65 64 75 63 74 69 6f  timated reductio
1dd40 6e 20 69 6e 20 73 65 61 72 63 68 20 73 70 61 63  n in search spac
1dd50 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 6f  e */.    int nBo
1dd60 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  und = 0;        
1dd70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1dd80 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
1dd90 61 69 6e 74 73 20 73 65 65 6e 20 2a 2f 0a 20 20  aints seen */.  
1dda0 20 20 63 68 61 72 20 62 53 6f 72 74 20 3d 20 62    char bSort = b
1ddb0 53 6f 72 74 49 6e 69 74 3b 20 20 20 20 20 20 20  SortInit;       
1ddc0 2f 2a 20 54 72 75 65 20 69 66 20 65 78 74 65 72  /* True if exter
1ddd0 6e 61 6c 20 73 6f 72 74 20 72 65 71 75 69 72 65  nal sort require
1dde0 64 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62 44  d */.    char bD
1ddf0 69 73 74 20 3d 20 62 44 69 73 74 49 6e 69 74 3b  ist = bDistInit;
1de00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1de10 66 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68  f index cannot h
1de20 65 6c 70 20 77 69 74 68 20 44 49 53 54 49 4e 43  elp with DISTINC
1de30 54 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62 4c  T */.    char bL
1de40 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20 20 20 20  ookup = 0;      
1de50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1de60 66 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e 67  f not a covering
1de70 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 57 68   index */.    Wh
1de80 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1de90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1dea0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
1deb0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1dec0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1ded0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
1dee0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 46     WhereTerm *pF
1def0 69 72 73 74 54 65 72 6d 20 3d 20 30 3b 20 20 20  irstTerm = 0;   
1df00 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6d   /* First term m
1df10 61 74 63 68 69 6e 67 20 74 68 65 20 69 6e 64 65  atching the inde
1df20 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20  x */.#endif..   
1df30 20 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20   WHERETRACE((.  
1df40 20 20 20 20 22 20 20 20 25 73 28 25 73 29 3a 5c      "   %s(%s):\
1df50 6e 22 2c 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  n",.      pSrc->
1df60 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49  pTab->zName, (pI
1df70 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  dx ? pIdx->zName
1df80 20 3a 20 22 69 70 6b 22 29 0a 20 20 20 20 29 29   : "ipk").    ))
1df90 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 63  ;.    memset(&pc
1dfa0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 63 29 29  , 0, sizeof(pc))
1dfb0 3b 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f  ;.    pc.plan.nO
1dfc0 42 53 61 74 20 3d 20 6e 50 72 69 6f 72 53 61 74  BSat = nPriorSat
1dfd0 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  ;..    /* Determ
1dfe0 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ine the values o
1dff0 66 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 20 61 6e  f pc.plan.nEq an
1e000 64 20 6e 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20  d nInMul */.    
1e010 66 6f 72 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d  for(pc.plan.nEq=
1e020 30 3b 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3c 70  0; pc.plan.nEq<p
1e030 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Probe->nColumn; 
1e040 70 63 2e 70 6c 61 6e 2e 6e 45 71 2b 2b 29 7b 0a  pc.plan.nEq++){.
1e050 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
1e060 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  robe->aiColumn[p
1e070 63 2e 70 6c 61 6e 2e 6e 45 71 5d 3b 0a 20 20 20  c.plan.nEq];.   
1e080 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
1e090 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
1e0a0 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 65  , p->notReady, e
1e0b0 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29  qTermMask, pIdx)
1e0c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1e0d0 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
1e0e0 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
1e0f0 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f  ags |= (WHERE_CO
1e100 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f  LUMN_EQ|WHERE_RO
1e110 57 49 44 5f 45 51 29 3b 0a 20 20 20 20 20 20 74  WID_EQ);.      t
1e120 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1e130 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20 20  pWC!=pWC );.    
1e140 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
1e150 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1e160 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1e170 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
1e180 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 63  Expr;.        pc
1e190 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
1e1a0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
1e1b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
1e1c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e1d0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1e1e0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
1e1f0 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
1e200 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d 65 20   ...)":  Assume 
1e210 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72  the SELECT retur
1e220 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
1e230 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a          nInMul *
1e240 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 20 20  = 25;.          
1e250 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20 20 20  bInEst = 1;.    
1e260 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
1e270 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
1e280 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
1e290 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
1e2a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 78  .          /* "x
1e2b0 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
1e2c0 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20  e, ...)" */.    
1e2d0 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20        nInMul *= 
1e2e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1e2f0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  nExpr;.        }
1e300 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e310 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1e320 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  r & WO_ISNULL ){
1e330 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  .        pc.plan
1e340 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1e350 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
1e360 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
1e370 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1e380 33 0a 20 20 20 20 20 20 69 66 28 20 70 63 2e 70  3.      if( pc.p
1e390 6c 61 6e 2e 6e 45 71 3d 3d 30 20 26 26 20 70 50  lan.nEq==0 && pP
1e3a0 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65 20 29 20  robe->aSample ) 
1e3b0 70 46 69 72 73 74 54 65 72 6d 20 3d 20 70 54 65  pFirstTerm = pTe
1e3c0 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  rm;.#endif.     
1e3d0 20 70 63 2e 75 73 65 64 20 7c 3d 20 70 54 65 72   pc.used |= pTer
1e3e0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1e3f0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 49      }. .    /* I
1e400 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  f the index bein
1e410 67 20 63 6f 6e 73 69 64 65 72 65 64 20 69 73 20  g considered is 
1e420 55 4e 49 51 55 45 2c 20 61 6e 64 20 74 68 65 72  UNIQUE, and ther
1e430 65 20 69 73 20 61 6e 20 65 71 75 61 6c 69 74 79  e is an equality
1e440 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61   .    ** constra
1e450 69 6e 74 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75  int for all colu
1e460 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
1e470 2c 20 74 68 65 6e 20 74 68 69 73 20 73 65 61 72  , then this sear
1e480 63 68 20 77 69 6c 6c 20 66 69 6e 64 0a 20 20 20  ch will find.   
1e490 20 2a 2a 20 61 74 20 6d 6f 73 74 20 61 20 73 69   ** at most a si
1e4a0 6e 67 6c 65 20 72 6f 77 2e 20 49 6e 20 74 68 69  ngle row. In thi
1e4b0 73 20 63 61 73 65 20 73 65 74 20 74 68 65 20 57  s case set the W
1e4c0 48 45 52 45 5f 55 4e 49 51 55 45 20 66 6c 61 67  HERE_UNIQUE flag
1e4d0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   to .    ** indi
1e4e0 63 61 74 65 20 74 68 69 73 20 74 6f 20 74 68 65  cate this to the
1e4f0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a   caller..    **.
1e500 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
1e510 2c 20 69 66 20 74 68 65 20 73 65 61 72 63 68 20  , if the search 
1e520 6d 61 79 20 66 69 6e 64 20 6d 6f 72 65 20 74 68  may find more th
1e530 61 6e 20 6f 6e 65 20 72 6f 77 2c 20 74 65 73 74  an one row, test
1e540 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a   to see if.    *
1e550 2a 20 74 68 65 72 65 20 69 73 20 61 20 72 61 6e  * there is a ran
1e560 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ge constraint on
1e570 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
1e580 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 2b 31 29 20  (pc.plan.nEq+1) 
1e590 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 6e 20  that.    ** can 
1e5a0 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  be optimized usi
1e5b0 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 20 0a 20  ng the index. . 
1e5c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63     */.    if( pc
1e5d0 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 70 50 72 6f 62  .plan.nEq==pProb
1e5e0 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 50  e->nColumn && pP
1e5f0 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  robe->onError!=O
1e600 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  E_None ){.      
1e610 74 65 73 74 63 61 73 65 28 20 70 63 2e 70 6c 61  testcase( pc.pla
1e620 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1e630 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20  E_COLUMN_IN );. 
1e640 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1e650 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  c.plan.wsFlags &
1e660 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
1e670 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LL );.      if( 
1e680 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  (pc.plan.wsFlags
1e690 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
1e6a0 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
1e6b0 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20  _NULL))==0 ){.  
1e6c0 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
1e6d0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55  Flags |= WHERE_U
1e6e0 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 69  NIQUE;.        i
1e6f0 66 28 20 70 2d 3e 69 3d 3d 30 20 7c 7c 20 28 70  f( p->i==0 || (p
1e700 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
1e710 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1e720 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45  WHERE_ALL_UNIQUE
1e730 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1e740 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67    pc.plan.wsFlag
1e750 73 20 7c 3d 20 57 48 45 52 45 5f 41 4c 4c 5f 55  s |= WHERE_ALL_U
1e760 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 7d  NIQUE;.        }
1e770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1e780 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62  se if( pProbe->b
1e790 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20 29 7b 0a  Unordered==0 ){.
1e7a0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1e7b0 20 20 20 6a 20 3d 20 28 70 63 2e 70 6c 61 6e 2e     j = (pc.plan.
1e7c0 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq==pProbe->nCo
1e7d0 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20 70 50 72 6f  lumn ? -1 : pPro
1e7e0 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 63 2e  be->aiColumn[pc.
1e7f0 70 6c 61 6e 2e 6e 45 71 5d 29 3b 0a 20 20 20 20  plan.nEq]);.    
1e800 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
1e810 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e  WC, iCur, j, p->
1e820 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
1e830 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
1e840 45 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20  E, pIdx) ){.    
1e850 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1e860 54 6f 70 2c 20 2a 70 42 74 6d 3b 0a 20 20 20 20  Top, *pBtm;.    
1e870 20 20 20 20 70 54 6f 70 20 3d 20 66 69 6e 64 54      pTop = findT
1e880 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
1e890 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 57  , p->notReady, W
1e8a0 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78  O_LT|WO_LE, pIdx
1e8b0 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 6d 20  );.        pBtm 
1e8c0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1e8d0 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52  iCur, j, p->notR
1e8e0 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
1e8f0 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  E, pIdx);.      
1e900 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e    whereRangeScan
1e910 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
1e920 62 65 2c 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 2c  be, pc.plan.nEq,
1e930 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72 61   pBtm, pTop, &ra
1e940 6e 67 65 44 69 76 29 3b 0a 20 20 20 20 20 20 20  ngeDiv);.       
1e950 20 69 66 28 20 70 54 6f 70 20 29 7b 0a 20 20 20   if( pTop ){.   
1e960 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d 20         nBound = 
1e970 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e  1;.          pc.
1e980 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
1e990 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
1e9a0 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 75 73  .          pc.us
1e9b0 65 64 20 7c 3d 20 70 54 6f 70 2d 3e 70 72 65 72  ed |= pTop->prer
1e9c0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
1e9d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
1e9e0 70 2d 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20  p->pWC!=pWC );. 
1e9f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ea00 20 69 66 28 20 70 42 74 6d 20 29 7b 0a 20 20 20   if( pBtm ){.   
1ea10 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b         nBound++;
1ea20 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c  .          pc.pl
1ea30 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1ea40 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
1ea50 20 20 20 20 20 20 20 20 20 70 63 2e 75 73 65 64           pc.used
1ea60 20 7c 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65 71   |= pBtm->prereq
1ea70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
1ea80 20 74 65 73 74 63 61 73 65 28 20 70 42 74 6d 2d   testcase( pBtm-
1ea90 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20  >pWC!=pWC );.   
1eaa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1eab0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1eac0 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  = (WHERE_COLUMN_
1ead0 52 41 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57 49  RANGE|WHERE_ROWI
1eae0 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 20 20  D_RANGE);.      
1eaf0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1eb00 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1eb10 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1eb20 6e 64 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  nd the index bei
1eb30 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 77 69  ng considered wi
1eb40 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72 61  ll.    ** natura
1eb50 6c 6c 79 20 73 63 61 6e 20 72 6f 77 73 20 69 6e  lly scan rows in
1eb60 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6f 72   the required or
1eb70 64 65 72 2c 20 73 65 74 20 74 68 65 20 61 70 70  der, set the app
1eb80 72 6f 70 72 69 61 74 65 20 66 6c 61 67 73 0a 20  ropriate flags. 
1eb90 20 20 20 2a 2a 20 69 6e 20 70 63 2e 70 6c 61 6e     ** in pc.plan
1eba0 2e 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77  .wsFlags. Otherw
1ebb0 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 69 73  ise, if there is
1ebc0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1ebd0 75 73 65 20 62 75 74 0a 20 20 20 20 2a 2a 20 74  use but.    ** t
1ebe0 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 73 63  he index will sc
1ebf0 61 6e 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66  an rows in a dif
1ec00 66 65 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65  ferent order, se
1ec10 74 20 74 68 65 20 62 53 6f 72 74 0a 20 20 20 20  t the bSort.    
1ec20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
1ec30 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 26  .    if( bSort &
1ec40 26 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  & (pSrc->jointyp
1ec50 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20  e & JT_LEFT)==0 
1ec60 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 52 65  ){.      int bRe
1ec70 76 20 3d 20 32 3b 0a 20 20 20 20 20 20 57 48 45  v = 2;.      WHE
1ec80 52 45 54 52 41 43 45 28 28 22 20 20 20 20 20 20  RETRACE(("      
1ec90 2d 2d 3e 20 62 65 66 6f 72 65 20 69 73 53 6f 72  --> before isSor
1eca0 74 69 6e 67 49 6e 64 65 78 3a 20 6e 50 72 69 6f  tingIndex: nPrio
1ecb0 72 53 61 74 3d 25 64 5c 6e 22 2c 6e 50 72 69 6f  rSat=%d\n",nPrio
1ecc0 72 53 61 74 29 29 3b 0a 20 20 20 20 20 20 70 63  rSat));.      pc
1ecd0 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 69  .plan.nOBSat = i
1ece0 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 2c  sSortingIndex(p,
1ecf0 20 70 50 72 6f 62 65 2c 20 69 43 75 72 2c 20 26   pProbe, iCur, &
1ed00 62 52 65 76 29 3b 0a 20 20 20 20 20 20 57 48 45  bRev);.      WHE
1ed10 52 45 54 52 41 43 45 28 28 22 20 20 20 20 20 20  RETRACE(("      
1ed20 2d 2d 3e 20 61 66 74 65 72 20 20 69 73 53 6f 72  --> after  isSor
1ed30 74 69 6e 67 49 6e 64 65 78 3a 20 62 52 65 76 3d  tingIndex: bRev=
1ed40 25 64 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c  %d nOBSat=%d\n",
1ed50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ed60 20 20 20 62 52 65 76 2c 20 70 63 2e 70 6c 61 6e     bRev, pc.plan
1ed70 2e 6e 4f 42 53 61 74 29 29 3b 0a 20 20 20 20 20  .nOBSat));.     
1ed80 20 69 66 28 20 6e 50 72 69 6f 72 53 61 74 3c 70   if( nPriorSat<p
1ed90 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 7c 7c  c.plan.nOBSat ||
1eda0 20 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67   (pc.plan.wsFlag
1edb0 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e  s & WHERE_ALL_UN
1edc0 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  IQUE)!=0 ){.    
1edd0 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
1ede0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44  ags |= WHERE_ORD
1edf0 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ERED;.      }.  
1ee00 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79      if( nOrderBy
1ee10 3d 3d 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  ==pc.plan.nOBSat
1ee20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72   ){.        bSor
1ee30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
1ee40 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1ee50 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  = WHERE_ROWID_RA
1ee60 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  NGE|WHERE_COLUMN
1ee70 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 7d 0a  _RANGE;.      }.
1ee80 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 26        if( bRev &
1ee90 20 31 20 29 20 70 63 2e 70 6c 61 6e 2e 77 73 46   1 ) pc.plan.wsF
1eea0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
1eeb0 56 45 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  VERSE;.    }..  
1eec0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1eed0 20 61 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c   a DISTINCT qual
1eee0 69 66 69 65 72 20 61 6e 64 20 74 68 69 73 20 69  ifier and this i
1eef0 6e 64 65 78 20 77 69 6c 6c 20 73 63 61 6e 20 72  ndex will scan r
1ef00 6f 77 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 72  ows in.    ** or
1ef10 64 65 72 20 6f 66 20 74 68 65 20 44 49 53 54 49  der of the DISTI
1ef20 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  NCT expressions,
1ef30 20 63 6c 65 61 72 20 62 44 69 73 74 20 61 6e 64   clear bDist and
1ef40 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72   set the appropr
1ef50 69 61 74 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  iate.    ** flag
1ef60 73 20 69 6e 20 70 63 2e 70 6c 61 6e 2e 77 73 46  s in pc.plan.wsF
1ef70 6c 61 67 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  lags. */.    if(
1ef80 20 62 44 69 73 74 0a 20 20 20 20 20 26 26 20 69   bDist.     && i
1ef90 73 44 69 73 74 69 6e 63 74 49 6e 64 65 78 28 70  sDistinctIndex(p
1efa0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 50 72 6f  Parse, pWC, pPro
1efb0 62 65 2c 20 69 43 75 72 2c 20 70 2d 3e 70 44 69  be, iCur, p->pDi
1efc0 73 74 69 6e 63 74 2c 20 70 63 2e 70 6c 61 6e 2e  stinct, pc.plan.
1efd0 6e 45 71 29 0a 20 20 20 20 20 26 26 20 28 70 63  nEq).     && (pc
1efe0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1eff0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
1f000 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
1f010 20 62 44 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   bDist = 0;.    
1f020 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67    pc.plan.wsFlag
1f030 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  s |= WHERE_ROWID
1f040 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c  _RANGE|WHERE_COL
1f050 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
1f060 44 49 53 54 49 4e 43 54 3b 0a 20 20 20 20 7d 0a  DISTINCT;.    }.
1f070 0a 20 20 20 20 2f 2a 20 49 66 20 63 75 72 72 65  .    /* If curre
1f080 6e 74 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e 67  ntly calculating
1f090 20 74 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69   the cost of usi
1f0a0 6e 67 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74  ng an index (not
1f0b0 20 74 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20   the IPK.    ** 
1f0c0 69 6e 64 65 78 29 2c 20 64 65 74 65 72 6d 69 6e  index), determin
1f0d0 65 20 69 66 20 61 6c 6c 20 72 65 71 75 69 72 65  e if all require
1f0e0 64 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61  d column data ma
1f0f0 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 77 69  y be obtained wi
1f100 74 68 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75 73  thout .    ** us
1f110 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 74 61 62  ing the main tab
1f120 6c 65 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  le (i.e. if the 
1f130 69 6e 64 65 78 20 69 73 20 61 20 63 6f 76 65 72  index is a cover
1f140 69 6e 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ing.    ** index
1f150 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 29   for this query)
1f160 2e 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20  . If it is, set 
1f170 74 68 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  the WHERE_IDX_ON
1f180 4c 59 20 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a  LY flag in.    *
1f190 2a 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  * pc.plan.wsFlag
1f1a0 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  s. Otherwise, se
1f1b0 74 20 74 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61  t the bLookup va
1f1c0 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65 2e 20  riable to true. 
1f1d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
1f1e0 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
1f1f0 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  k m = pSrc->colU
1f200 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  sed;.      int j
1f210 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1f220 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
1f230 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1f240 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
1f250 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
1f260 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
1f270 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d  {.          m &=
1f280 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   ~(((Bitmask)1)<
1f290 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <x);.        }. 
1f2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f2b0 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m==0 ){.       
1f2c0 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73   pc.plan.wsFlags
1f2d0 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
1f2e0 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
1f2f0 0a 20 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70  .        bLookup
1f300 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1f310 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1f320 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
1f330 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f  number of rows o
1f340 66 20 6f 75 74 70 75 74 2e 20 20 46 6f 72 20 61  f output.  For a
1f350 6e 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e  n "x IN (SELECT.
1f360 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  ..)".    ** cons
1f370 74 72 61 69 6e 74 2c 20 64 6f 20 6e 6f 74 20 6c  traint, do not l
1f380 65 74 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  et the estimate 
1f390 65 78 63 65 65 64 20 68 61 6c 66 20 74 68 65 20  exceed half the 
1f3a0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1f3b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 63  e..    */.    pc
1f3c0 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 28 64 6f  .plan.nRow = (do
1f3d0 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74 5b 70  uble)(aiRowEst[p
1f3e0 63 2e 70 6c 61 6e 2e 6e 45 71 5d 20 2a 20 6e 49  c.plan.nEq] * nI
1f3f0 6e 4d 75 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  nMul);.    if( b
1f400 49 6e 45 73 74 20 26 26 20 70 63 2e 70 6c 61 6e  InEst && pc.plan
1f410 2e 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74  .nRow*2>aiRowEst
1f420 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 63 2e  [0] ){.      pc.
1f430 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 61 69 52 6f  plan.nRow = aiRo
1f440 77 45 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20 20  wEst[0]/2;.     
1f450 20 6e 49 6e 4d 75 6c 20 3d 20 28 69 6e 74 29 28   nInMul = (int)(
1f460 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f 20 61  pc.plan.nRow / a
1f470 69 52 6f 77 45 73 74 5b 70 63 2e 70 6c 61 6e 2e  iRowEst[pc.plan.
1f480 6e 45 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  nEq]);.    }..#i
1f490 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1f4a0 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 2f 2a 20  LE_STAT3.    /* 
1f4b0 49 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  If the constrain
1f4c0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
1f4d0 20 78 3d 56 41 4c 55 45 20 6f 72 20 78 20 49 4e   x=VALUE or x IN
1f4e0 20 28 45 31 2c 45 32 2c 2e 2e 2e 29 0a 20 20 20   (E1,E2,...).   
1f4f0 20 2a 2a 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f   ** and we do no
1f500 74 20 74 68 69 6e 6b 20 74 68 61 74 20 76 61 6c  t think that val
1f510 75 65 73 20 6f 66 20 78 20 61 72 65 20 75 6e 69  ues of x are uni
1f520 71 75 65 20 61 6e 64 20 69 66 20 68 69 73 74 6f  que and if histo
1f530 67 72 61 6d 0a 20 20 20 20 2a 2a 20 64 61 74 61  gram.    ** data
1f540 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   is available fo
1f550 72 20 63 6f 6c 75 6d 6e 20 78 2c 20 74 68 65 6e  r column x, then
1f560 20 69 74 20 6d 69 67 68 74 20 62 65 20 70 6f 73   it might be pos
1f570 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 6f 20  sible.    ** to 
1f580 67 65 74 20 61 20 62 65 74 74 65 72 20 65 73 74  get a better est
1f590 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 6e 75 6d  imate on the num
1f5a0 62 65 72 20 6f 66 20 72 6f 77 73 20 62 61 73 65  ber of rows base
1f5b0 64 20 6f 6e 0a 20 20 20 20 2a 2a 20 56 41 4c 55  d on.    ** VALU
1f5c0 45 20 61 6e 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e  E and how common
1f5d0 20 74 68 61 74 20 76 61 6c 75 65 20 69 73 20 61   that value is a
1f5e0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
1f5f0 68 69 73 74 6f 67 72 61 6d 2e 0a 20 20 20 20 2a  histogram..    *
1f600 2f 0a 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61  /.    if( pc.pla
1f610 6e 2e 6e 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31  n.nRow>(double)1
1f620 20 26 26 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d   && pc.plan.nEq=
1f630 3d 31 0a 20 20 20 20 20 26 26 20 70 46 69 72 73  =1.     && pFirs
1f640 74 54 65 72 6d 21 3d 30 20 26 26 20 61 69 52 6f  tTerm!=0 && aiRo
1f650 77 45 73 74 5b 31 5d 3e 31 20 29 7b 0a 20 20 20  wEst[1]>1 ){.   
1f660 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72     assert( (pFir
1f670 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1f680 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
1f690 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 21 3d 30 20  NULL|WO_IN))!=0 
1f6a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  );.      if( pFi
1f6b0 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
1f6c0 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
1f6d0 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  SNULL) ){.      
1f6e0 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69 72    testcase( pFir
1f6f0 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1f700 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
1f710 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f720 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72  FirstTerm->eOper
1f730 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20  ator & WO_EQUIV 
1f740 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f750 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d  ase( pFirstTerm-
1f760 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1f770 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1f780 20 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e    whereEqualScan
1f790 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
1f7a0 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  be, pFirstTerm->
1f7b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 0a 20  pExpr->pRight,. 
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 20 20 20 20 20 26 70 63 2e 70 6c 61           &pc.pla
1f7e0 6e 2e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d  n.nRow);.      }
1f7f0 65 6c 73 65 20 69 66 28 20 62 49 6e 45 73 74 3d  else if( bInEst=
1f800 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1f810 73 65 72 74 28 20 70 46 69 72 73 74 54 65 72 6d  sert( pFirstTerm
1f820 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1f830 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 77  _IN );.        w
1f840 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50  hereInScanEst(pP
1f850 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46  arse, pProbe, pF
1f860 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d  irstTerm->pExpr-
1f870 3e 78 2e 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  >x.pList,.      
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 26 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 3b   &pc.plan.nRow);
1f8a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
1f8b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f8c0 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a  ENABLE_STAT3 */.
1f8d0 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 74  .    /* Adjust t
1f8e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
1f8f0 70 75 74 20 72 6f 77 73 20 61 6e 64 20 64 6f 77  put rows and dow
1f900 6e 77 61 72 64 20 74 6f 20 72 65 66 6c 65 63 74  nward to reflect
1f910 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68 61   rows.    ** tha
1f920 74 20 61 72 65 20 65 78 63 6c 75 64 65 64 20 62  t are excluded b
1f930 79 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  y range constrai
1f940 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
1f950 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 70  pc.plan.nRow = p
1f960 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2f 72 61 6e 67  c.plan.nRow/rang
1f970 65 44 69 76 3b 0a 20 20 20 20 69 66 28 20 70 63  eDiv;.    if( pc
1f980 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 31 20 29 20 70  .plan.nRow<1 ) p
1f990 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 31 3b  c.plan.nRow = 1;
1f9a0 0a 0a 20 20 20 20 2f 2a 20 45 78 70 65 72 69 6d  ..    /* Experim
1f9b0 65 6e 74 73 20 72 75 6e 20 6f 6e 20 72 65 61 6c  ents run on real
1f9c0 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
1f9d0 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  s show that the 
1f9e0 74 69 6d 65 20 6e 65 65 64 65 64 0a 20 20 20 20  time needed.    
1f9f0 2a 2a 20 74 6f 20 64 6f 20 61 20 62 69 6e 61 72  ** to do a binar
1fa00 79 20 73 65 61 72 63 68 20 74 6f 20 6c 6f 63 61  y search to loca
1fa10 74 65 20 61 20 72 6f 77 20 69 6e 20 61 20 74 61  te a row in a ta
1fa20 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20  ble or index is 
1fa30 72 6f 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20 6c  roughly.    ** l
1fa40 6f 67 31 30 28 4e 29 20 74 69 6d 65 73 20 74 68  og10(N) times th
1fa50 65 20 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20 66  e time to move f
1fa60 72 6f 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20 74  rom one row to t
1fa70 68 65 20 6e 65 78 74 20 72 6f 77 20 77 69 74 68  he next row with
1fa80 69 6e 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c  in.    ** a tabl
1fa90 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68 65  e or index.  The
1faa0 20 61 63 74 75 61 6c 20 74 69 6d 65 73 20 63 61   actual times ca
1fab0 6e 20 76 61 72 79 2c 20 77 69 74 68 20 74 68 65  n vary, with the
1fac0 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20   size of.    ** 
1fad0 72 65 63 6f 72 64 73 20 62 65 69 6e 67 20 61 6e  records being an
1fae0 20 69 6d 70 6f 72 74 61 6e 74 20 66 61 63 74 6f   important facto
1faf0 72 2e 20 20 42 6f 74 68 20 6d 6f 76 65 73 20 61  r.  Both moves a
1fb00 6e 64 20 73 65 61 72 63 68 65 73 20 61 72 65 0a  nd searches are.
1fb10 20 20 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77 69      ** slower wi
1fb20 74 68 20 6c 61 72 67 65 72 20 72 65 63 6f 72 64  th larger record
1fb30 73 2c 20 70 72 65 73 75 6d 61 62 6c 79 20 62 65  s, presumably be
1fb40 63 61 75 73 65 20 66 65 77 65 72 20 72 65 63 6f  cause fewer reco
1fb50 72 64 73 20 66 69 74 0a 20 20 20 20 2a 2a 20 6f  rds fit.    ** o
1fb60 6e 20 6f 6e 65 20 70 61 67 65 20 61 6e 64 20 68  n one page and h
1fb70 65 6e 63 65 20 6d 6f 72 65 20 70 61 67 65 73 20  ence more pages 
1fb80 68 61 76 65 20 74 6f 20 62 65 20 66 65 74 63 68  have to be fetch
1fb90 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1fba0 2a 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  * The ANALYZE co
1fbb0 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 73 71  mmand and the sq
1fbc0 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73  lite_stat1 and s
1fbd0 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62 6c  qlite_stat3 tabl
1fbe0 65 73 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  es do.    ** not
1fbf0 20 67 69 76 65 20 75 73 20 64 61 74 61 20 6f 6e   give us data on
1fc00 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69   the relative si
1fc10 7a 65 73 20 6f 66 20 74 61 62 6c 65 20 61 6e 64  zes of table and
1fc20 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 0a   index records..
1fc30 20 20 20 20 2a 2a 20 53 6f 20 74 68 69 73 20 63      ** So this c
1fc40 6f 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 75 6d  omputation assum
1fc50 65 73 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73  es table records
1fc60 20 61 72 65 20 61 62 6f 75 74 20 74 77 69 63 65   are about twice
1fc70 20 61 73 20 62 69 67 0a 20 20 20 20 2a 2a 20 61   as big.    ** a
1fc80 73 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  s index records.
1fc90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1fca0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26  pc.plan.wsFlags&
1fcb0 7e 28 57 48 45 52 45 5f 52 45 56 45 52 53 45 7c  ~(WHERE_REVERSE|
1fcc0 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 29 3d  WHERE_ORDERED))=
1fcd0 3d 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 0a  =WHERE_IDX_ONLY.
1fce0 20 20 20 20 20 26 26 20 28 70 57 43 2d 3e 77 63       && (pWC->wc
1fcf0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1fd00 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
1fd10 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c  )==0.     && sql
1fd20 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1fd30 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 26 26  .bUseCis.     &&
1fd40 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
1fd50 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
1fd60 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78   SQLITE_CoverIdx
1fd70 53 63 61 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  Scan).    ){.   
1fd80 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
1fd90 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66   is not useful f
1fda0 6f 72 20 69 6e 64 65 78 69 6e 67 2c 20 62 75 74  or indexing, but
1fdb0 20 69 74 20 69 73 20 61 20 63 6f 76 65 72 69 6e   it is a coverin
1fdc0 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a  g index..      *
1fdd0 2a 20 41 20 66 75 6c 6c 2d 73 63 61 6e 20 6f 66  * A full-scan of
1fde0 20 74 68 65 20 69 6e 64 65 78 20 6d 69 67 68 74   the index might
1fdf0 20 62 65 20 61 20 6c 69 74 74 6c 65 20 66 61 73   be a little fas
1fe00 74 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 2d  ter than a full-
1fe10 73 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 66  scan.      ** of
1fe20 20 74 68 65 20 74 61 62 6c 65 2c 20 73 6f 20 67   the table, so g
1fe30 69 76 65 20 74 68 69 73 20 63 61 73 65 20 61 20  ive this case a 
1fe40 63 6f 73 74 20 73 6c 69 67 68 74 6c 79 20 6c 65  cost slightly le
1fe50 73 73 20 74 68 61 6e 20 61 20 74 61 62 6c 65 0a  ss than a table.
1fe60 20 20 20 20 20 20 2a 2a 20 73 63 61 6e 2e 20 2a        ** scan. *
1fe70 2f 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74  /.      pc.rCost
1fe80 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a 33   = aiRowEst[0]*3
1fe90 20 2b 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   + pProbe->nColu
1fea0 6d 6e 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c 61  mn;.      pc.pla
1feb0 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  n.wsFlags |= WHE
1fec0 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 7c 57 48  RE_COVER_SCAN|WH
1fed0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1fee0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1fef0 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  (pc.plan.wsFlags
1ff00 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
1ff10 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  LSCAN)==0 ){.   
1ff20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
1ff30 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  f a full table s
1ff40 63 61 6e 20 69 73 20 61 20 6e 75 6d 62 65 72 20  can is a number 
1ff50 6f 66 20 6d 6f 76 65 20 6f 70 65 72 61 74 69 6f  of move operatio
1ff60 6e 73 20 65 71 75 61 6c 0a 20 20 20 20 20 20 2a  ns equal.      *
1ff70 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  * to the number 
1ff80 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1ff90 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  able..      **. 
1ffa0 20 20 20 20 20 2a 2a 20 57 65 20 61 64 64 20 61       ** We add a
1ffb0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 34 78 20  n additional 4x 
1ffc0 70 65 6e 61 6c 74 79 20 74 6f 20 66 75 6c 6c 20  penalty to full 
1ffd0 74 61 62 6c 65 20 73 63 61 6e 73 2e 20 20 54 68  table scans.  Th
1ffe0 69 73 20 63 61 75 73 65 73 0a 20 20 20 20 20 20  is causes.      
1fff0 2a 2a 20 74 68 65 20 63 6f 73 74 20 66 75 6e 63  ** the cost func
20000 74 69 6f 6e 20 74 6f 20 65 72 72 20 6f 6e 20 74  tion to err on t
20010 68 65 20 73 69 64 65 20 6f 66 20 63 68 6f 6f 73  he side of choos
20020 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f 76 65  ing an index ove
20030 72 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73  r.      ** choos
20040 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e 2e  ing a full scan.
20050 20 20 54 68 69 73 20 34 78 20 66 75 6c 6c 2d 73    This 4x full-s
20060 63 61 6e 20 70 65 6e 61 6c 74 79 20 69 73 20 61  can penalty is a
20070 6e 20 61 72 67 75 61 62 6c 65 0a 20 20 20 20 20  n arguable.     
20080 20 2a 2a 20 64 65 63 69 73 69 6f 6e 20 61 6e 64   ** decision and
20090 20 6f 6e 65 20 77 68 69 63 68 20 77 65 20 65 78   one which we ex
200a0 70 65 63 74 20 74 6f 20 72 65 76 69 73 69 74 20  pect to revisit 
200b0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 20  in the future.  
200c0 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  But.      ** it 
200d0 73 65 65 6d 73 20 74 6f 20 62 65 20 77 6f 72 6b  seems to be work
200e0 69 6e 67 20 77 65 6c 6c 20 65 6e 6f 75 67 68 20  ing well enough 
200f0 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a 20  at the moment.. 
20100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 63       */.      pc
20110 2e 72 43 6f 73 74 20 3d 20 61 69 52 6f 77 45 73  .rCost = aiRowEs
20120 74 5b 30 5d 2a 34 3b 0a 20 20 20 20 20 20 70 63  t[0]*4;.      pc
20130 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d  .plan.wsFlags &=
20140 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   ~WHERE_IDX_ONLY
20150 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
20160 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63 2e 70   ){.        pc.p
20170 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e  lan.wsFlags &= ~
20180 57 48 45 52 45 5f 4f 52 44 45 52 45 44 3b 0a 20  WHERE_ORDERED;. 
20190 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e         pc.plan.n
201a0 4f 42 53 61 74 20 3d 20 6e 50 72 69 6f 72 53 61  OBSat = nPriorSa
201b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
201c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 31  else{.      log1
201d0 30 4e 20 3d 20 65 73 74 4c 6f 67 28 61 69 52 6f  0N = estLog(aiRo
201e0 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20  wEst[0]);.      
201f0 70 63 2e 72 43 6f 73 74 20 3d 20 70 63 2e 70 6c  pc.rCost = pc.pl
20200 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69  an.nRow;.      i
20210 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
20220 20 20 20 69 66 28 20 62 4c 6f 6f 6b 75 70 20 29     if( bLookup )
20230 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  {.          /* F
20240 6f 72 20 61 6e 20 69 6e 64 65 78 20 6c 6f 6f 6b  or an index look
20250 75 70 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  up followed by a
20260 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a 20   table lookup:. 
20270 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e           **    n
20280 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72  InMul index sear
20290 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65  ches to find the
202a0 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 69   start of each i
202b0 6e 64 65 78 20 72 61 6e 67 65 0a 20 20 20 20 20  ndex range.     
202c0 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20       **  + nRow 
202d0 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68  steps through th
202e0 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  e index.        
202f0 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74 61 62    **  + nRow tab
20300 6c 65 20 73 65 61 72 63 68 65 73 20 74 6f 20 6c  le searches to l
20310 6f 6f 6b 75 70 20 74 68 65 20 74 61 62 6c 65 20  ookup the table 
20320 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
20330 72 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20  rowid.          
20340 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e  */.          pc.
20350 72 43 6f 73 74 20 2b 3d 20 28 6e 49 6e 4d 75 6c  rCost += (nInMul
20360 20 2b 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29   + pc.plan.nRow)
20370 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20  *log10N;.       
20380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20390 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 76 65 72    /* For a cover
203a0 69 6e 67 20 69 6e 64 65 78 3a 0a 20 20 20 20 20  ing index:.     
203b0 20 20 20 20 20 2a 2a 20 20 20 20 20 6e 49 6e 4d       **     nInM
203c0 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68 65  ul index searche
203d0 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e  s to find the in
203e0 69 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  itial entry .   
203f0 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 6e 52         **   + nR
20400 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68  ow steps through
20410 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
20420 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
20430 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 6e 49    pc.rCost += nI
20440 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20  nMul*log10N;.   
20450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
20460 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46  se{.        /* F
20470 6f 72 20 61 20 72 6f 77 69 64 20 70 72 69 6d 61  or a rowid prima
20480 72 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a 20  ry key lookup:. 
20490 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e         **    nIn
204a0 4d 75 6c 74 20 74 61 62 6c 65 20 73 65 61 72 63  Mult table searc
204b0 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  hes to find the 
204c0 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 66 6f  initial entry fo
204d0 72 20 65 61 63 68 20 72 61 6e 67 65 0a 20 20 20  r each range.   
204e0 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20       **  + nRow 
204f0 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68  steps through th
20500 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  e table.        
20510 2a 2f 0a 20 20 20 20 20 20 20 20 70 63 2e 72 43  */.        pc.rC
20520 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f  ost += nInMul*lo
20530 67 31 30 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  g10N;.      }.  
20540 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
20550 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  in the estimated
20560 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
20570 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 41 63   the result.  Ac
20580 74 75 61 6c 20 65 78 70 65 72 69 6d 65 6e 74 61  tual experimenta
20590 6c 0a 20 20 20 20 2a 2a 20 6d 65 61 73 75 72 65  l.    ** measure
205a0 6d 65 6e 74 73 20 6f 66 20 73 6f 72 74 69 6e 67  ments of sorting
205b0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e 20   performance in 
205c0 53 51 4c 69 74 65 20 73 68 6f 77 20 74 68 61 74  SQLite show that
205d0 20 73 6f 72 74 69 6e 67 20 74 69 6d 65 0a 20 20   sorting time.  
205e0 20 20 2a 2a 20 61 64 64 73 20 43 2a 4e 2a 6c 6f    ** adds C*N*lo
205f0 67 31 30 28 4e 29 20 74 6f 20 74 68 65 20 63 6f  g10(N) to the co
20600 73 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74  st, where N is t
20610 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
20620 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
20630 73 6f 72 74 65 64 20 61 6e 64 20 43 20 69 73 20  sorted and C is 
20640 61 20 66 61 63 74 6f 72 20 62 65 74 77 65 65 6e  a factor between
20650 20 31 2e 39 35 20 61 6e 64 20 34 2e 33 2e 20 20   1.95 and 4.3.  
20660 57 65 20 77 69 6c 6c 20 73 70 6c 69 74 20 74 68  We will split th
20670 65 0a 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65  e.    ** differe
20680 6e 63 65 20 61 6e 64 20 73 65 6c 65 63 74 20 43  nce and select C
20690 20 6f 66 20 33 2e 30 2e 0a 20 20 20 20 2a 2f 0a   of 3.0..    */.
206a0 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 29 7b      if( bSort ){
206b0 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6d 20  .      double m 
206c0 3d 20 65 73 74 4c 6f 67 28 70 63 2e 70 6c 61 6e  = estLog(pc.plan
206d0 2e 6e 52 6f 77 2a 28 6e 4f 72 64 65 72 42 79 20  .nRow*(nOrderBy 
206e0 2d 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  - pc.plan.nOBSat
206f0 29 2f 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  )/nOrderBy);.   
20700 20 20 20 6d 20 2a 3d 20 28 64 6f 75 62 6c 65 29     m *= (double)
20710 28 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20  (pc.plan.nOBSat 
20720 3f 20 32 20 3a 20 33 29 3b 0a 20 20 20 20 20 20  ? 2 : 3);.      
20730 70 63 2e 72 43 6f 73 74 20 2b 3d 20 70 63 2e 70  pc.rCost += pc.p
20740 6c 61 6e 2e 6e 52 6f 77 2a 6d 3b 0a 20 20 20 20  lan.nRow*m;.    
20750 7d 0a 20 20 20 20 69 66 28 20 62 44 69 73 74 20  }.    if( bDist 
20760 29 7b 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73  ){.      pc.rCos
20770 74 20 2b 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f  t += pc.plan.nRo
20780 77 2a 65 73 74 4c 6f 67 28 70 63 2e 70 6c 61 6e  w*estLog(pc.plan
20790 2e 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d 0a  .nRow)*3;.    }.
207a0 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20  .    /**** Cost 
207b0 6f 66 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e  of using this in
207c0 64 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65 6e  dex has now been
207d0 20 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a   computed ****/.
207e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
207f0 20 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   are additional 
20800 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74  constraints on t
20810 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 63  his table that c
20820 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20  annot.    ** be 
20830 75 73 65 64 20 77 69 74 68 20 74 68 65 20 63 75  used with the cu
20840 72 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75 74  rrent index, but
20850 20 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f 77   which might low
20860 65 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  er the number.  
20870 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72    ** of output r
20880 6f 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65 20  ows, adjust the 
20890 6e 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f 72  nRow value accor
208a0 64 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e  dingly.  This on
208b0 6c 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65  ly .    ** matte
208c0 72 73 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  rs if the curren
208d0 74 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 6c  t index is the l
208e0 65 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20  east costly, so 
208f0 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20  do not bother.  
20900 20 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20 73    ** with this s
20910 74 65 70 20 69 66 20 77 65 20 61 6c 72 65 61 64  tep if we alread
20920 79 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64 65  y know this inde
20930 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68  x will not be ch
20940 6f 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73  osen..    ** Als
20950 6f 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  o, never reduce 
20960 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63  the output row c
20970 6f 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73 69  ount below 2 usi
20980 6e 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20 20  ng this step..  
20990 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69    **.    ** It i
209a0 73 20 63 72 69 74 69 63 61 6c 20 74 68 61 74 20  s critical that 
209b0 74 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73  the notValid mas
209c0 6b 20 62 65 20 75 73 65 64 20 68 65 72 65 20 69  k be used here i
209d0 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
209e0 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d 61   the notReady ma
209f0 73 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75 74  sk.  When comput
20a00 69 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22  ing an "optimal"
20a10 20 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74 52   index, the notR
20a20 65 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b  eady.    ** mask
20a30 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20   will only have 
20a40 6f 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74 68  one bit set - th
20a50 65 20 62 69 74 20 66 6f 72 20 74 68 65 20 63 75  e bit for the cu
20a60 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20  rrent table..   
20a70 20 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69 64   ** The notValid
20a80 20 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74   mask, on the ot
20a90 68 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79 73  her hand, always
20aa0 20 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73 65   has all bits se
20ab0 74 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  t for.    ** tab
20ac0 6c 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  les that are not
20ad0 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e   in outer loops.
20ae0 20 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69 73    If notReady is
20af0 20 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65   used here inste
20b00 61 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74  ad.    ** of not
20b10 56 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f 70  Valid, then a op
20b20 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74  timal index that
20b30 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65   depends on inne
20b40 72 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20  r joins loops.  
20b50 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 65    ** might be se
20b60 6c 65 63 74 65 64 20 65 76 65 6e 20 77 68 65 6e  lected even when
20b70 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 6e   there exists an
20b80 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74   optimal index t
20b90 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e  hat has.    ** n
20ba0 6f 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e 63  o such dependenc
20bb0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
20bc0 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 32  ( pc.plan.nRow>2
20bd0 20 26 26 20 70 63 2e 72 43 6f 73 74 3c 3d 70 2d   && pc.rCost<=p-
20be0 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a 20  >cost.rCost ){. 
20bf0 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c10 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20c20 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  r */.      int n
20c30 53 6b 69 70 45 71 20 3d 20 70 63 2e 70 6c 61 6e  SkipEq = pc.plan
20c40 2e 6e 45 71 3b 20 20 20 2f 2a 20 4e 75 6d 62 65  .nEq;   /* Numbe
20c50 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69  r of == constrai
20c60 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  nts to skip */. 
20c70 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 52 61       int nSkipRa
20c80 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20 20  nge = nBound;   
20c90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3c    /* Number of <
20ca0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
20cb0 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 42 69  skip */.      Bi
20cc0 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b 20 20  tmask thisTab;  
20cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
20ce0 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20 2a 2f  tmap for pSrc */
20cf0 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61 62 20  ..      thisTab 
20d00 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70  = getMask(pWC->p
20d10 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
20d20 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
20d30 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e  pWC->a, k=pWC->n
20d40 54 65 72 6d 3b 20 70 63 2e 70 6c 61 6e 2e 6e 52  Term; pc.plan.nR
20d50 6f 77 3e 32 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20  ow>2 && k; k--, 
20d60 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
20d70 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
20d80 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
20d90 55 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UAL ) continue;.
20da0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
20db0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
20dc0 70 2d 3e 6e 6f 74 56 61 6c 69 64 29 21 3d 74 68  p->notValid)!=th
20dd0 69 73 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  isTab ) continue
20de0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
20df0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
20e00 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f   (WO_EQ|WO_IN|WO
20e10 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  _ISNULL) ){.    
20e20 20 20 20 20 20 20 69 66 28 20 6e 53 6b 69 70 45        if( nSkipE
20e30 71 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  q ){.           
20e40 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 66   /* Ignore the f
20e50 69 72 73 74 20 70 63 2e 70 6c 61 6e 2e 6e 45 71  irst pc.plan.nEq
20e60 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 65   equality matche
20e70 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65  s since the inde
20e80 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  x.            **
20e90 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63   has already acc
20ea0 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65  ounted for these
20eb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20ec0 6e 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20  nSkipEq--;.     
20ed0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20ee0 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
20ef0 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  e each additiona
20f00 6c 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68  l equality match
20f10 20 72 65 64 75 63 65 73 20 74 68 65 20 72 65 73   reduces the res
20f20 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ult.            
20f30 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20 61  ** set size by a
20f40 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f   factor of 10 */
20f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 63 2e  .            pc.
20f60 70 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 31 30 3b  plan.nRow /= 10;
20f70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20f80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
20f90 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
20fa0 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  & (WO_LT|WO_LE|W
20fb0 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
20fc0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53 6b           if( nSk
20fd0 69 70 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 20  ipRange ){.     
20fe0 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65         /* Ignore
20ff0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
21000 52 61 6e 67 65 20 72 61 6e 67 65 20 63 6f 6e 73  Range range cons
21010 74 72 61 69 6e 74 73 20 73 69 6e 63 65 20 74 68  traints since th
21020 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  e index.        
21030 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
21040 64 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f 72  dy accounted for
21050 20 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20 20   these */.      
21060 20 20 20 20 20 20 6e 53 6b 69 70 52 61 6e 67 65        nSkipRange
21070 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  --;.          }e
21080 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
21090 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63 68 20   /* Assume each 
210a0 61 64 64 69 74 69 6f 6e 61 6c 20 72 61 6e 67 65  additional range
210b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75   constraint redu
210c0 63 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20  ces the result. 
210d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65             ** se
210e0 74 20 73 69 7a 65 20 62 79 20 61 20 66 61 63 74  t size by a fact
210f0 6f 72 20 6f 66 20 33 2e 20 20 49 6e 64 65 78 65  or of 3.  Indexe
21100 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  d range constrai
21110 6e 74 73 20 72 65 64 75 63 65 0a 20 20 20 20 20  nts reduce.     
21120 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65         ** the se
21130 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
21140 6c 61 72 67 65 72 20 66 61 63 74 6f 72 3a 20 34  larger factor: 4
21150 2e 20 20 57 65 20 6d 61 6b 65 20 69 6e 64 65 78  .  We make index
21160 65 64 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20  ed range.       
21170 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 73 65 6c       ** more sel
21180 65 63 74 69 76 65 20 69 6e 74 65 6e 74 69 6f 6e  ective intention
21190 61 6c 6c 79 20 62 65 63 61 75 73 65 20 6f 66 20  ally because of 
211a0 74 68 65 20 73 75 62 6a 65 63 74 69 76 65 20 0a  the subjective .
211b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
211c0 62 73 65 72 76 61 74 69 6f 6e 20 74 68 61 74 20  bservation that 
211d0 69 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63 6f  indexed range co
211e0 6e 73 74 72 61 69 6e 74 73 20 72 65 61 6c 6c 79  nstraints really
211f0 20 61 72 65 20 6d 6f 72 65 0a 20 20 20 20 20 20   are more.      
21200 20 20 20 20 20 20 2a 2a 20 73 65 6c 65 63 74 69        ** selecti
21210 76 65 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20  ve in practice, 
21220 6f 6e 20 61 76 65 72 61 67 65 2e 20 2a 2f 0a 20  on average. */. 
21230 20 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c             pc.pl
21240 61 6e 2e 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20  an.nRow /= 3;.  
21250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21260 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
21270 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
21280 57 4f 5f 4e 4f 4f 50 29 3d 3d 30 20 29 7b 0a 20  WO_NOOP)==0 ){. 
21290 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79 20           /* Any 
212a0 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
212b0 20 6c 6f 77 65 72 73 20 74 68 65 20 6f 75 74 70   lowers the outp
212c0 75 74 20 72 6f 77 20 63 6f 75 6e 74 20 62 79 20  ut row count by 
212d0 68 61 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20  half */.        
212e0 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f    pc.plan.nRow /
212f0 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 2;.        }. 
21300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21310 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 32 20   pc.plan.nRow<2 
21320 29 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d  ) pc.plan.nRow =
21330 20 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20   2;.    }...    
21340 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20 20  WHERETRACE((.   
21350 20 20 20 22 20 20 20 20 20 20 6e 45 71 3d 25 64     "      nEq=%d
21360 20 6e 49 6e 4d 75 6c 3d 25 64 20 72 61 6e 67 65   nInMul=%d range
21370 44 69 76 3d 25 64 20 62 53 6f 72 74 3d 25 64 20  Div=%d bSort=%d 
21380 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73 46 6c 61  bLookup=%d wsFla
21390 67 73 3d 30 78 25 30 38 78 5c 6e 22 0a 20 20 20  gs=0x%08x\n".   
213a0 20 20 20 22 20 20 20 20 20 20 6e 6f 74 52 65 61     "      notRea
213b0 64 79 3d 30 78 25 6c 6c 78 20 6c 6f 67 31 30 4e  dy=0x%llx log10N
213c0 3d 25 2e 31 66 20 6e 52 6f 77 3d 25 2e 31 66 20  =%.1f nRow=%.1f 
213d0 63 6f 73 74 3d 25 2e 31 66 5c 6e 22 0a 20 20 20  cost=%.1f\n".   
213e0 20 20 20 22 20 20 20 20 20 20 75 73 65 64 3d 30     "      used=0
213f0 78 25 6c 6c 78 20 6e 4f 42 53 61 74 3d 25 64 5c  x%llx nOBSat=%d\
21400 6e 22 2c 0a 20 20 20 20 20 20 70 63 2e 70 6c 61  n",.      pc.pla
21410 6e 2e 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20 28  n.nEq, nInMul, (
21420 69 6e 74 29 72 61 6e 67 65 44 69 76 2c 20 62 53  int)rangeDiv, bS
21430 6f 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 70 63  ort, bLookup, pc
21440 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 0a 20  .plan.wsFlags,. 
21450 20 20 20 20 20 70 2d 3e 6e 6f 74 52 65 61 64 79       p->notReady
21460 2c 20 6c 6f 67 31 30 4e 2c 20 70 63 2e 70 6c 61  , log10N, pc.pla
21470 6e 2e 6e 52 6f 77 2c 20 70 63 2e 72 43 6f 73 74  n.nRow, pc.rCost
21480 2c 20 70 63 2e 75 73 65 64 2c 0a 20 20 20 20 20  , pc.used,.     
21490 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 0a   pc.plan.nOBSat.
214a0 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f 2a 20      ));..    /* 
214b0 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  If this index is
214c0 20 74 68 65 20 62 65 73 74 20 77 65 20 68 61 76   the best we hav
214d0 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c 20 74  e seen so far, t
214e0 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69 73 0a  hen record this.
214f0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64      ** index and
21500 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74 68 65   its cost in the
21510 20 70 2d 3e 63 6f 73 74 20 73 74 72 75 63 74 75   p->cost structu
21520 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
21530 66 28 20 28 21 70 49 64 78 20 7c 7c 20 70 63 2e  f( (!pIdx || pc.
21540 70 6c 61 6e 2e 77 73 46 6c 61 67 73 29 20 26 26  plan.wsFlags) &&
21550 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 26 70 63   compareCost(&pc
21560 2c 20 26 70 2d 3e 63 6f 73 74 29 20 29 7b 0a 20  , &p->cost) ){. 
21570 20 20 20 20 20 70 2d 3e 63 6f 73 74 20 3d 20 70       p->cost = p
21580 63 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74  c;.      p->cost
21590 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d  .plan.wsFlags &=
215a0 20 77 73 46 6c 61 67 4d 61 73 6b 3b 0a 20 20 20   wsFlagMask;.   
215b0 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e     p->cost.plan.
215c0 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  u.pIdx = pIdx;. 
215d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
215e0 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
215f0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
21600 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f  then only that o
21610 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ne index is.    
21620 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a  ** considered. *
21630 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
21640 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a  pIndex ) break;.
21650 0a 20 20 20 20 2f 2a 20 52 65 73 65 74 20 6d 61  .    /* Reset ma
21660 73 6b 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  sks for the next
21670 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f   index in the lo
21680 6f 70 20 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67  op */.    wsFlag
21690 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52  Mask = ~(WHERE_R
216a0 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
216b0 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20  WID_RANGE);.    
216c0 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78  eqTermMask = idx
216d0 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a  EqTermMask;.  }.
216e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
216f0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
21700 61 75 73 65 20 61 6e 64 20 74 68 65 20 53 51 4c  ause and the SQL
21710 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
21720 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65   flag.  ** is se
21730 74 2c 20 74 68 65 6e 20 72 65 76 65 72 73 65 20  t, then reverse 
21740 74 68 65 20 6f 72 64 65 72 20 74 68 61 74 20 74  the order that t
21750 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65  he index will be
21760 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e   scanned.  ** in
21770 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66  . This is used f
21780 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74  or application t
21790 65 73 74 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20  esting, to help 
217a0 66 69 6e 64 20 63 61 73 65 73 0a 20 20 2a 2a 20  find cases.  ** 
217b0 77 68 65 72 65 20 61 70 70 6c 69 63 61 74 69 6f  where applicatio
217c0 6e 20 62 65 68 61 76 69 6f 75 72 20 64 65 70 65  n behaviour depe
217d0 6e 64 73 20 6f 6e 20 74 68 65 20 28 75 6e 64 65  nds on the (unde
217e0 66 69 6e 65 64 29 20 6f 72 64 65 72 20 74 68 61  fined) order tha
217f0 74 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 6f 75  t.  ** SQLite ou
21800 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 69 6e  tputs rows in in
21810 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
21820 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
21830 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  se.  */.  if( !p
21840 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 50  ->pOrderBy && pP
21850 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
21860 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  & SQLITE_Reverse
21870 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 70 2d 3e  Order ){.    p->
21880 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
21890 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52  s |= WHERE_REVER
218a0 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  SE;.  }..  asser
218b0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 7c  t( p->pOrderBy |
218c0 7c 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e  | (p->cost.plan.
218d0 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  wsFlags&WHERE_OR
218e0 44 45 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 61  DERED)==0 );.  a
218f0 73 73 65 72 74 28 20 70 2d 3e 63 6f 73 74 2e 70  ssert( p->cost.p
21900 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 7c 7c  lan.u.pIdx==0 ||
21910 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77   (p->cost.plan.w
21920 73 46 6c 61 67 73 26 57 48 45 52 45 5f 52 4f 57  sFlags&WHERE_ROW
21930 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a 20 20 61  ID_EQ)==0 );.  a
21940 73 73 65 72 74 28 20 70 53 72 63 2d 3e 70 49 6e  ssert( pSrc->pIn
21950 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  dex==0 .       |
21960 7c 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75  | p->cost.plan.u
21970 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20 20 20 20  .pIdx==0 .      
21980 20 7c 7c 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e   || p->cost.plan
21990 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d 3e 70  .u.pIdx==pSrc->p
219a0 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20 20 57  Index .  );..  W
219b0 48 45 52 45 54 52 41 43 45 28 28 22 20 20 20 62  HERETRACE(("   b
219c0 65 73 74 20 69 6e 64 65 78 20 69 73 20 25 73 20  est index is %s 
219d0 63 6f 73 74 3d 25 2e 31 66 5c 6e 22 2c 0a 20 20  cost=%.1f\n",.  
219e0 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70         p->cost.p
219f0 6c 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70 2d 3e  lan.u.pIdx ? p->
21a00 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
21a10 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 2c  ->zName : "ipk",
21a20 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73  .         p->cos
21a30 74 2e 72 43 6f 73 74 29 29 3b 0a 20 20 0a 20 20  t.rCost));.  .  
21a40 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
21a50 78 28 70 29 3b 0a 20 20 62 65 73 74 41 75 74 6f  x(p);.  bestAuto
21a60 6d 61 74 69 63 49 6e 64 65 78 28 70 29 3b 0a 20  maticIndex(p);. 
21a70 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73   p->cost.plan.ws
21a80 46 6c 61 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d  Flags |= eqTermM
21a90 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  ask;.}../*.** Fi
21aa0 6e 64 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  nd the query pla
21ab0 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  n for accessing 
21ac0 74 61 62 6c 65 20 70 53 72 63 2d 3e 70 54 61 62  table pSrc->pTab
21ad0 2e 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62  . Write the.** b
21ae0 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61  est query plan a
21af0 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f  nd its cost into
21b00 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f   the WhereCost o
21b10 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20 0a  bject supplied .
21b20 2a 2a 20 61 73 20 74 68 65 20 6c 61 73 74 20 70  ** as the last p
21b30 61 72 61 6d 65 74 65 72 2e 20 54 68 69 73 20 66  arameter. This f
21b40 75 6e 63 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63  unction may calc
21b50 75 6c 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f  ulate the cost o
21b60 66 0a 2a 2a 20 62 6f 74 68 20 72 65 61 6c 20 61  f.** both real a
21b70 6e 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  nd virtual table
21b80 20 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   scans..**.** Th
21b90 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
21ba0 20 6e 6f 74 20 74 61 6b 65 20 4f 52 44 45 52 20   not take ORDER 
21bb0 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 69  BY or DISTINCT i
21bc0 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 20 20 4e 6f  nto account.  No
21bd0 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 72 65 6d  r.** does it rem
21be0 65 6d 62 65 72 20 74 68 65 20 76 69 72 74 75 61  ember the virtua
21bf0 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20 70 6c  l table query pl
21c00 61 6e 2e 20 20 41 6c 6c 20 69 74 20 64 6f 65 73  an.  All it does
21c10 20 69 73 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   is compute.** t
21c20 68 65 20 63 6f 73 74 20 77 68 69 6c 65 20 64 65  he cost while de
21c30 74 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 6e 20  termining if an 
21c40 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR optimization 
21c50 69 73 20 61 70 70 6c 69 63 61 62 6c 65 2e 20 20  is applicable.  
21c60 54 68 65 0a 2a 2a 20 64 65 74 61 69 6c 73 20 77  The.** details w
21c70 69 6c 6c 20 62 65 20 72 65 63 6f 6e 73 69 64 65  ill be reconside
21c80 72 65 64 20 6c 61 74 65 72 20 69 66 20 74 68 65  red later if the
21c90 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
21ca0 20 66 6f 75 6e 64 20 74 6f 20 62 65 0a 2a 2a 20   found to be.** 
21cb0 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2f 0a 73  applicable..*/.s
21cc0 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49  tatic void bestI
21cd0 6e 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64  ndex(WhereBestId
21ce0 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  x *p){.#ifndef S
21cf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
21d00 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
21d10 56 69 72 74 75 61 6c 28 70 2d 3e 70 53 72 63 2d  Virtual(p->pSrc-
21d20 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  >pTab) ){.    sq
21d30 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
21d40 20 2a 70 49 64 78 49 6e 66 6f 20 3d 20 30 3b 0a   *pIdxInfo = 0;.
21d50 20 20 20 20 70 2d 3e 70 70 49 64 78 49 6e 66 6f      p->ppIdxInfo
21d60 20 3d 20 26 70 49 64 78 49 6e 66 6f 3b 0a 20 20   = &pIdxInfo;.  
21d70 20 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64    bestVirtualInd
21d80 65 78 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  ex(p);.    asser
21d90 74 28 20 70 49 64 78 49 6e 66 6f 21 3d 30 20 7c  t( pIdxInfo!=0 |
21da0 7c 20 70 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  | p->pParse->db-
21db0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
21dc0 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
21dd0 6f 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  o && pIdxInfo->n
21de0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
21df0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21e00 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
21e10 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20  idxStr);.    }. 
21e20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
21e30 28 70 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  (p->pParse->db, 
21e40 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  pIdxInfo);.  }el
21e50 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
21e60 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78    bestBtreeIndex
21e70 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
21e80 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d  * Disable a term
21e90 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
21ea0 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64  ause.  Except, d
21eb0 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68  o not disable th
21ec0 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20  e term.** if it 
21ed0 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20  controls a LEFT 
21ee0 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69  OUTER JOIN and i
21ef0 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
21f00 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a  ate in the ON.**
21f10 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
21f20 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a   of that join..*
21f30 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68  *.** Consider th
21f40 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27  e term t2.z='ok'
21f50 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
21f60 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a  g queries:.**.**
21f70 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a     (1)  SELECT *
21f80 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
21f90 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
21fa0 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f  .x WHERE t2.z='o
21fb0 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c  k'.**   (2)  SEL
21fc0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
21fd0 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
21fe0 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
21ff0 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20  ='ok'.**   (3)  
22000 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
22010 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d  , t2 WHERE t1.a=
22020 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
22030 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e  k'.**.** The t2.
22040 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c  z='ok' is disabl
22050 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29  ed in the in (2)
22060 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67   because it orig
22070 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65  inates.** in the
22080 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65   ON clause.  The
22090 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65   term is disable
220a0 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65  d in (3) because
220b0 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a   it is not part.
220c0 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  ** of a LEFT OUT
220d0 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29  ER JOIN.  In (1)
220e0 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f  , the term is no
220f0 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a  t disabled..**.*
22100 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
22110 2d 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35 38 36  -OF: R-24597-586
22120 35 35 20 4e 6f 20 74 65 73 74 73 20 61 72 65 20  55 No tests are 
22130 64 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73 20 74  done for terms t
22140 68 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c  hat are.** compl
22150 65 74 65 6c 79 20 73 61 74 69 73 66 69 65 64 20  etely satisfied 
22160 62 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a  by indices..**.*
22170 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65  * Disabling a te
22180 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74  rm causes that t
22190 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65  erm to not be te
221a0 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65  sted in the inne
221b0 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65  r loop.** of the
221c0 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e   join.  Disablin
221d0 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  g is an optimiza
221e0 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d  tion.  When term
221f0 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  s are satisfied.
22200 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77  ** by indices, w
22210 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74  e disable them t
22220 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64  o prevent redund
22230 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65  ant tests in the
22240 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20   inner.** loop. 
22250 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68   We would get th
22260 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74  e correct result
22270 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72  s if nothing wer
22280 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c  e ever disabled,
22290 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69  .** but joins mi
222a0 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
222b0 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72   slower.  The tr
222c0 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c  ick is to disabl
222d0 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20  e as much.** as 
222e0 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64  we can without d
222f0 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63  isabling too muc
22300 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c  h.  If we disabl
22310 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20  ed in (1), we'd 
22320 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67  get.** the wrong
22330 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69   answer.  See ti
22340 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74  cket #813..*/.st
22350 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c  atic void disabl
22360 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c  eTerm(WhereLevel
22370 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54   *pLevel, WhereT
22380 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69  erm *pTerm){.  i
22390 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26  f( pTerm.      &
223a0 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  & (pTerm->wtFlag
223b0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
223c0 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65  =0.      && (pLe
223d0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d  vel->iLeftJoin==
223e0 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  0 || ExprHasProp
223f0 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
22400 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
22410 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  .  ){.    pTerm-
22420 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
22430 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20  _CODED;.    if( 
22440 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d  pTerm->iParent>=
22450 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
22460 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26  Term *pOther = &
22470 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54  pTerm->pWC->a[pT
22480 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20  erm->iParent];. 
22490 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68       if( (--pOth
224a0 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29  er->nChild)==0 )
224b0 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  {.        disabl
224c0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f  eTerm(pLevel, pO
224d0 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ther);.      }. 
224e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
224f0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66  * Code an OP_Aff
22500 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20  inity opcode to 
22510 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e  apply the column
22520 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
22530 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20   zAff.** to the 
22540 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  n registers star
22550 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a  ting at base. .*
22560 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d  *.** As an optim
22570 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f  ization, SQLITE_
22580 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73  AFF_NONE entries
22590 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f   (which are no-o
225a0 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65  ps) at the.** be
225b0 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20  ginning and end 
225c0 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f  of zAff are igno
225d0 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74  red.  If all ent
225e0 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65  ries in zAff are
225f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
22600 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64  ONE, then no cod
22610 65 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64  e gets generated
22620 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22630 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f  tine makes its o
22640 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20  wn copy of zAff 
22650 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  so that the call
22660 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f  er is free.** to
22670 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74   modify zAff aft
22680 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
22690 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74  returns..*/.stat
226a0 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c  ic void codeAppl
226b0 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20  yAffinity(Parse 
226c0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73  *pParse, int bas
226d0 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a  e, int n, char *
226e0 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76  zAff){.  Vdbe *v
226f0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
22700 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20  ;.  if( zAff==0 
22710 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22720 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
22730 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
22740 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
22750 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20  ert( v!=0 );..  
22760 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61  /* Adjust base a
22770 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65  nd n to skip ove
22780 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  r SQLITE_AFF_NON
22790 45 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65  E entries at the
227a0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20   beginning.  ** 
227b0 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61  and end of the a
227c0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
227d0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e    */.  while( n>
227e0 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51  0 && zAff[0]==SQ
227f0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
22800 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61  .    n--;.    ba
22810 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b  se++;.    zAff++
22820 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e  ;.  }.  while( n
22830 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d  >1 && zAff[n-1]=
22840 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
22850 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d   ){.    n--;.  }
22860 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
22870 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
22880 64 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  de if there is a
22890 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20  nything left to 
228a0 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30  do. */.  if( n>0
228b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
228c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
228d0 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20  Affinity, base, 
228e0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n);.    sqlite3V
228f0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
22900 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20  1, zAff, n);.   
22910 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
22920 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
22930 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29  pParse, base, n)
22940 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
22950 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
22960 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c  r a single equal
22970 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ity term of the 
22980 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41  WHERE clause.  A
22990 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65  n equality.** te
229a0 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72  rm can be either
229b0 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20   X=expr or X IN 
229c0 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69  (...).   pTerm i
229d0 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  s the term to be
229e0 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a   .** coded..**.*
229f0 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61  * The current va
22a00 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73  lue for the cons
22a10 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69  traint is left i
22a20 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  n register iReg.
22a30 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e  .**.** For a con
22a40 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66  straint of the f
22a50 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20  orm X=expr, the 
22a60 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76  expression is ev
22a70 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a  aluated and its.
22a80 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66  ** result is lef
22a90 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  t on the stack. 
22aa0 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   For constraints
22ab0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49   of the form X I
22ac0 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20  N (...).** this 
22ad0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
22ae0 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
22af0 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c   iterate over al
22b00 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a  l values of X..*
22b10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
22b20 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20  eEqualityTerm(. 
22b30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
22b40 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
22b50 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22b60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
22b70 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  m,   /* The term
22b80 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
22b90 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64  ause to be coded
22ba0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
22bb0 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65   *pLevel, /* The
22bc0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52   level of the FR
22bd0 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65  OM clause we are
22be0 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
22bf0 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20   int iEq,       
22c00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
22c10 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
22c20 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  rm within this l
22c30 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 54  evel */.  int iT
22c40 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a  arget         /*
22c50 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76   Attempt to leav
22c60 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69  e results in thi
22c70 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
22c80 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54  .  Expr *pX = pT
22c90 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64  erm->pExpr;.  Vd
22ca0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
22cb0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65  pVdbe;.  int iRe
22cc0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
22cd0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
22ce0 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20  holding results 
22cf0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54  */..  assert( iT
22d00 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28  arget>0 );.  if(
22d10 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
22d20 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  {.    iReg = sql
22d30 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
22d40 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  et(pParse, pX->p
22d50 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
22d60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d  .  }else if( pX-
22d70 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29  >op==TK_ISNULL )
22d80 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  {.    iReg = iTa
22d90 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rget;.    sqlite
22da0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22db0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29  P_Null, 0, iReg)
22dc0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
22dd0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
22de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
22df0 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69  eType;.    int i
22e00 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Tab;.    struct 
22e10 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
22e20 20 75 38 20 62 52 65 76 3b 0a 0a 20 20 20 20 69   u8 bRev;..    i
22e30 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
22e40 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
22e50 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
22e60 20 20 20 20 20 20 62 52 65 76 20 3d 20 70 4c 65        bRev = pLe
22e70 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
22e80 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71  ->aSortOrder[iEq
22e90 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
22ea0 20 20 20 20 62 52 65 76 20 3d 20 30 3b 0a 20 20      bRev = 0;.  
22eb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
22ec0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
22ed0 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   & WHERE_REVERSE
22ee0 20 29 20 62 52 65 76 20 3d 20 31 20 2d 20 62 52   ) bRev = 1 - bR
22ef0 65 76 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ev;.    assert( 
22f00 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
22f10 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
22f20 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  get;.    eType =
22f30 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
22f40 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20  dex(pParse, pX, 
22f50 30 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70  0);.    iTab = p
22f60 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73  X->iTable;.    s
22f70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22f80 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
22f90 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
22fa0 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73  iTab, 0);.    as
22fb0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  sert( pLevel->pl
22fc0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
22fd0 52 45 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20 20  RE_IN_ABLE );.  
22fe0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e    if( pLevel->u.
22ff0 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20  in.nIn==0 ){.   
23000 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e     pLevel->addrN
23010 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
23020 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
23030 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
23040 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20  u.in.nIn++;.    
23050 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
23060 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71  Loop =.       sq
23070 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
23080 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
23090 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
230a0 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  nLoop,.         
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230c0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76       sizeof(pLev
230d0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
230e0 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69  [0])*pLevel->u.i
230f0 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20  n.nIn);.    pIn 
23100 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  = pLevel->u.in.a
23110 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  InLoop;.    if( 
23120 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  pIn ){.      pIn
23130 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   += pLevel->u.in
23140 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20  .nIn - 1;.      
23150 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62  pIn->iCur = iTab
23160 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
23170 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
23180 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  D ){.        pIn
23190 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
231a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
231b0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
231c0 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  b, iReg);.      
231d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
231e0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
231f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23200 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
23210 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a  iTab, 0, iReg);.
23220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
23230 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20  n->eEndLoopOp = 
23240 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
23250 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
23260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23270 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
23280 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iReg);.    }else
23290 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
232a0 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20  u.in.nIn = 0;.  
232b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
232c0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
232d0 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72  vel, pTerm);.  r
232e0 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
232f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
23300 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
23310 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64  luate all == and
23320 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
23330 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e  for an.** index.
23340 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
23350 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
23360 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
23370 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
23380 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
23390 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
233a0 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
233b0 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
233c0 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
233d0 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
233e0 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
233f0 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
23400 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
23410 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
23420 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
23430 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
23440 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
23450 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
23460 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
23470 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
23480 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
23490 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
234a0 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
234b0 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
234c0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
234d0 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
234e0 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
234f0 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
23500 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
23510 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
23520 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
23530 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
23540 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
23550 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
23560 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
23570 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
23580 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
23590 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
235a0 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
235b0 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
235c0 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
235d0 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
235e0 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
235f0 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
23600 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20  ory cell and.** 
23610 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69  compute the affi
23620 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  nity string..**.
23630 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23640 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73  always allocates
23650 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65   at least one me
23660 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
23670 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64  turns.** the ind
23680 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72  ex of that memor
23690 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65  y cell. The code
236a0 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74   that.** calls t
236b0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
236c0 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79   use that memory
236d0 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74   cell to store t
236e0 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
236f0 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
23700 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
23710 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
23720 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
23730 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
23740 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
23750 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
23760 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
23770 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
23780 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
23790 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20  turning, *pzAff 
237a0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
237b0 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
237c0 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79  aining a.** copy
237d0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
237e0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
237f0 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f  f the index allo
23800 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
23810 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
23820 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65  . Except, entrie
23830 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66  s in the copy of
23840 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f   the string asso
23850 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65  ciated.** with e
23860 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
23870 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e  nts that use NON
23880 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73  E affinity are s
23890 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f  et to.** SQLITE_
238a0 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69  AFF_NONE. This i
238b0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  s to deal with S
238c0 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66  QL such as the f
238d0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
238e0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
238f0 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59  1(a TEXT PRIMARY
23900 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53   KEY, b);.**   S
23910 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
23920 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52  1 AS t2, t1 WHER
23930 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a  E t1.a = t2.b;.*
23940 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
23950 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69  ple above, the i
23960 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61  ndex on t1(a) ha
23970 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e  s TEXT affinity.
23980 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68   But since.** th
23990 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64  e right hand sid
239a0 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  e of the equalit
239b0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32  y constraint (t2
239c0 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66  .b) has NONE aff
239d0 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e  inity,.** no con
239e0 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62  version should b
239f0 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f  e attempted befo
23a00 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20  re using a t2.b 
23a10 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66  value as part of
23a20 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61  .** a key to sea
23a30 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48  rch the index. H
23a40 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62  ence the first b
23a50 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72  yte in the retur
23a60 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ned affinity.** 
23a70 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65  string in this e
23a80 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20  xample would be 
23a90 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46  set to SQLITE_AF
23aa0 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69  F_NONE..*/.stati
23ab0 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75  c int codeAllEqu
23ac0 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
23ad0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
23ae0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
23af0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
23b00 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
23b10 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
23b20 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
23b30 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
23b40 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
23b50 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
23b60 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
23b70 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
23b80 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68  Ready,     /* Wh
23b90 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f  ich parts of FRO
23ba0 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  M have not yet b
23bb0 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  een coded */.  i
23bc0 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20  nt nExtraReg,   
23bd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23be0 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
23bf0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
23c00 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20  .  char **pzAff 
23c10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
23c20 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   Set to point to
23c30 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
23c40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71   */.){.  int nEq
23c50 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
23c60 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75  nEq;   /* The nu
23c70 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
23c80 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
23c90 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  code */.  Vdbe *
23ca0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
23cb0 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  e;      /* The v
23cc0 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  m under construc
23cd0 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
23ce0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
23cf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
23d00 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20  ndex being used 
23d10 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
23d20 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c  .  int iCur = pL
23d30 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20  evel->iTabCur;  
23d40 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
23d50 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
23d60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
23d70 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
23d80 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
23d90 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
23da0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23dc0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
23dd0 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23df0 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
23e00 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23e30 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
23e40 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
23e50 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
23e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
23e70 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
23e80 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
23e90 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
23ea0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
23eb0 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
23ec0 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
23ed0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
23ee0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
23ef0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
23f00 29 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 65 76  );.  pIdx = pLev
23f10 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
23f20 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
23f30 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
23f40 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
23f50 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
23f60 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20  te them..  */.  
23f70 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65  regBase = pParse
23f80 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52  ->nMem + 1;.  nR
23f90 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  eg = pLevel->pla
23fa0 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65  n.nEq + nExtraRe
23fb0 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  g;.  pParse->nMe
23fc0 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41  m += nReg;..  zA
23fd0 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
23fe0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
23ff0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
24000 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
24010 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20  ));.  if( !zAff 
24020 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ){.    pParse->d
24030 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24040 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  = 1;.  }..  /* E
24050 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61  valuate the equa
24060 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
24070 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
24080 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e  pIdx->nColumn>=n
24090 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  Eq );.  for(j=0;
240a0 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
240b0 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e    int r1;.    in
240c0 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t k = pIdx->aiCo
240d0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65  lumn[j];.    pTe
240e0 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
240f0 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
24100 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c  eady, pLevel->pl
24110 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70 49 64 78  an.wsFlags, pIdx
24120 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
24130 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
24140 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
24150 67 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63  g true for indic
24160 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e  es with redundan
24170 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20  t columns. .    
24180 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e  ** Ex: CREATE IN
24190 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62  DEX i1 ON t1(a,b
241a0 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  ,a); SELECT * FR
241b0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20  OM t1 WHERE a=0 
241c0 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20  AND b=0; */.    
241d0 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d  testcase( (pTerm
241e0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
241f0 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20  _CODED)!=0 );.  
24200 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
24210 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
24220 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
24230 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
24240 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f  2 */.    r1 = co
24250 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
24260 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
24270 65 76 65 6c 2c 20 6a 2c 20 72 65 67 42 61 73 65  evel, j, regBase
24280 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21  +j);.    if( r1!
24290 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20  =regBase+j ){.  
242a0 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20      if( nReg==1 
242b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
242c0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
242d0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
242e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61  );.        regBa
242f0 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d  se = r1;.      }
24300 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
24310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24320 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  v, OP_SCopy, r1,
24330 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
24340 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
24350 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
24360 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
24370 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
24380 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
24390 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
243a0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
243b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
243c0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
243d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
243e0 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
243f0 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
24400 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
24410 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
24420 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
24430 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d  gBase+j, pLevel-
24440 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20  >addrBrk);.     
24450 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20   if( zAff ){.   
24460 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
24470 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
24480 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
24490 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
244a0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
244b0 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
244c0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
244d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
244e0 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
244f0 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
24500 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
24510 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
24520 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
24530 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
24540 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24550 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
24560 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
24570 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e  regBase;.}..#ifn
24580 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24590 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68  EXPLAIN./*.** Th
245a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
245b0 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61  helper for expla
245c0 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62  inIndexRange() b
245d0 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20  elow.**.** pStr 
245e0 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f  holds the text o
245f0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
24600 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c  that we are buil
24610 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d  ding up one term
24620 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20  .** at a time.  
24630 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
24640 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  s a new term to 
24650 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65  the end of the e
24660 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65  xpression..** Te
24670 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65  rms are separate
24680 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20  d by AND so add 
24690 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66  the "AND" text f
246a0 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  or second and su
246b0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d  bsequent.** term
246c0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
246d0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70  c void explainAp
246e0 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41  pendTerm(.  StrA
246f0 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20  ccum *pStr,     
24700 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
24710 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ext expression b
24720 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20  eing built */.  
24730 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20  int iTerm,      
24740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24750 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72  ndex of this ter
24760 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72  m.  First is zer
24770 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  o */.  const cha
24780 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  r *zColumn,     
24790 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
247a0 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  e column */.  co
247b0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20  nst char *zOp   
247c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
247d0 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
247e0 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54  r */.){.  if( iT
247f0 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72  erm ) sqlite3Str
24800 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
24810 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
24820 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
24830 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f  Append(pStr, zCo
24840 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c  lumn, -1);.  sql
24850 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
24860 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29  nd(pStr, zOp, 1)
24870 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
24880 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
24890 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  "?", 1);.}../*.*
248a0 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65  * Argument pLeve
248b0 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74  l describes a st
248c0 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e  rategy for scann
248d0 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ing table pTab. 
248e0 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
248f0 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
24900 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
24910 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
24920 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a  g a description.
24930 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74  ** of the subset
24940 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73   of table rows s
24950 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74  canned by the st
24960 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f  rategy in the fo
24970 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20  rm of an.** SQL 
24980 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20  expression. Or, 
24990 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
249a0 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73  scanned, NULL is
249b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
249c0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
249d0 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a   the query:.**.*
249e0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
249f0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41  M t1 WHERE a=1 A
24a00 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73  ND b>2;.**.** is
24a10 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69   run and there i
24a20 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  s an index on (a
24a30 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20  , b), then this 
24a40 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
24a50 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d   a.** string sim
24a60 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
24a70 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a   "a=? AND b>?".*
24a80 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
24a90 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  d pointer points
24aa0 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   to memory obtai
24ab0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
24ac0 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  DbMalloc()..** I
24ad0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
24ae0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
24af0 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68  aller to free th
24b00 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74  e buffer when it
24b10 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
24b20 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
24b30 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61  atic char *expla
24b40 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c  inIndexRange(sql
24b50 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
24b60 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 54 61  evel *pLevel, Ta
24b70 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 57 68  ble *pTab){.  Wh
24b80 65 72 65 50 6c 61 6e 20 2a 70 50 6c 61 6e 20 3d  erePlan *pPlan =
24b90 20 26 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b 0a   &pLevel->plan;.
24ba0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
24bb0 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70 49 64 78 3b  = pPlan->u.pIdx;
24bc0 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 50 6c  .  int nEq = pPl
24bd0 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74 20 69  an->nEq;.  int i
24be0 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  , j;.  Column *a
24bf0 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
24c00 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d  ;.  int *aiColum
24c10 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
24c20 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d  lumn;.  StrAccum
24c30 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71   txt;..  if( nEq
24c40 3d 3d 30 20 26 26 20 28 70 50 6c 61 6e 2d 3e 77  ==0 && (pPlan->w
24c50 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
24c60 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
24c70 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29  TOP_LIMIT))==0 )
24c80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
24c90 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
24ca0 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20  AccumInit(&txt, 
24cb0 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58  0, 0, SQLITE_MAX
24cc0 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e  _LENGTH);.  txt.
24cd0 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74  db = db;.  sqlit
24ce0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
24cf0 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b  (&txt, " (", 2);
24d00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45  .  for(i=0; i<nE
24d10 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70  q; i++){.    exp
24d20 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
24d30 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43  txt, i, aCol[aiC
24d40 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c  olumn[i]].zName,
24d50 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20   "=");.  }..  j 
24d60 3d 20 69 3b 0a 20 20 69 66 28 20 70 50 6c 61 6e  = i;.  if( pPlan
24d70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
24d80 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
24d90 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
24da0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
24db0 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
24dc0 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
24dd0 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
24de0 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
24df0 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a  , i++, z, ">");.
24e00 20 20 7d 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d    }.  if( pPlan-
24e10 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54  >wsFlags&WHERE_T
24e20 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
24e30 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
24e40 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
24e50 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
24e60 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
24e70 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
24e80 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
24e90 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d   i, z, "<");.  }
24ea0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
24eb0 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
24ec0 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  )", 1);.  return
24ed0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
24ee0 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a  Finish(&txt);.}.
24ef0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
24f00 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
24f10 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79  unless currently
24f20 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45   processing an E
24f30 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
24f40 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66  N.** command. If
24f50 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67   the query being
24f60 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20   compiled is an 
24f70 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
24f80 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  AN, a single.** 
24f90 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20  record is added 
24fa0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f  to the output to
24fb0 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61   describe the ta
24fc0 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
24fd0 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e  y in .** pLevel.
24fe0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24ff0 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
25000 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25020 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
25030 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
25040 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
25050 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
25060 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20   list this loop 
25070 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57  refers to */.  W
25080 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
25090 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
250a0 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20  * Scan to write 
250b0 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  OP_Explain opcod
250c0 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  e for */.  int i
250d0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
250e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
250f0 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20  lue for "level" 
25100 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
25110 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
25140 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e  or "from" column
25150 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
25160 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
25170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25180 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
25190 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
251a0 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69  egin() */.){.  i
251b0 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
251c0 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 75 33 32  in==2 ){.    u32
251d0 20 66 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d   flags = pLevel-
251e0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  >plan.wsFlags;. 
251f0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
25200 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
25210 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
25220 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
25230 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
25240 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
25250 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74  * VM being const
25260 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71  ructed */.    sq
25270 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
25280 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44  se->db;     /* D
25290 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
252a0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  /.    char *zMsg
252b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
252c0 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61      /* Text to a
252d0 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74  dd to EQP output
252e0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
252f0 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20 20 20 20  int64 nRow;     
25300 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
25310 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
25320 20 76 69 73 69 74 65 64 20 62 79 20 73 63 61 6e   visited by scan
25330 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20   */.    int iId 
25340 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
25350 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20  tId;  /* Select 
25360 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75  id (left-most ou
25370 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a  tput column) */.
25380 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68      int isSearch
25390 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
253a0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
253b0 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f  SEARCH. False fo
253c0 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20 20 20 20  r SCAN. */..    
253d0 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
253e0 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77  _MULTI_OR) || (w
253f0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
25400 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29  ONETABLE_ONLY) )
25410 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73   return;..    is
25420 53 65 61 72 63 68 20 3d 20 28 70 4c 65 76 65 6c  Search = (pLevel
25430 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29 0a 20 20  ->plan.nEq>0).  
25440 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 66             || (f
25450 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
25460 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
25470 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20  LIMIT))!=0.     
25480 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72          || (wctr
25490 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52  lFlags&(WHERE_OR
254a0 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f  DERBY_MIN|WHERE_
254b0 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a  ORDERBY_MAX));..
254c0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
254d0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
254e0 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45  s", isSearch?"SE
254f0 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20  ARCH":"SCAN");. 
25500 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
25510 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
25520 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
25530 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
25540 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  "%s SUBQUERY %d"
25550 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53  , zMsg,pItem->iS
25560 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65  electId);.    }e
25570 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  lse{.      zMsg 
25580 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
25590 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
255a0 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c  TABLE %s", zMsg,
255b0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
255c0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
255d0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
255e0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
255f0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
25600 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73   zMsg, "%s AS %s
25610 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
25620 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20  zAlias);.    }. 
25630 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
25640 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
25650 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
25660 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69  *zWhere = explai
25670 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20  nIndexRange(db, 
25680 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d 2d 3e 70  pLevel, pItem->p
25690 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67  Tab);.      zMsg
256a0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
256b0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
256c0 20 55 53 49 4e 47 20 25 73 25 73 49 4e 44 45 58   USING %s%sINDEX
256d0 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20 0a  %s%s%s", zMsg, .
256e0 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
256f0 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
25700 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54 49 43  NDEX)?"AUTOMATIC
25710 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20   ":""),.        
25720 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
25730 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f 56  E_IDX_ONLY)?"COV
25740 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20 20  ERING ":""),.   
25750 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
25760 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
25770 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20 20  X)?"":" "),.    
25780 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
25790 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
257a0 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d 3e 70 6c  )?"": pLevel->pl
257b0 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
257c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68  ),.          zWh
257d0 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ere.      );.   
257e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
257f0 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  (db, zWhere);.  
25800 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
25810 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
25820 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
25830 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
25840 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
25850 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
25860 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47   "%s USING INTEG
25870 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  ER PRIMARY KEY",
25880 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69   zMsg);..      i
25890 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 52  f( flags&WHERE_R
258a0 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 20  OWID_EQ ){.     
258b0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
258c0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
258d0 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f  sg, "%s (rowid=?
258e0 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
258f0 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67   }else if( (flag
25900 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  s&WHERE_BOTH_LIM
25910 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f  IT)==WHERE_BOTH_
25920 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
25930 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
25940 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
25950 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41  , "%s (rowid>? A
25960 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  ND rowid<?)", zM
25970 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
25980 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
25990 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
259a0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
259b0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
259c0 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
259d0 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d>?)", zMsg);.  
259e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
259f0 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ags&WHERE_TOP_LI
25a00 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
25a10 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
25a20 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
25a30 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20  "%s (rowid<?)", 
25a40 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMsg);.      }. 
25a50 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
25a60 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
25a70 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69  TABLE.    else i
25a80 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
25a90 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
25aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
25ab0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
25ac0 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65  pVtabIdx = pLeve
25ad0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49  l->plan.u.pVtabI
25ae0 64 78 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  dx;.      zMsg =
25af0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
25b00 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56  (db, zMsg, "%s V
25b10 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
25b20 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c  EX %d:%s", zMsg,
25b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25b40 20 20 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78     pVtabIdx->idx
25b50 4e 75 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e 69  Num, pVtabIdx->i
25b60 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65  dxStr);.    }.#e
25b70 6e 64 69 66 0a 20 20 20 20 69 66 28 20 77 63 74  ndif.    if( wct
25b80 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f  rlFlags&(WHERE_O
25b90 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45  RDERBY_MIN|WHERE
25ba0 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 20 29 7b  _ORDERBY_MAX) ){
25bb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25bc0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
25bd0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
25be0 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20  );.      nRow = 
25bf0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
25c00 20 20 20 20 6e 52 6f 77 20 3d 20 28 73 71 6c 69      nRow = (sqli
25c10 74 65 33 5f 69 6e 74 36 34 29 70 4c 65 76 65 6c  te3_int64)pLevel
25c20 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20  ->plan.nRow;.   
25c30 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71   }.    zMsg = sq
25c40 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
25c50 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25 6c  , zMsg, "%s (~%l
25c60 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67 2c  ld rows)", zMsg,
25c70 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69   nRow);.    sqli
25c80 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
25c90 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64   OP_Explain, iId
25ca0 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c  , iLevel, iFrom,
25cb0 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
25cc0 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
25cd0 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
25ce0 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c  OneScan(u,v,w,x,
25cf0 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
25d00 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
25d10 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  IN */.../*.** Ge
25d20 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
25d30 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
25d40 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20   iLevel-th loop 
25d50 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
25d60 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  use.** implement
25d70 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
25d80 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74  by pWInfo..*/.st
25d90 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64  atic Bitmask cod
25da0 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20  eOneLoopStart(. 
25db0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
25dc0 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74  fo,   /* Complet
25dd0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
25de0 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  out the WHERE cl
25df0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
25e00 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  evel,          /
25e10 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66  * Which level of
25e20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f   pWInfo->a[] sho
25e30 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a  uld be coded */.
25e40 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
25e50 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ,      /* One of
25e60 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
25e70 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
25e80 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42  liteInt.h */.  B
25e90 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
25ea0 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
25eb0 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
25ec0 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
25ed0 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
25ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
25ef0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
25f00 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
25f10 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
25f20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
25f30 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
25f40 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
25f50 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
25f60 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
25f70 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
25f80 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
25f90 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
25fa0 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
25fb0 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
25fc0 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
25fd0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25fe0 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
25ff0 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
26000 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
26010 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
26020 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
26030 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
26040 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
26050 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f  C;    /* Decompo
26060 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e  sition of the en
26070 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  tire WHERE claus
26080 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
26090 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
260a0 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52         /* A WHER
260b0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  E clause term */
260c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
260d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
260e0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
260f0 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20  ntext */.  Vdbe 
26100 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
26110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26120 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20  e prepared stmt 
26130 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
26140 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ons */.  struct 
26150 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
26160 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d  abItem;  /* FROM
26170 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
26180 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
26190 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20  t addrBrk;      
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
261b0 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
261c0 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
261d0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
261e0 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rCont;          
261f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
26200 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
26210 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c  e with next cycl
26220 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69  e */.  int iRowi
26230 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  dReg = 0;       
26240 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f   /* Rowid is sto
26250 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69  red in this regi
26260 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72  ster, if not zer
26270 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65  o */.  int iRele
26280 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20  aseReg = 0;     
26290 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
262a0 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65  r to free before
262b0 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20   returning */.. 
262c0 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
262d0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20  ->pParse;.  v = 
262e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
262f0 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   pWC = pWInfo->p
26300 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  WC;.  pLevel = &
26310 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
26320 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  ];.  pTabItem = 
26330 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
26340 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
26350 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
26360 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
26370 0a 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65  .  bRev = (pLeve
26380 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
26390 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
263a0 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65  !=0;.  omitTable
263b0 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
263c0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
263d0 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20  _IDX_ONLY)!=0 . 
263e0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63            && (wc
263f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26400 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30  _FORCE_TABLE)==0
26410 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c  ;..  /* Create l
26420 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62  abels for the "b
26430 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69  reak" and "conti
26440 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  nue" instruction
26450 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63  s.  ** for the c
26460 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
26470 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f  mp to addrBrk to
26480 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
26490 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20  loop..  ** Jump 
264a0 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d  to cont to go im
264b0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65  mediately to the
264c0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
264d0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70  of the.  ** loop
264e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
264f0 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20   there is an IN 
26500 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73  operator, we als
26510 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78  o have a "addrNx
26520 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20  t" label that.  
26530 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
26540 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
26550 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
26560 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
26570 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f   ** there are no
26580 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e   IN operators in
26590 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
265a0 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20  , the "addrNxt" 
265b0 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68  label.  ** is th
265c0 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42  e same as "addrB
265d0 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  rk"..  */.  addr
265e0 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
265f0 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
26600 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
26610 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
26620 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  );.  addrCont = 
26630 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
26640 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
26650 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
26660 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
26670 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
26680 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
26690 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
266a0 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
266b0 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  a memory cell th
266c0 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68  at records if th
266d0 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73  is table matches
266e0 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   any.  ** row of
266f0 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
26700 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
26710 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
26720 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62  iFrom>0 && (pTab
26730 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  Item[0].jointype
26740 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
26750 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c  {.    pLevel->iL
26760 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
26770 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
26780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
26790 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
267a0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
267b0 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
267c0 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20  mment((v, "init 
267d0 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
267e0 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a  ch flag"));.  }.
267f0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
26800 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  se of a FROM cla
26810 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70  use subquery imp
26820 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
26830 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66  -routine */.  if
26840 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43  ( pTabItem->viaC
26850 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
26860 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
26870 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
26880 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
26890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
268a0 49 6e 74 65 67 65 72 2c 20 70 54 61 62 49 74 65  Integer, pTabIte
268b0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 2d 31  m->addrFillSub-1
268c0 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
268d0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73   pLevel->p2 =  s
268e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
268f0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
26900 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62  gYield);.    Vdb
26910 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
26920 78 74 20 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75  xt row of co-rou
26930 74 69 6e 65 20 25 73 22 2c 20 70 54 61 62 49 74  tine %s", pTabIt
26940 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
26950 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
26960 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
26970 66 2c 20 72 65 67 59 69 65 6c 64 2b 31 2c 20 61  f, regYield+1, a
26980 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65  ddrBrk);.    pLe
26990 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74  vel->op = OP_Got
269a0 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  o;.  }else..#ifn
269b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
269c0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
269d0 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  f(  (pLevel->pla
269e0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
269f0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
26a00 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  =0 ){.    /* Cas
26a10 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20  e 0:  The table 
26a20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  is a virtual-tab
26a30 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69  le.  Use the VFi
26a40 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20  lter and VNext. 
26a50 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74     **          t
26a60 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
26a70 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  a..    */.    in
26a80 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20  t iReg;   /* P3 
26a90 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69  Value for OP_VFi
26aa0 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lter */.    int 
26ab0 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20  addrNotFound;.  
26ac0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
26ad0 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d  info *pVtabIdx =
26ae0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
26af0 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20 69 6e  pVtabIdx;.    in
26b00 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
26b10 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f 6e 73 74  pVtabIdx->nConst
26b20 72 61 69 6e 74 3b 0a 20 20 20 20 73 74 72 75 63  raint;.    struc
26b30 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
26b40 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
26b50 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20   *aUsage =.     
26b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b80 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
26b90 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
26ba0 55 73 61 67 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Usage;.    const
26bb0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
26bc0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
26bd0 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a   *aConstraint =.
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74  pVtabIdx->aConst
26c20 72 61 69 6e 74 3b 0a 0a 20 20 20 20 73 71 6c 69  raint;..    sqli
26c30 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
26c40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52  (pParse);.    iR
26c50 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
26c60 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
26c70 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
26c80 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e  .    addrNotFoun
26c90 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
26ca0 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  Brk;.    for(j=1
26cb0 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ; j<=nConstraint
26cc0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; j++){.      fo
26cd0 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72  r(k=0; k<nConstr
26ce0 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  aint; k++){.    
26cf0 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b      if( aUsage[k
26d00 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29  ].argvIndex==j )
26d10 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
26d20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a  iTarget = iReg+j
26d30 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54  +1;.          pT
26d40 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 61 43  erm = &pWC->a[aC
26d50 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65  onstraint[k].iTe
26d60 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20  rmOffset];.     
26d70 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
26d80 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
26d90 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
26da0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
26db0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
26dc0 20 70 4c 65 76 65 6c 2c 20 6b 2c 20 69 54 61 72   pLevel, k, iTar
26dd0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  get);.          
26de0 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
26df0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
26e00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
26e10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
26e20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
26e30 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Parse, pTerm->pE
26e40 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
26e50 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rget);.         
26e60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
26e70 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
26e80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26e90 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  k==nConstraint )
26ea0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
26eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26ec0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
26ed0 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78  r, pVtabIdx->idx
26ee0 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
26ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26f00 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
26f10 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20   j-1, iReg+1);. 
26f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26f30 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
26f40 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f  er, iCur, addrNo
26f50 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 20 70 56  tFound, iReg, pV
26f60 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a  tabIdx->idxStr,.
26f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f80 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
26f90 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
26fa0 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20   ? P4_MPRINTF : 
26fb0 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
26fc0 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f  pVtabIdx->needTo
26fd0 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
26fe0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
26ff0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
27000 7b 0a 20 20 20 20 20 20 69 66 28 20 61 55 73 61  {.      if( aUsa
27010 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20  ge[j].omit ){.  
27020 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20        int iTerm 
27030 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d  = aConstraint[j]
27040 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  .iTermOffset;.  
27050 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
27060 6d 28 70 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e  m(pLevel, &pWC->
27070 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20  a[iTerm]);.     
27080 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65   }.    }.    pLe
27090 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65  vel->op = OP_VNe
270a0 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
270b0 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
270c0 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69  Level->p2 = sqli
270d0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
270e0 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
270f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
27100 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ge(pParse, iReg,
27110 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
27120 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
27130 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
27140 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e   1);.  }else.#en
27150 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
27160 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
27170 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 65 76 65 6c  */..  if( pLevel
27180 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
27190 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20   WHERE_ROWID_EQ 
271a0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
271b0 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
271c0 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
271d0 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
271e0 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  an.    **       
271f0 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70     equality comp
27200 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
27210 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20  he ROWID field. 
27220 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   Or.    **      
27230 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65      we reference
27240 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75   multiple rows u
27250 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e  sing a "rowid IN
27260 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20   (...)".    **  
27270 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63          construc
27280 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 52  t..    */.    iR
27290 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69  eleaseReg = sqli
272a0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
272b0 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65 72 6d  arse);.    pTerm
272c0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
272d0 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
272e0 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
272f0 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
27300 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
27310 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
27320 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  >pExpr!=0 );.   
27330 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
27340 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  le==0 );.    tes
27350 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
27360 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
27370 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
27380 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
27390 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
273a0 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
273b0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
273c0 70 4c 65 76 65 6c 2c 20 30 2c 20 69 52 65 6c 65  pLevel, 0, iRele
273d0 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64  aseReg);.    add
273e0 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
273f0 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69  ddrNxt;.    sqli
27400 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27410 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
27420 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78  RowidReg, addrNx
27430 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
27440 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
27450 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
27460 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
27470 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
27480 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
27490 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
274a0 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a   iRowidReg, 1);.
274b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
274c0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
274d0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
274e0 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65  idReg);.    Vdbe
274f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
27500 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ));.    pLevel->
27510 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
27520 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
27530 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
27540 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
27550 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  GE ){.    /* Cas
27560 65 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 2:  We have an
27570 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
27580 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
27590 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
275a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74      */.    int t
275b0 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
275c0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a  .    int start;.
275d0 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61      int memEndVa
275e0 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  lue = 0;.    Whe
275f0 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20  reTerm *pStart, 
27600 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65  *pEnd;..    asse
27610 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
27620 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   );.    pStart =
27630 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
27640 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
27650 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
27660 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 66  0);.    pEnd = f
27670 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
27680 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
27690 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29   WO_LT|WO_LE, 0)
276a0 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29  ;.    if( bRev )
276b0 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
276c0 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53  pStart;.      pS
276d0 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
276e0 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
276f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
27700 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
27710 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
27720 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
27730 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69  ession that defi
27740 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f  nes the start bo
27750 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
27760 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20   r1, rTemp;     
27770 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
27780 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  for holding the 
27790 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a  start boundary *
277a0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
277b0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61  following consta
277c0 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f  nt maps TK_xx co
277d0 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70  des into corresp
277e0 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  onding .      **
277f0 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20   seek opcodes.  
27800 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20  It depends on a 
27810 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
27820 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20  ing of TK_xx.   
27830 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
27840 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d  t u8 aMoveOp[] =
27850 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {.           /*
27860 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_GT */  OP_Se
27870 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ekGt,.          
27880 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50   /* TK_LE */  OP
27890 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20  _SeekLe,.       
278a0 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20      /* TK_LT */ 
278b0 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20   OP_SeekLt,.    
278c0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20         /* TK_GE 
278d0 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20  */  OP_SeekGe.  
278e0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73      };.      ass
278f0 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47  ert( TK_LE==TK_G
27900 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d  T+1 );      /* M
27910 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64  ake sure the ord
27920 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20  ering.. */.     
27930 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
27940 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20  TK_GT+2 );      
27950 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54  /*  ... of the T
27960 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a  K_xx values... *
27970 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
27980 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29  TK_GE==TK_GT+3 )
27990 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69  ;      /*  ... i
279a0 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a  s correcct. */..
279b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
279c0 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
279d0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
279e0 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
279f0 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20  -11662 */.      
27a00 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78  pX = pStart->pEx
27a10 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
27a20 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
27a30 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d   assert( pStart-
27a40 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
27a50 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  r );.      r1 = 
27a60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27a70 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  emp(pParse, pX->
27a80 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b  pRight, &rTemp);
27a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27aa0 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76  beAddOp3(v, aMov
27ab0 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54  eOp[pX->op-TK_GT
27ac0 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
27ad0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
27ae0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
27af0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
27b00 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
27b10 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
27b20 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
27b30 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
27b40 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54  mpReg(pParse, rT
27b50 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61  emp);.      disa
27b60 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
27b70 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c  pStart);.    }el
27b80 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
27b90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
27ba0 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
27bb0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
27bc0 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d   addrBrk);.    }
27bd0 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
27be0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
27bf0 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64  .      pX = pEnd
27c00 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
27c10 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
27c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
27c30 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  nd->leftCursor==
27c40 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65  iCur );.      te
27c50 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74  stcase( pEnd->wt
27c60 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
27c70 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
27c80 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
27c90 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75        memEndValu
27ca0 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  e = ++pParse->nM
27cb0 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
27cc0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
27cd0 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65  , pX->pRight, me
27ce0 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20  mEndValue);.    
27cf0 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
27d00 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LT || pX->op==T
27d10 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20  K_GT ){.        
27d20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
27d30 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20  OP_Le : OP_Ge;. 
27d40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27d50 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
27d60 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
27d70 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
27d80 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
27d90 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
27da0 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71  }.    start = sq
27db0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
27dc0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65  Addr(v);.    pLe
27dd0 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
27de0 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
27df0 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
27e00 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
27e10 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
27e20 74 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  t;.    if( pStar
27e30 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20  t==0 && pEnd==0 
27e40 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
27e50 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
27e60 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
27e70 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65  _STEP;.    }else
27e80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
27e90 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b  pLevel->p5==0 );
27ea0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74  .    }.    if( t
27eb0 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
27ec0 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
27ed0 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
27ee0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
27ef0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
27f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27f10 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
27f20 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65  , iCur, iRowidRe
27f30 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
27f40 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
27f50 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
27f60 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
27f70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27f80 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c  ddOp3(v, testOp,
27f90 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64   memEndValue, ad
27fa0 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67  drBrk, iRowidReg
27fb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27fc0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
27fd0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
27fe0 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  IC | SQLITE_JUMP
27ff0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  IFNULL);.    }. 
28000 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
28010 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
28020 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
28030 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55  RANGE|WHERE_COLU
28040 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a  MN_EQ) ){.    /*
28050 20 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20   Case 3: A scan 
28060 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a  using an index..
28070 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
28080 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20        The WHERE 
28090 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61  clause may conta
280a0 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  in zero or more 
280b0 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a  equality .    **
280c0 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28           terms (
280d0 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65  "==" or "IN" ope
280e0 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66  rators) that ref
280f0 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20  er to the N.    
28100 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d  **         left-
28110 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  most columns of 
28120 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61  the index. It ma
28130 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20  y also contain. 
28140 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
28150 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
28160 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f  ints (>, <, >= o
28170 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64  r <=) on the ind
28180 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  exed.    **     
28190 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20      column that 
281a0 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
281b0 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69  ows the N equali
281c0 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20  ties. Only .    
281d0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72  **         the r
281e0 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
281f0 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75   can be an inequ
28200 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74  ality - the rest
28210 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20   must.    **    
28220 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
28230 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61  " and "IN" opera
28240 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
28250 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
28260 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20  *         index 
28270 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74  is on (x,y,z), t
28280 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
28290 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c  g clauses are al
282a0 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  l .    **       
282b0 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20    optimized:.   
282c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
282d0 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a        x=5.    **
282e0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
282f0 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20  AND y=10.    ** 
28300 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
28310 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
28320 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
28330 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20  D y>5 AND y<10. 
28340 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
28350 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44   x=5 AND y=5 AND
28360 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20   z<=10.    **.  
28370 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
28380 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68   z<10 term of th
28390 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e  e following cann
283a0 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79  ot be used, only
283b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
283c0 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20  the x=5 term:.  
283d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
283e0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a         x=5 AND z
283f0 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <10.    **.    *
28400 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20  *         N may 
28410 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  be zero if there
28420 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
28430 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
28440 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74   **         If t
28450 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71  here are no ineq
28460 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
28470 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74  ts, then N is at
28480 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
28490 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a  least one..    *
284a0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
284b0 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c   This case is al
284c0 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  so used when the
284d0 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
284e0 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20  clause.    **   
284f0 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
28500 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69  s but an index i
28510 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61  s selected anywa
28520 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20  y, in order.    
28530 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f  **         to fo
28540 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  rce the output o
28550 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20  rder to conform 
28560 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a  to an ORDER BY..
28570 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61      */  .    sta
28580 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
28590 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  artOp[] = {.    
285a0 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20    0,.      0,.  
285b0 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20      OP_Rewind,  
285c0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
285d0 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
285e0 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
285f0 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20    !bRev) */.    
28600 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20    OP_Last,      
28610 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73         /* 3: (!s
28620 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
28630 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
28640 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
28650 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20  OP_SeekGt,      
28660 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72       /* 4: (star
28670 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
28680 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62  & !startEq && !b
28690 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
286a0 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20  _SeekLt,        
286b0 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f     /* 5: (start_
286c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
286d0 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65  !startEq &&  bRe
286e0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
286f0 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20  eekGe,          
28700 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f   /* 6: (start_co
28710 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
28720 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
28730 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
28740 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  kLe            /
28750 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 7: (start_cons
28760 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
28770 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
28780 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61  /.    };.    sta
28790 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e  tic const u8 aEn
287a0 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  dOp[] = {.      
287b0 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20  OP_Noop,        
287c0 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64       /* 0: (!end
287d0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f  _constraints) */
287e0 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c  .      OP_IdxGE,
287f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
28800 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
28810 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  ts && !bRev) */.
28820 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20        OP_IdxLT  
28830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
28840 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
28850 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20  s && bRev) */.  
28860 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71    };.    int nEq
28870 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
28880 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  nEq;  /* Number 
28890 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
288a0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d  s */.    int isM
288b0 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  inQuery = 0;    
288c0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
288d0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
288e0 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e   SELECT min(x)..
288f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
28900 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
28910 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
28920 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
28930 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
28940 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20  */.    int r1;  
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28960 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
28970 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72  ster */.    Wher
28980 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61  eTerm *pRangeSta
28990 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71  rt = 0;  /* Ineq
289a0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
289b0 74 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74  t at range start
289c0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
289d0 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30  m *pRangeEnd = 0
289e0 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69  ;    /* Inequali
289f0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
28a00 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20   range end */.  
28a10 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20    int startEq;  
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a30 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
28a40 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e  start uses ==, >
28a50 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
28a60 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20  nt endEq;       
28a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28a80 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64  rue if range end
28a90 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
28aa0 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  <= */.    int st
28ab0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b  art_constraints;
28ac0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
28ad0 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73  of range is cons
28ae0 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69  trained */.    i
28af0 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
28b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28b10 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
28b20 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  int terms */.   
28b30 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28b50 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
28b60 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
28b70 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
28ba0 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
28bb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74   */.    int nExt
28bc0 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  raReg = 0;      
28bd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28be0 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
28bf0 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
28c00 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28c20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f  Instruction opco
28c30 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  de */.    char *
28c40 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20  zStartAff;      
28c50 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
28c60 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  ty for start of 
28c70 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
28c80 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   */.    char *zE
28c90 6e 64 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  ndAff;          
28ca0 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
28cb0 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67   for end of rang
28cc0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
28cd0 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76  .    pIdx = pLev
28ce0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
28cf0 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
28d00 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
28d10 20 20 20 20 6b 20 3d 20 28 6e 45 71 3d 3d 70 49      k = (nEq==pI
28d20 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31  dx->nColumn ? -1
28d30 20 3a 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   : pIdx->aiColum
28d40 6e 5b 6e 45 71 5d 29 3b 0a 0a 20 20 20 20 2f 2a  n[nEq]);..    /*
28d50 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61   If this loop sa
28d60 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f  tisfies a sort o
28d70 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20  rder (pOrderBy) 
28d80 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20  request that .  
28d90 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20    ** was passed 
28da0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
28db0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
28dc0 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e  "SELECT min(x) .
28dd0 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72  .." .    ** quer
28de0 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  y, then the call
28df0 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c  er will only all
28e00 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72  ow the loop to r
28e10 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20  un for.    ** a 
28e20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e  single iteration
28e30 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
28e40 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  t the first row 
28e50 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20  returned.    ** 
28e60 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20  should not have 
28e70 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f  a NULL value sto
28e80 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63  red in 'x'. If c
28e90 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20  olumn 'x' is.   
28ea0 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e   ** the first on
28eb0 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  e after the nEq 
28ec0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
28ed0 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ints in the inde
28ee0 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72  x,.    ** this r
28ef0 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65  equires some spe
28f00 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
28f10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
28f20 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
28f30 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
28f40 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
28f50 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48  >plan.wsFlags&WH
28f60 45 52 45 5f 4f 52 44 45 52 45 44 29 0a 20 20 20  ERE_ORDERED).   
28f70 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c    && (pIdx->nCol
28f80 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a  umn>nEq).    ){.
28f90 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
28fa0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
28fb0 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  ==1 ); */.      
28fc0 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  /* assert( pOrde
28fd0 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  rBy->a[0].pExpr-
28fe0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
28ff0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b  aiColumn[nEq] );
29000 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51   */.      isMinQ
29010 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
29020 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
29030 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
29040 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79  d any inequality
29050 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
29060 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  s for the start 
29070 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20  and end .    ** 
29080 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20  of the range. . 
29090 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
290a0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
290b0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
290c0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
290d0 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65  angeEnd = findTe
290e0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
290f0 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c   notReady, (WO_L
29100 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b  T|WO_LE), pIdx);
29110 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
29120 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
29130 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
29140 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
29150 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
29160 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20      pRangeStart 
29170 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
29180 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
29190 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29  y, (WO_GT|WO_GE)
291a0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
291b0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
291c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
291d0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
291e0 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
291f0 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
29200 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a   == or IN.    **
29210 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76   and store the v
29220 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
29230 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79  erms in an array
29240 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
29250 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
29260 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f   regBase..    */
29270 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63  .    regBase = c
29280 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
29290 72 6d 73 28 0a 20 20 20 20 20 20 20 20 70 50 61  rms(.        pPa
292a0 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43  rse, pLevel, pWC
292b0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78 74  , notReady, nExt
292c0 72 61 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66  raReg, &zStartAf
292d0 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e  f.    );.    zEn
292e0 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62  dAff = sqlite3Db
292f0 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
29300 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  b, zStartAff);. 
29310 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
29320 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20  vel->addrNxt;.. 
29330 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
29340 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20  doing a reverse 
29350 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e  order scan on an
29360 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
29370 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f  , or.    ** a fo
29380 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e  rward order scan
29390 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
293a0 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61   index, intercha
293b0 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nge the .    ** 
293c0 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
293d0 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
293e0 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
293f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29400 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  (nEq<pIdx->nColu
29410 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  mn && bRev==(pId
29420 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
29430 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
29440 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65  C)).     || (bRe
29450 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  v && pIdx->nColu
29460 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a  mn==nEq).    ){.
29470 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
29480 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
29490 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
294a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74  .    }..    test
294b0 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
294c0 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74  t && pRangeStart
294d0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
294e0 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _LE );.    testc
294f0 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
29500 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d   && pRangeStart-
29510 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
29520 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  GE );.    testca
29530 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
29540 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
29550 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b  rator & WO_LE );
29560 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
29570 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e  RangeEnd && pRan
29580 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
29590 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
295a0 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67  startEq = !pRang
295b0 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65  eStart || pRange
295c0 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
295d0 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
295e0 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20  ;.    endEq =   
295f0 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52  !pRangeEnd || pR
29600 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
29610 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
29620 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f  E);.    start_co
29630 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e  nstraints = pRan
29640 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30  geStart || nEq>0
29650 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  ;..    /* Seek t
29660 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
29670 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
29680 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
29690 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
296a0 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
296b0 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ngeStart ){.    
296c0 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
296d0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
296e0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
296f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
29700 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
29710 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
29720 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
29730 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
29740 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
29750 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
29760 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75  ite3ExprCodeIsNu
29770 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74  llJump(v, pRight
29780 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61  , regBase+nEq, a
29790 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d  ddrNxt);.      }
297a0 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72  .      if( zStar
297b0 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  tAff ){.        
297c0 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
297d0 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
297e0 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
297f0 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
29800 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ONE){.          
29810 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d  /* Since the com
29820 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65  parison is to be
29830 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20   performed with 
29840 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20  no conversions. 
29850 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c           ** appl
29860 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ied to the opera
29870 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66  nds, set the aff
29880 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74  inity to apply t
29890 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20  o pRight to .   
298a0 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
298b0 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20  _AFF_NONE.  */. 
298c0 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
298d0 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
298e0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
298f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
29900 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
29910 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
29920 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  e(pRight, zStart
29930 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20  Aff[nEq]) ){.   
29940 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
29950 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
29960 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
29970 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
29980 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
29990 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
299a0 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77  ( pRangeStart->w
299b0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
299c0 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
299d0 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
299e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
299f0 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20  sMinQuery ){.   
29a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29a10 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
29a20 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29   0, regBase+nEq)
29a30 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
29a40 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61  int++;.      sta
29a50 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20  rtEq = 0;.      
29a60 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
29a70 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  s = 1;.    }.   
29a80 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
29a90 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ty(pParse, regBa
29aa0 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  se, nConstraint,
29ab0 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
29ac0 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28   op = aStartOp[(
29ad0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
29ae0 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71  s<<2) + (startEq
29af0 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20  <<1) + bRev];.  
29b00 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20    assert( op!=0 
29b10 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
29b20 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29   op==OP_Rewind )
29b30 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
29b40 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20  op==OP_Last );. 
29b50 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
29b60 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20  =OP_SeekGt );.  
29b70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
29b80 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20  OP_SeekGe );.   
29b90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
29ba0 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20  P_SeekLe );.    
29bb0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
29bc0 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73  _SeekLt );.    s
29bd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
29be0 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Int(v, op, iIdxC
29bf0 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67  ur, addrNxt, reg
29c00 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
29c10 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64  t);..    /* Load
29c20 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
29c30 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
29c40 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20  nstraint at the 
29c50 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
29c60 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29  * range (if any)
29c70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f  ..    */.    nCo
29c80 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
29c90 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e      if( pRangeEn
29ca0 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  d ){.      Expr 
29cb0 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
29cc0 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  End->pExpr->pRig
29cd0 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
29ce0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
29cf0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
29d00 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  +nEq, 1);.      
29d10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
29d20 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
29d30 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
29d40 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45      if( (pRangeE
29d50 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
29d60 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
29d70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
29d80 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
29d90 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67  p(v, pRight, reg
29da0 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78  Base+nEq, addrNx
29db0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
29dc0 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b    if( zEndAff ){
29dd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
29de0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
29df0 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64  ity(pRight, zEnd
29e00 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54  Aff[nEq])==SQLIT
29e10 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20  E_AFF_NONE){.   
29e20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
29e30 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
29e40 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
29e50 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
29e60 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  sions.          
29e70 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  ** applied to th
29e80 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
29e90 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
29ea0 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
29eb0 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to .          **
29ec0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
29ed0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
29ee0 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53  zEndAff[nEq] = S
29ef0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
29f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29f10 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
29f20 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
29f30 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
29f40 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a  EndAff[nEq]) ){.
29f50 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66            zEndAf
29f60 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
29f70 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
29f80 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
29f90 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
29fa0 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
29fb0 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45  gBase, nEq+1, zE
29fc0 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43  ndAff);.      nC
29fd0 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
29fe0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
29ff0 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
2a000 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
2a010 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
2a020 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a  -11662 */.    }.
2a030 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2a040 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53  e(pParse->db, zS
2a050 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71  tartAff);.    sq
2a060 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
2a070 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29  se->db, zEndAff)
2a080 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  ;..    /* Top of
2a090 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a   the loop body *
2a0a0 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  /.    pLevel->p2
2a0b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2a0c0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
2a0d0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
2a0e0 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
2a0f0 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  is past the end 
2a100 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
2a110 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70  .    op = aEndOp
2a120 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e  [(pRangeEnd || n
2a130 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29  Eq) * (1 + bRev)
2a140 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ];.    testcase(
2a150 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a   op==OP_Noop );.
2a160 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
2a170 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20  ==OP_IdxGE );.  
2a180 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
2a190 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20  OP_IdxLT );.    
2a1a0 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  if( op!=OP_Noop 
2a1b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a1c0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
2a1d0 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
2a1e0 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
2a1f0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
2a200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2a210 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71  hangeP5(v, endEq
2a220 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20  !=bRev ?1:0);.  
2a230 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
2a240 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
2a250 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
2a260 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
2a270 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
2a280 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
2a290 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61   that the inequa
2a2a0 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69  lity contrains i
2a2b0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20  s not NULL..    
2a2c0 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d  ** If it is, jum
2a2d0 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  p to the next it
2a2e0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
2a2f0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
2a300 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
2a310 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2a320 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
2a330 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2a340 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
2a350 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74  IMIT );.    test
2a360 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
2a370 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2a380 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a  RE_TOP_LIMIT );.
2a390 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
2a3a0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2a3b0 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
2a3c0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
2a3d0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
2a3e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2a3f0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
2a400 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29  IdxCur, nEq, r1)
2a410 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2a420 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2a430 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72  IsNull, r1, addr
2a440 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cont);.    }.   
2a450 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2a460 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
2a470 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  1);..    /* Seek
2a480 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
2a490 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
2a4a0 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
2a4b0 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
2a4c0 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
2a4d0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
2a4e0 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
2a4f0 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29  if( !omitTable )
2a500 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
2a510 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
2a520 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2a530 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
2a540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a550 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
2a560 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52  wid, iIdxCur, iR
2a570 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
2a580 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2a590 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
2a5a0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
2a5b0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
2a5c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2a5d0 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52  P_Seek, iCur, iR
2a5e0 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65  owidReg);  /* De
2a5f0 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
2a600 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63     }..    /* Rec
2a610 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74  ord the instruct
2a620 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d  ion used to term
2a630 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
2a640 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20  Disable .    ** 
2a650 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2a660 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e  ms made redundan
2a670 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72  t by the index r
2a680 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a  ange scan..    *
2a690 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
2a6a0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2a6b0 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 29 7b   WHERE_UNIQUE ){
2a6c0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
2a6d0 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
2a6e0 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
2a6f0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
2a700 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
2a710 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a720 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
2a730 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
2a740 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
2a750 78 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 4c  xCur;.    if( pL
2a760 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2a770 67 73 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52  gs & WHERE_COVER
2a780 5f 53 43 41 4e 20 29 7b 0a 20 20 20 20 20 20 70  _SCAN ){.      p
2a790 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
2a7a0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
2a7b0 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
2a7c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
2a7d0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
2a7e0 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ==0 );.    }.  }
2a7f0 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
2a800 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
2a810 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
2a820 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2a830 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
2a840 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20  TI_OR ){.    /* 
2a850 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72 20  Case 4:  Two or 
2a860 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20  more separately 
2a870 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
2a880 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20  nnected by OR.  
2a890 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
2a8a0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
2a8b0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
2a8c0 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20  E t1(a,b,c,d);. 
2a8d0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
2a8e0 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
2a8f0 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
2a900 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31  E INDEX i2 ON t1
2a910 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (b);.    **   CR
2a920 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
2a930 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20   t1(c);.    **. 
2a940 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
2a950 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
2a960 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d  =5 OR b=7 OR (c=
2a970 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20  11 AND d=13).   
2a980 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68   **.    ** In th
2a990 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65  e example, there
2a9a0 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78   are three index
2a9b0 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
2a9c0 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a  ed by OR..    **
2a9d0 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
2a9e0 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
2a9f0 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
2aa00 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
2aa10 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
2aa20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
2aa30 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
2aa40 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  g 1.    **.    *
2aa50 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68  * Then, for each
2aa60 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74   indexed term, t
2aa70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68  he following. Th
2aa80 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
2aa90 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74     ** RowSetTest
2aaa0 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74   are such that t
2aab0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
2aac0 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69  current row is i
2aad0 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69  nserted.    ** i
2aae0 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20  nto the RowSet. 
2aaf0 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
2ab00 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f   present, contro
2ab10 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20  l skips the.    
2ab20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20  ** Gosub opcode 
2ab30 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67  and jumps straig
2ab40 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ht to the code g
2ab50 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72  enerated by Wher
2ab60 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  eEnd()..    **. 
2ab70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
2ab80 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c  ite3WhereBegin(<
2ab90 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20  term>).    **   
2aba0 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73         RowSetTes
2abb0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2abc0 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69     # Insert rowi
2abd0 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20  d into rowset.  
2abe0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
2abf0 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20  sub      2 A.   
2ac00 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
2ac10 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20  e3WhereEnd().   
2ac20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f   **.    ** Follo
2ac30 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20  wing the above, 
2ac40 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74  code to terminat
2ac50 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65  e the loop. Labe
2ac60 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a  l A, the target.
2ac70 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f      ** of the Go
2ac80 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73  sub above, jumps
2ac90 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
2aca0 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20  ion right after 
2acb0 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a  the Goto..    **
2acc0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
2acd0 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
2acf0 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
2ad00 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20  n reg 1.    **  
2ad10 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20          Goto    
2ad20 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20     B            
2ad30 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69      # The loop i
2ad40 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
2ad50 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
2ad60 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20  A: <loop body>  
2ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
2ad80 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68   Return data, wh
2ad90 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  atever..    **. 
2ada0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
2adb0 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20  eturn     2     
2adc0 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d             # Jum
2add0 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f  p back to the Go
2ade0 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sub.    **.    *
2adf0 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65  *       B: <afte
2ae00 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20  r the loop>.    
2ae10 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
2ae20 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
2ae30 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
2ae40 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
2ae50 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
2ae60 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
2ae70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
2ae80 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
2ae90 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
2aea0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
2aeb0 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20      Index *pCov 
2aec0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2aed0 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f   /* Potential co
2aee0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72  vering index (or
2aef0 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e   NULL) */.    in
2af00 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72  t iCovCur = pPar
2af10 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20  se->nTab++;  /* 
2af20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  Cursor used for 
2af30 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20  index scans (if 
2af40 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  any) */..    int
2af50 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
2af60 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
2af70 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
2af80 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
2af90 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
2afa0 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afc0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
2afd0 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
2afe0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
2aff0 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b010 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
2b020 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
2b030 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
2b040 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
2b050 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
2b060 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
2b070 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
2b080 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0a0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2b0b0 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
2b0c0 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
2b0d0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
2b0e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2b0f0 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74  * Some terms not
2b100 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74   completely test
2b110 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  ed */.    int ii
2b120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b140 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2b150 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
2b160 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
2b170 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
2b180 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
2b190 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20  ession */.   .  
2b1a0 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c    pTerm = pLevel
2b1b0 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a  ->plan.u.pTerm;.
2b1c0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
2b1d0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
2b1e0 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
2b1f0 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b 0a  ator & WO_OR );.
2b200 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
2b210 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
2b220 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b  RM_ORINFO)!=0 );
2b230 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54  .    pOrWc = &pT
2b240 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
2b250 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  wc;.    pLevel->
2b260 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a  op = OP_Return;.
2b270 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
2b280 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20   regReturn;..   
2b290 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77   /* Set up a new
2b2a0 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72 54   SrcList in pOrT
2b2b0 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ab containing th
2b2c0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63  e table being sc
2b2d0 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  anned.    ** by 
2b2e0 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65  this loop in the
2b2f0 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61   a[0] slot and a
2b300 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  ll notReady tabl
2b310 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f  es in a[1..] slo
2b320 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ts..    ** This 
2b330 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c  becomes the SrcL
2b340 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72  ist in the recur
2b350 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c  sive call to sql
2b360 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2b370 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2b380 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
2b390 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  1 ){.      int n
2b3a0 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  NotReady;       
2b3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b3c0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65   number of notRe
2b3d0 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ady tables */.  
2b3e0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2b3f0 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63  st_item *origSrc
2b400 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
2b410 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  l list of tables
2b420 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65   */.      nNotRe
2b430 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  ady = pWInfo->nL
2b440 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20  evel - iLevel - 
2b450 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  1;.      pOrTab 
2b460 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
2b470 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
2b480 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2b4a0 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
2b4b0 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
2b4c0 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
2b4d0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
2b4e0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
2b4f0 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
2b500 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
2b510 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  i16)(nNotReady +
2b520 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
2b530 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
2b540 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
2b550 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
2b560 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
2b570 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
2b580 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
2b590 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2b5a0 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
2b5b0 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
2b5c0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
2b5d0 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
2b5e0 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
2b5f0 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
2b600 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
2b610 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
2b620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b630 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
2b640 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
2b650 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
2b660 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
2b670 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
2b680 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
2b690 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
2b6a0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
2b6b0 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
2b6c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
2b6d0 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
2b6e0 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
2b6f0 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
2b700 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
2b710 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
2b720 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
2b730 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
2b740 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
2b750 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
2b760 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
2b770 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
2b780 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
2b790 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
2b7a0 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
2b7b0 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
2b7c0 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
2b7d0 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
2b7e0 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
2b7f0 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
2b800 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
2b810 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
2b820 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
2b830 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
2b840 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
2b850 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2b860 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
2b870 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
2b880 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
2b890 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
2b8a0 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
2b8b0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
2b8c0 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
2b8d0 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
2b8e0 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d       regRowset =
2b8f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2b900 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
2b910 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2b920 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2b930 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b940 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
2b950 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
2b960 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
2b970 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2b980 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
2b990 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f  gReturn);..    /
2b9a0 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
2b9b0 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
2b9c0 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  s z of the form:
2b9d0 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e    (x1 OR x2 OR .
2b9e0 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a  ..) AND y.    **
2b9f0 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20   Then for every 
2ba00 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74  term xN, evaluat
2ba10 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72  e as the subexpr
2ba20 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a  ession: xN AND z
2ba30 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
2ba40 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61  , terms in y tha
2ba50 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69  t are factored i
2ba60 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74  nto the disjunct
2ba70 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
2ba80 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20  be picked up by 
2ba90 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
2baa0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68  lls to sqlite3Wh
2bab0 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77  ereBegin() below
2bac0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2bad0 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73  Actually, each s
2bae0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
2baf0 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e  converted to "xN
2bb00 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20   AND w" where w 
2bb10 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69  is.    ** the "i
2bb20 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d  nteresting" term
2bb30 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74  s of z - terms t
2bb40 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  hat did not orig
2bb50 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20  inate in the.   
2bb60 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   ** ON or USING 
2bb70 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
2bb80 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73   JOIN, and terms
2bb90 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65   that are usable
2bba0 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   as .    ** indi
2bbb0 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
2bbc0 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31  if( pWC->nTerm>1
2bbd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
2bbe0 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  erm;.      for(i
2bbf0 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57  Term=0; iTerm<pW
2bc00 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b  C->nTerm; iTerm+
2bc10 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
2bc20 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61   *pExpr = pWC->a
2bc30 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20  [iTerm].pExpr;. 
2bc40 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
2bc50 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2bc60 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
2bc70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2bc80 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54     if( pWC->a[iT
2bc90 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28  erm].wtFlags & (
2bca0 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
2bcb0 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74  M_ORINFO) ) cont
2bcc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
2bcd0 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
2bce0 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  .eOperator & WO_
2bcf0 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ALL)==0 ) contin
2bd00 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ue;.        pExp
2bd10 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
2bd20 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
2bd30 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
2bd40 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
2bd50 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
2bd60 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72  se->db, pAndExpr
2bd70 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
2bd80 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
2bd90 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2bda0 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
2bdb0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2bdc0 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
2bdd0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
2bde0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
2bdf0 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
2be00 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
2be10 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2be20 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
2be30 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
2be40 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
2be50 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28  ursor==iCur || (
2be60 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
2be70 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
2be80 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
2be90 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
2bea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
2beb0 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
2bec0 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
2bed0 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
2bee0 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
2bef0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
2bf00 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
2bf10 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d         pAndExpr-
2bf20 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72  >pLeft = pOrExpr
2bf30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45  ;.          pOrE
2bf40 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a  xpr = pAndExpr;.
2bf50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bf60 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
2bf70 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
2bf80 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
2bf90 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
2bfa0 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
2bfb0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2bfc0 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
2bfd0 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c  , pOrExpr, 0, 0,
2bfe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bff0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f           WHERE_O
2c000 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c  MIT_OPEN_CLOSE |
2c010 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
2c020 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
2c030 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
2c040 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48  FORCE_TABLE | WH
2c050 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
2c060 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20  Y, iCovCur);.   
2c070 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
2c080 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65  bWInfo || pParse
2c090 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65  ->nErr || pParse
2c0a0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2c0b0 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ed );.        if
2c0c0 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20  ( pSubWInfo ){. 
2c0d0 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c 65           WhereLe
2c0e0 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 20  vel *pLvl;.     
2c0f0 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53       explainOneS
2c100 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20  can(.           
2c110 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61     pParse, pOrTa
2c120 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61  b, &pSubWInfo->a
2c130 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65  [0], iLevel, pLe
2c140 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20  vel->iFrom, 0.  
2c150 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2c160 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
2c170 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
2c180 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
2c190 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2c1a0 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70  t iSet = ((ii==p
2c1b0 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d  OrWc->nTerm-1)?-
2c1c0 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20  1:ii);.         
2c1d0 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20     int r;.      
2c1e0 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65        r = sqlite
2c1f0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
2c200 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  mn(pParse, pTabI
2c210 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69  tem->pTab, -1, i
2c220 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Cur, .          
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
2c250 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20  egRowid, 0);.   
2c260 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c270 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
2c280 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20   OP_RowSetTest, 
2c290 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20  regRowset,.     
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c2c0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2c2d0 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74  dr(v)+2, r, iSet
2c2e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2c2f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c300 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2c310 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72  _Gosub, regRetur
2c320 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  n, iLoopBody);..
2c330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2c340 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65   pSubWInfo->unte
2c350 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d  stedTerms flag m
2c360 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f  eans that this O
2c370 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20  R term.         
2c380 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e   ** contained on
2c390 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65  e or more AND te
2c3a0 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61  rm from a notRea
2c3b0 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20  dy table.  The. 
2c3c0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
2c3d0 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65  s from the notRe
2c3e0 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20  ady table could 
2c3f0 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e  not be tested an
2c400 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20  d will.         
2c410 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74   ** need to be t
2c420 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20  ested later..   
2c430 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2c440 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
2c450 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
2c460 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73   ) untestedTerms
2c470 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
2c480 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   /* If all of th
2c490 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  e OR-connected t
2c4a0 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a  erms are optimiz
2c4b0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
2c4c0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  e.          ** i
2c4d0 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e  ndex, and the in
2c4e0 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73  dex is opened us
2c4f0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72  ing the same cur
2c500 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  sor number.     
2c510 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20       ** by each 
2c520 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
2c530 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65  hereBegin() made
2c540 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69   by this loop, i
2c550 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20  t may.          
2c560 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ** be possible t
2c570 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78  o use that index
2c580 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   as a covering i
2c590 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
2c5a0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
2c5b0 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  If the call to s
2c5c0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2c5d0 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65  () above resulte
2c5e0 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74  d in a scan that
2c5f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73  .          ** us
2c600 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64  es an index, and
2c610 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
2c620 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e  the first OR-con
2c630 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20  nected term.    
2c640 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
2c650 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20  ed or the index 
2c660 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
2c670 68 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20  hat used by all 
2c680 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
2c690 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74     ** terms, set
2c6a0 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e   pCov to the can
2c6b0 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20  didate covering 
2c6c0 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65  index. Otherwise
2c6d0 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20  , set .         
2c6e0 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c   ** pCov to NULL
2c6f0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
2c700 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63  t no candidate c
2c710 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69  overing index wi
2c720 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ll .          **
2c730 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20   be available.. 
2c740 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2c750 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53        pLvl = &pS
2c760 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 3b 0a 20  ubWInfo->a[0];. 
2c770 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c           if( (pL
2c780 76 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  vl->plan.wsFlags
2c790 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2c7a0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
2c7b0 26 26 20 28 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 77  && (pLvl->plan.w
2c7c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
2c7d0 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 0a 20 20  EMP_INDEX)==0.  
2c7e0 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69 3d           && (ii=
2c7f0 3d 30 20 7c 7c 20 70 4c 76 6c 2d 3e 70 6c 61 6e  =0 || pLvl->plan
2c800 2e 75 2e 70 49 64 78 3d 3d 70 43 6f 76 29 0a 20  .u.pIdx==pCov). 
2c810 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2c820 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c830 70 4c 76 6c 2d 3e 69 49 64 78 43 75 72 3d 3d 69  pLvl->iIdxCur==i
2c840 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20  CovCur );.      
2c850 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70 4c 76        pCov = pLv
2c860 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  l->plan.u.pIdx;.
2c870 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2c880 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
2c890 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
2c8a0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
2c8b0 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70   Finish the loop
2c8c0 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
2c8d0 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
2c8e0 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
2c8f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
2c900 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75  ite3WhereEnd(pSu
2c910 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  bWInfo);.       
2c920 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2c930 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  .    pLevel->u.p
2c940 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20  Covidx = pCov;. 
2c950 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c     if( pCov ) pL
2c960 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
2c970 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28  iCovCur;.    if(
2c980 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
2c990 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65     pAndExpr->pLe
2c9a0 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ft = 0;.      sq
2c9b0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2c9c0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64  pParse->db, pAnd
2c9d0 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
2c9e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2c9f0 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74  geP1(v, iRetInit
2ca00 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
2ca10 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
2ca20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ca30 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
2ca40 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  0, pLevel->addrB
2ca50 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rk);.    sqlite3
2ca60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2ca70 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  (v, iLoopBody);.
2ca80 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
2ca90 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69  >nLevel>1 ) sqli
2caa0 74 65 33 53 74 61 63 6b 46 72 65 65 28 70 50 61  te3StackFree(pPa
2cab0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29  rse->db, pOrTab)
2cac0 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73  ;.    if( !untes
2cad0 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62  tedTerms ) disab
2cae0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
2caf0 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Term);.  }else.#
2cb00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2cb10 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
2cb20 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20  TION */..  {.   
2cb30 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65   /* Case 5:  The
2cb40 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20  re is no usable 
2cb50 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20  index.  We must 
2cb60 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20  do a complete.  
2cb70 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63    **          sc
2cb80 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  an of the entire
2cb90 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
2cba0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2cbb0 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f  u8 aStep[] = { O
2cbc0 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20  P_Next, OP_Prev 
2cbd0 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
2cbe0 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20  nst u8 aStart[] 
2cbf0 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f  = { OP_Rewind, O
2cc00 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73  P_Last };.    as
2cc10 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c  sert( bRev==0 ||
2cc20 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20   bRev==1 );.    
2cc30 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
2cc40 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65 76  e==0 );.    pLev
2cc50 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62  el->op = aStep[b
2cc60 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Rev];.    pLevel
2cc70 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
2cc80 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
2cc90 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
2cca0 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
2ccb0 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ev], iCur, addrB
2ccc0 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
2ccd0 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
2cce0 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
2ccf0 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74  _STEP;.  }.  not
2cd00 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
2cd10 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  k(pWC->pMaskSet,
2cd20 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e   iCur);..  /* In
2cd30 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
2cd40 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65  t every subexpre
2cd50 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
2cd60 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a  e completely.  *
2cd70 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67  * computed using
2cd80 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
2cd90 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a   of tables..  **
2cda0 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
2cdb0 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35  TION-OF: R-49525
2cdc0 2d 35 30 39 33 35 20 54 65 72 6d 73 20 74 68 61  -50935 Terms tha
2cdd0 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69  t cannot be sati
2cde0 73 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20  sfied through.  
2cdf0 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e  ** the use of in
2ce00 64 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73  dices become tes
2ce10 74 73 20 74 68 61 74 20 61 72 65 20 65 76 61 6c  ts that are eval
2ce20 75 61 74 65 64 20 61 67 61 69 6e 73 74 20 65 61  uated against ea
2ce30 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74  ch row of.  ** t
2ce40 68 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75  he relevant inpu
2ce50 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  t tables..  */. 
2ce60 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
2ce70 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
2ce80 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
2ce90 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
2cea0 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  E;.    testcase(
2ceb0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
2cec0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
2ced0 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37  ; /* IMP: R-3057
2cee0 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74  5-11662 */.    t
2cef0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
2cf00 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
2cf10 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ODED );.    if( 
2cf20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
2cf30 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
2cf40 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
2cf50 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
2cf60 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
2cf70 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
2cf80 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
2cf90 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  e( pWInfo->untes
2cfa0 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20  tedTerms==0.    
2cfb0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
2cfc0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2cfd0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
2cfe0 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20  LE_ONLY)!=0 );. 
2cff0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74       pWInfo->unt
2d000 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
2d010 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2d020 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70      }.    pE = p
2d030 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
2d040 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
2d050 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
2d060 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
2d070 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2d080 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
2d090 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
2d0a0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ue;.    }.    sq
2d0b0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
2d0c0 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64  (pParse, pE, add
2d0d0 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
2d0e0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
2d0f0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
2d100 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d   TERM_CODED;.  }
2d110 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
2d120 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
2d130 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
2d140 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
2d150 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
2d160 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
2d170 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2d180 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
2d190 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
2d1a0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
2d1b0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
2d1c0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
2d1d0 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
2d1e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2d1f0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
2d200 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d210 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
2d220 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
2d230 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
2d240 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
2d250 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
2d260 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2d270 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2d280 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
2d290 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
2d2a0 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
2d2b0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
2d2c0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
2d2d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2d2e0 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49  VIRTUAL );  /* I
2d2f0 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  MP: R-30575-1166
2d300 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  2 */.      testc
2d310 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
2d320 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
2d330 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
2d340 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
2d350 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
2d360 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
2d370 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
2d380 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
2d390 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
2d3a0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2d3b0 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  t( pWInfo->untes
2d3c0 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20  tedTerms );.    
2d3d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2d3e0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2d3f0 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
2d400 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
2d410 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
2d420 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
2d430 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
2d440 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2d450 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
2d460 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
2d470 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  DED;.    }.  }. 
2d480 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2d490 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
2d4a0 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20  ReleaseReg);..  
2d4b0 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b  return notReady;
2d4c0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
2d4d0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
2d4e0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2d4f0 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20   variable holds 
2d500 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69  a text descripti
2d510 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e  on of query plan
2d520 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79   generated.** by
2d530 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
2d540 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2d550 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45  WhereBegin().  E
2d560 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72  ach call to Wher
2d570 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72  eBegin.** overwr
2d580 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  ites the previou
2d590 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  s.  This informa
2d5a0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
2d5b0 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20   testing and.** 
2d5c0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
2d5d0 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71  /.char sqlite3_q
2d5e0 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a  uery_plan[BMS*2*
2d5f0 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66  40];  /* Text of
2d600 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61   the join */.sta
2d610 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d  tic int nQPlan =
2d620 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d630 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
2d640 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61  ow in _query_pla
2d650 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  n[] */..#endif /
2d660 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
2d670 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  .../*.** Free a 
2d680 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
2d690 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
2d6a0 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
2d6b0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
2d6c0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
2d6d0 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
2d6e0 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e  WInfo) ){.    in
2d6f0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
2d700 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ; i<pWInfo->nLev
2d710 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
2d720 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
2d730 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e  fo *pInfo = pWIn
2d740 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66  fo->a[i].pIdxInf
2d750 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
2d760 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
2d770 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e   assert( pInfo->
2d780 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2d790 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
2d7a0 63 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20  cFailed ); */.  
2d7b0 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d        if( pInfo-
2d7c0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2d7d0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
2d7e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 66  qlite3_free(pInf
2d7f0 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  o->idxStr);.    
2d800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2d810 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2d820 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  pInfo);.      }.
2d830 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2d840 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c  ->a[i].plan.wsFl
2d850 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
2d860 5f 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20  _INDEX ){.      
2d870 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
2d880 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61  pWInfo->a[i].pla
2d890 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20  n.u.pIdx;.      
2d8a0 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
2d8b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2d8c0 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e  bFree(db, pIdx->
2d8d0 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20  zColAff);.      
2d8e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d8f0 65 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20  e(db, pIdx);.   
2d900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2d910 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43 6c     }.    whereCl
2d920 61 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66 6f  auseClear(pWInfo
2d930 2d 3e 70 57 43 29 3b 0a 20 20 20 20 73 71 6c 69  ->pWC);.    sqli
2d940 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
2d950 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  Info);.  }.}.../
2d960 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
2d970 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2d980 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
2d990 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
2d9a0 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
2d9b0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
2d9c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2d9d0 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
2d9e0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
2d9f0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
2da00 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
2da10 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
2da20 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
2da30 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
2da40 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
2da50 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
2da60 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
2da70 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
2da80 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
2da90 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
2daa0 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
2dab0 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
2dac0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2dad0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
2dae0 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
2daf0 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
2db00 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
2db10 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
2db20 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
2db30 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
2db40 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
2db50 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
2db60 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
2db70 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
2db80 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
2db90 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
2dba0 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
2dbb0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
2dbc0 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
2dbd0 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
2dbe0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
2dbf0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
2dc00 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
2dc10 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
2dc20 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
2dc30 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
2dc40 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
2dc50 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
2dc60 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
2dc70 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
2dc80 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
2dc90 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
2dca0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
2dcb0 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
2dcc0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
2dcd0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
2dce0 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
2dcf0 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
2dd00 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
2dd10 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
2dd30 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
2dd40 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
2dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd60 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
2dd70 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
2dd80 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
2dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dda0 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
2ddb0 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
2ddc0 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
2ddd0 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
2dde0 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
2ddf0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
2de00 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
2de10 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
2de20 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
2de30 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
2de40 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
2de50 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
2de60 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
2de70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
2de80 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
2de90 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
2dea0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
2deb0 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
2dec0 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
2ded0 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
2dee0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
2def0 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
2df00 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
2df10 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
2df20 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
2df30 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
2df40 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
2df50 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
2df60 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
2df70 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
2df80 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
2df90 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
2dfa0 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
2dfb0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
2dfc0 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
2dfd0 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
2dfe0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
2dff0 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
2e000 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
2e010 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
2e020 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
2e030 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2e040 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
2e050 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
2e060 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
2e070 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
2e080 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
2e090 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
2e0a0 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
2e0b0 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
2e0c0 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
2e0d0 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
2e0e0 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
2e0f0 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
2e100 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
2e110 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
2e120 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
2e130 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
2e140 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
2e150 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
2e160 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
2e170 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
2e180 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
2e190 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
2e1a0 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
2e1b0 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
2e1c0 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
2e1d0 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
2e1e0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
2e1f0 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
2e200 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
2e210 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
2e220 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
2e230 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
2e240 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
2e250 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
2e260 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
2e270 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
2e280 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
2e290 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
2e2a0 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
2e2b0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
2e2c0 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
2e2d0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
2e2e0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2e2f0 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
2e300 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
2e310 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
2e320 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
2e330 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
2e340 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
2e350 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
2e360 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
2e370 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2e380 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
2e390 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
2e3a0 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
2e3b0 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
2e3c0 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
2e3d0 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
2e3e0 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
2e3f0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
2e400 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
2e410 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
2e420 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
2e430 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
2e440 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
2e450 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
2e460 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
2e470 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
2e480 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
2e490 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
2e4a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2e4b0 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
2e4c0 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
2e4d0 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
2e4e0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
2e4f0 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
2e500 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
2e510 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
2e520 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
2e530 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
2e540 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
2e550 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
2e560 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
2e570 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
2e580 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
2e590 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
2e5a0 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
2e5b0 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
2e5c0 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
2e5d0 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  * pOrderBy is a 
2e5e0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
2e5f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
2e600 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
2e610 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72  ment,.** if ther
2e620 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
2e630 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
2e640 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
2e650 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2e660 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
2e670 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
2e680 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
2e690 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
2e6a0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
2e6b0 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
2e6c0 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  ed so that the n
2e6d0 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72  atural output or
2e6e0 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  der of the table
2e6f0 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72  .** scan is corr
2e700 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45  ect for the ORDE
2e710 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2e720 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20  n that index is 
2e730 75 73 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  used and.** the 
2e740 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e  returned WhereIn
2e750 66 6f 2e 6e 4f 42 53 61 74 20 66 69 65 6c 64 20  fo.nOBSat field 
2e760 69 73 20 73 65 74 20 74 6f 20 70 4f 72 64 65 72  is set to pOrder
2e770 42 79 2d 3e 6e 45 78 70 72 2e 20 20 54 68 69 73  By->nExpr.  This
2e780 0a 2a 2a 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  .** is an optimi
2e790 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76  zation that prev
2e7a0 65 6e 74 73 20 61 6e 20 75 6e 6e 65 63 65 73 73  ents an unnecess
2e7b0 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20  ary sort of the 
2e7c0 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 69 66  result set.** if
2e7d0 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70   an index approp
2e7e0 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 4f 52  riate for the OR
2e7f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c  DER BY clause al
2e800 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a  ready exists..**
2e810 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65  .** If the where
2e820 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61   clause loops ca
2e830 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64  nnot be arranged
2e840 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
2e850 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75  correct.** outpu
2e860 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 57 68  t order, then Wh
2e870 65 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74 20 69  ereInfo.nOBSat i
2e880 73 20 30 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  s 0..*/.WhereInf
2e890 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
2e8a0 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
2e8b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
2e8c0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2e8d0 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
2e8e0 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
2e8f0 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
2e900 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
2e910 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
2e920 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
2e930 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
2e940 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
2e950 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
2e960 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  * An ORDER BY cl
2e970 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
2e980 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
2e990 73 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20  stinct,  /* The 
2e9a0 73 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f 72 20  select-list for 
2e9b0 44 49 53 54 49 4e 43 54 20 71 75 65 72 69 65 73  DISTINCT queries
2e9c0 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20   - or NULL */.  
2e9d0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
2e9e0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2e9f0 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  the WHERE_* flag
2ea00 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
2ea10 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e  iteInt.h */.  in
2ea20 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20  t iIdxCur       
2ea30 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f      /* If WHERE_
2ea40 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73  ONETABLE_ONLY is
2ea50 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73   set, index curs
2ea60 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  or number */.){.
2ea70 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f    int nByteWInfo
2ea80 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2ea90 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63  Num. bytes alloc
2eaa0 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e  ated for WhereIn
2eab0 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69  fo struct */.  i
2eac0 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20  nt nTabList;    
2ead0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2eae0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
2eaf0 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  in pTabList */. 
2eb00 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2eb10 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
2eb20 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
2eb30 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
2eb40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
2eb50 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2eb60 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
2eb70 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
2eb80 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
2eb90 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
2eba0 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
2ebb0 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
2ebc0 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
2ebd0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 42 65 73  ed */.  WhereBes
2ebe0 74 49 64 78 20 73 57 42 49 3b 20 20 20 20 20 20  tIdx sWBI;      
2ebf0 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78     /* Best index
2ec00 20 73 65 61 72 63 68 20 63 6f 6e 74 65 78 74 20   search context 
2ec10 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
2ec20 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
2ec30 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
2ec40 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
2ec50 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
2ec60 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
2ec70 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
2ec80 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
2ec90 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20   int iFrom;     
2eca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ecb0 69 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d  irst unused FROM
2ecc0 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
2ecd0 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67  */.  int andFlag
2ece0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2ecf0 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e  /* AND-ed combin
2ed00 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43  ation of all pWC
2ed10 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f  ->a[].wtFlags */
2ed20 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
2ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ed40 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2ed50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
2ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ed70 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
2ed80 74 69 6f 6e 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56  tion */...  /* V
2ed90 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69  ariable initiali
2eda0 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 73  zation */.  mems
2edb0 65 74 28 26 73 57 42 49 2c 20 30 2c 20 73 69 7a  et(&sWBI, 0, siz
2edc0 65 6f 66 28 73 57 42 49 29 29 3b 0a 20 20 73 57  eof(sWBI));.  sW
2edd0 42 49 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  BI.pParse = pPar
2ede0 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75  se;..  /* The nu
2edf0 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2ee00 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2ee10 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
2ee20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
2ee30 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
2ee40 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
2ee50 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
2ee60 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
2ee70 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
2ee80 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
2ee90 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2eea0 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
2eeb0 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
2eec0 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
2eed0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
2eee0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2eef0 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
2ef00 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
2ef10 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
2ef20 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
2ef30 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
2ef40 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
2ef50 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c  NLY flag is set,
2ef60 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
2ef70 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
2ef80 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
2ef90 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
2efa0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
2efb0 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
2efc0 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
2efd0 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
2efe0 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
2eff0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
2f000 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
2f010 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2f020 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
2f030 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  Y) ? 1 : pTabLis
2f040 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
2f050 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2f060 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
2f070 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
2f080 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
2f090 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
2f0a0 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
2f0b0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
2f0c0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
2f0d0 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
2f0e0 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
2f0f0 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
2f100 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
2f110 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
2f120 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
2f130 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
2f140 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
2f150 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
2f160 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
2f170 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
2f180 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
2f190 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
2f1a0 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
2f1b0 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
2f1c0 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
2f1d0 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
2f1e0 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  w..  */.  db = p
2f1f0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79  Parse->db;.  nBy
2f200 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38  teWInfo = ROUND8
2f210 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66  (sizeof(WhereInf
2f220 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a  o)+(nTabList-1)*
2f230 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
2f240 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  l));.  pWInfo = 
2f250 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
2f260 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 6e  ero(db, .      n
2f270 42 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20  ByteWInfo + .   
2f280 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 43     sizeof(WhereC
2f290 6c 61 75 73 65 29 20 2b 0a 20 20 20 20 20 20 73  lause) +.      s
2f2a0 69 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b 53  izeof(WhereMaskS
2f2b0 65 74 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 64  et).  );.  if( d
2f2c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2f2d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2f2e0 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2f2f0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30  ;.    pWInfo = 0
2f300 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  ;.    goto where
2f310 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
2f320 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
2f330 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
2f340 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
2f350 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
2f360 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
2f370 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
2f380 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  >iBreak = sqlite
2f390 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2f3a0 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43  );.  pWInfo->pWC
2f3b0 20 3d 20 73 57 42 49 2e 70 57 43 20 3d 20 28 57   = sWBI.pWC = (W
2f3c0 68 65 72 65 43 6c 61 75 73 65 20 2a 29 26 28 28  hereClause *)&((
2f3d0 75 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79  u8 *)pWInfo)[nBy
2f3e0 74 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e  teWInfo];.  pWIn
2f3f0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  fo->wctrlFlags =
2f400 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70   wctrlFlags;.  p
2f410 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2f420 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
2f430 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70  >nQueryLoop;.  p
2f440 4d 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65  MaskSet = (Where
2f450 4d 61 73 6b 53 65 74 2a 29 26 73 57 42 49 2e 70  MaskSet*)&sWBI.p
2f460 57 43 5b 31 5d 3b 0a 20 20 73 57 42 49 2e 61 4c  WC[1];.  sWBI.aL
2f470 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
2f480 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20  ;..  /* Disable 
2f490 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74  the DISTINCT opt
2f4a0 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c  imization if SQL
2f4b0 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20  ITE_DistinctOpt 
2f4c0 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20  is set via.  ** 
2f4d0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72  sqlite3_test_ctr
2f4e0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2f4f0 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
2f500 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ...) */.  if( Op
2f510 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
2f520 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69  ed(db, SQLITE_Di
2f530 73 74 69 6e 63 74 4f 70 74 29 20 29 20 70 44 69  stinctOpt) ) pDi
2f540 73 74 69 6e 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  stinct = 0;..  /
2f550 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52  * Split the WHER
2f560 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65  E clause into se
2f570 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73  parate subexpres
2f580 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68  sions where each
2f590 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73  .  ** subexpress
2f5a0 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
2f5b0 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   by an AND opera
2f5c0 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74  tor..  */.  init
2f5d0 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74  MaskSet(pMaskSet
2f5e0 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  );.  whereClause
2f5f0 49 6e 69 74 28 73 57 42 49 2e 70 57 43 2c 20 70  Init(sWBI.pWC, p
2f600 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c  Parse, pMaskSet,
2f610 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20   wctrlFlags);.  
2f620 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
2f630 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c  onstants(pParse,
2f640 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72   pWhere);.  wher
2f650 65 53 70 6c 69 74 28 73 57 42 49 2e 70 57 43 2c  eSplit(sWBI.pWC,
2f660 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
2f670 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35  ;   /* IMP: R-15
2f680 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20  842-53296 */.   
2f690 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63   .  /* Special c
2f6a0 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
2f6b0 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
2f6c0 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
2f6d0 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
2f6e0 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
2f6f0 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
2f700 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
2f710 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66   thru..  */.  if
2f720 28 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61  ( pWhere && (nTa
2f730 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  bList==0 || sqli
2f740 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
2f750 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29  tNotJoin(pWhere)
2f760 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
2f770 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2f780 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e  se, pWhere, pWIn
2f790 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49  fo->iBreak, SQLI
2f7a0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2f7b0 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
2f7c0 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e    }..  /* Assign
2f7d0 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
2f7e0 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
2f7f0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
2f800 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
2f810 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69   ** When assigni
2f820 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65  ng bitmask value
2f830 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  s to FROM clause
2f840 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73   cursors, it mus
2f850 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61  t be.  ** the ca
2f860 73 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20  se that if X is 
2f870 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
2f880 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c  the N-th FROM cl
2f890 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20  ause term then. 
2f8a0 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20   ** the bitmask 
2f8b0 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61  for all FROM cla
2f8c0 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65  use terms to the
2f8d0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74   left of the N-t
2f8e0 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28  h term.  ** is (
2f8f0 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65  X-1).   An expre
2f900 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
2f910 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
2f920 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a  FT JOIN can use.
2f930 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52    ** its Expr.iR
2f940 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61  ightJoinTable va
2f950 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  lue to find the 
2f960 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72  bitmask of the r
2f970 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ight table.  ** 
2f980 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75  of the join.  Su
2f990 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72  btracting one fr
2f9a0 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62  om the right tab
2f9b0 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73  le bitmask gives
2f9c0 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20   a.  ** bitmask 
2f9d0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
2f9e0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
2f9f0 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67  e join.  Knowing
2fa00 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a   the bitmask.  *
2fa10 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  * for all tables
2fa20 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2fa30 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69  a left join is i
2fa40 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65  mportant.  Ticke
2fa50 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20  t #3015..  **.  
2fa60 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74  ** Note that bit
2fa70 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65  masks are create
2fa80 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69  d for all pTabLi
2fa90 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20  st->nSrc tables 
2faa0 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  in.  ** pTabList
2fab0 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66  , not just the f
2fac0 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61  irst nTabList ta
2fad0 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20  bles.  nTabList 
2fae0 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a  is normally.  **
2faf0 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69   equal to pTabLi
2fb00 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67  st->nSrc but mig
2fb10 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20  ht be shortened 
2fb20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a  to 1 if the.  **
2fb30 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
2fb40 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
2fb50 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
2fb60 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
2fb70 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
2fb80 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
2fb90 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2fba0 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
2fbb0 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
2fbc0 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61  UG.  {.    Bitma
2fbd0 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30  sk toTheLeft = 0
2fbe0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2fbf0 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
2fc00 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
2fc10 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d  Bitmask m = getM
2fc20 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
2fc30 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
2fc40 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73  ursor);.      as
2fc50 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54  sert( (m-1)==toT
2fc60 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  heLeft );.      
2fc70 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a  toTheLeft |= m;.
2fc80 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2fc90 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
2fca0 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
2fcb0 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20  ressions.  Note 
2fcc0 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65  that exprAnalyze
2fcd0 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64  () might.  ** ad
2fce0 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  d new virtual te
2fcf0 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  rms onto the end
2fd00 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2fd10 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ause.  We do not
2fd20 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e  .  ** want to an
2fd30 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74  alyze these virt
2fd40 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74  ual terms, so st
2fd50 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74  art analyzing at
2fd60 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e   the end.  ** an
2fd70 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73  d work forward s
2fd80 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64  o that the added
2fd90 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
2fda0 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73  re never process
2fdb0 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41  ed..  */.  exprA
2fdc0 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69  nalyzeAll(pTabLi
2fdd0 73 74 2c 20 73 57 42 49 2e 70 57 43 29 3b 0a 20  st, sWBI.pWC);. 
2fde0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2fdf0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
2fe00 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2fe10 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  r;.  }..  /* Che
2fe20 63 6b 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ck if the DISTIN
2fe30 43 54 20 71 75 61 6c 69 66 69 65 72 2c 20 69 66  CT qualifier, if
2fe40 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2c 20 69   there is one, i
2fe50 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 0a 20 20  s redundant. .  
2fe60 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
2fe70 6e 20 73 65 74 20 70 44 69 73 74 69 6e 63 74 20  n set pDistinct 
2fe80 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 57 68 65 72  to NULL and Wher
2fe90 65 49 6e 66 6f 2e 65 44 69 73 74 69 6e 63 74 20  eInfo.eDistinct 
2fea0 74 6f 0a 20 20 2a 2a 20 57 48 45 52 45 5f 44 49  to.  ** WHERE_DI
2feb0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20 74 6f  STINCT_UNIQUE to
2fec0 20 74 65 6c 6c 20 74 68 65 20 63 61 6c 6c 65 72   tell the caller
2fed0 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 44   to ignore the D
2fee0 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a 20 20  ISTINCT..  */.  
2fef0 69 66 28 20 70 44 69 73 74 69 6e 63 74 20 26 26  if( pDistinct &&
2ff00 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
2ff10 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  dant(pParse, pTa
2ff20 62 4c 69 73 74 2c 20 73 57 42 49 2e 70 57 43 2c  bList, sWBI.pWC,
2ff30 20 70 44 69 73 74 69 6e 63 74 29 20 29 7b 0a 20   pDistinct) ){. 
2ff40 20 20 20 70 44 69 73 74 69 6e 63 74 20 3d 20 30     pDistinct = 0
2ff50 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44  ;.    pWInfo->eD
2ff60 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
2ff70 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
2ff80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65  .  }..  /* Chose
2ff90 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
2ffa0 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20  to use for each 
2ffb0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
2ffc0 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
2ffd0 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69   ** This loop fi
2ffe0 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  lls in the follo
2fff0 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a  wing fields:.  *
30000 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  *.  **   pWInfo-
30010 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54  >a[].pIdx      T
30020 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  he index to use 
30030 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f  for this level o
30040 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  f the loop..  **
30050 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77     pWInfo->a[].w
30060 73 46 6c 61 67 73 20 20 20 57 48 45 52 45 5f 78  sFlags   WHERE_x
30070 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61  xx flags associa
30080 74 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20  ted with pIdx.  
30090 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
300a0 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e  .nEq       The n
300b0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20  umber of == and 
300c0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  IN constraints. 
300d0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
300e0 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 69 63  ].iFrom     Whic
300f0 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  h term of the FR
30100 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69  OM clause is bei
30110 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20  ng coded.  **   
30120 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62  pWInfo->a[].iTab
30130 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63  Cur   The VDBE c
30140 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61  ursor for the da
30150 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a  tabase table.  *
30160 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
30170 69 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44  iIdxCur   The VD
30180 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
30190 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70  e index.  **   p
301a0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d  WInfo->a[].pTerm
301b0 20 20 20 20 20 57 68 65 6e 20 77 73 46 6c 61 67       When wsFlag
301c0 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52  s==WO_OR, the OR
301d0 2d 63 6c 61 75 73 65 20 74 65 72 6d 0a 20 20 2a  -clause term.  *
301e0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
301f0 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75   also figures ou
30200 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72  t the nesting or
30210 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  der of tables in
30220 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63   the FROM.  ** c
30230 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 57  lause..  */.  sW
30240 42 49 2e 6e 6f 74 56 61 6c 69 64 20 3d 20 7e 28  BI.notValid = ~(
30250 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 73 57 42  Bitmask)0;.  sWB
30260 49 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  I.pOrderBy = pOr
30270 64 65 72 42 79 3b 0a 20 20 73 57 42 49 2e 6e 20  derBy;.  sWBI.n 
30280 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 73 57  = nTabList;.  sW
30290 42 49 2e 70 44 69 73 74 69 6e 63 74 20 3d 20 70  BI.pDistinct = p
302a0 44 69 73 74 69 6e 63 74 3b 0a 20 20 61 6e 64 46  Distinct;.  andF
302b0 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45  lags = ~0;.  WHE
302c0 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
302d0 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
302e0 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 73 57  *\n"));.  for(sW
302f0 42 49 2e 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c  BI.i=iFrom=0, pL
30300 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
30310 73 57 42 49 2e 69 3c 6e 54 61 62 4c 69 73 74 3b  sWBI.i<nTabList;
30320 20 73 57 42 49 2e 69 2b 2b 2c 20 70 4c 65 76 65   sWBI.i++, pLeve
30330 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 43  l++){.    WhereC
30340 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20 20 20  ost bestPlan;   
30350 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 65 66        /* Most ef
30360 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73 65 65  ficient plan see
30370 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  n so far */.    
30380 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
30390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
303a0 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61  ndex for FROM ta
303b0 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d 20  ble at pTabItem 
303c0 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20  */.    int j;   
303d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303e0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
303f0 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c  g over FROM tabl
30400 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  es */.    int be
30410 73 74 4a 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  stJ = -1;       
30420 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
30430 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42  ue of j */.    B
30440 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20  itmask m;       
30450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
30460 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20  tmask value for 
30470 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20  j or bestJ */.  
30480 20 20 69 6e 74 20 69 73 4f 70 74 69 6d 61 6c 3b    int isOptimal;
30490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
304a0 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6f 70   Iterator for op
304b0 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d 61  timal/non-optima
304c0 6c 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20 20  l search */.    
304d0 69 6e 74 20 63 6b 4f 70 74 69 6d 61 6c 3b 20 20  int ckOptimal;  
304e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
304f0 6f 20 74 68 65 20 6f 70 74 69 6d 61 6c 20 73 63  o the optimal sc
30500 61 6e 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20  an check */.    
30510 69 6e 74 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e  int nUnconstrain
30520 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ed;         /* N
30530 75 6d 62 65 72 20 74 61 62 6c 65 73 20 77 69 74  umber tables wit
30540 68 6f 75 74 20 49 4e 44 45 58 45 44 20 42 59 20  hout INDEXED BY 
30550 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  */.    Bitmask n
30560 6f 74 49 6e 64 65 78 65 64 3b 20 20 20 20 20 20  otIndexed;      
30570 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61     /* Mask of ta
30580 62 6c 65 73 20 74 68 61 74 20 63 61 6e 6e 6f 74  bles that cannot
30590 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 2a 2f   use an index */
305a0 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62 65  ..    memset(&be
305b0 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65 6f  stPlan, 0, sizeo
305c0 66 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a 20 20  f(bestPlan));.  
305d0 20 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74    bestPlan.rCost
305e0 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
305f0 4c 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  L;.    WHERETRAC
30600 45 28 28 22 2a 2a 2a 20 42 65 67 69 6e 20 73 65  E(("*** Begin se
30610 61 72 63 68 20 66 6f 72 20 6c 6f 6f 70 20 25 64  arch for loop %d
30620 20 2a 2a 2a 5c 6e 22 2c 20 73 57 42 49 2e 69 29   ***\n", sWBI.i)
30630 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  );..    /* Loop 
30640 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 6d 61  through the rema
30650 69 6e 69 6e 67 20 65 6e 74 72 69 65 73 20 69 6e  ining entries in
30660 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
30670 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 20 20 20   to find the.   
30680 20 2a 2a 20 6e 65 78 74 20 6e 65 73 74 65 64 20   ** next nested 
30690 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f 6f 70 20 74  loop. The loop t
306a0 65 73 74 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c  ests all FROM cl
306b0 61 75 73 65 20 65 6e 74 72 69 65 73 0a 20 20 20  ause entries.   
306c0 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e 63 65 20   ** either once 
306d0 6f 72 20 74 77 69 63 65 2e 20 0a 20 20 20 20 2a  or twice. .    *
306e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  *.    ** The fir
306f0 73 74 20 74 65 73 74 20 69 73 20 61 6c 77 61 79  st test is alway
30700 73 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74  s performed if t
30710 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
30720 6d 6f 72 65 20 65 6e 74 72 69 65 73 0a 20 20 20  more entries.   
30730 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67 20 61 6e   ** remaining an
30740 64 20 6e 65 76 65 72 20 70 65 72 66 6f 72 6d 65  d never performe
30750 64 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  d if there is on
30760 6c 79 20 6f 6e 65 20 46 52 4f 4d 20 63 6c 61 75  ly one FROM clau
30770 73 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20  se entry.    ** 
30780 74 6f 20 63 68 6f 6f 73 65 20 66 72 6f 6d 2e 20  to choose from. 
30790 20 54 68 65 20 66 69 72 73 74 20 74 65 73 74 20   The first test 
307a0 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e 20 22 6f 70  looks for an "op
307b0 74 69 6d 61 6c 22 20 73 63 61 6e 2e 20 20 49 6e  timal" scan.  In
307c0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e  .    ** this con
307d0 74 65 78 74 20 61 6e 20 6f 70 74 69 6d 61 6c 20  text an optimal 
307e0 73 63 61 6e 20 69 73 20 6f 6e 65 20 74 68 61 74  scan is one that
307f0 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20 73   uses the same s
30800 74 72 61 74 65 67 79 0a 20 20 20 20 2a 2a 20 66  trategy.    ** f
30810 6f 72 20 74 68 65 20 67 69 76 65 6e 20 46 52 4f  or the given FRO
30820 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 61  M clause entry a
30830 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6c 65 63  s would be selec
30840 74 65 64 20 69 66 20 74 68 65 20 65 6e 74 72 79  ted if the entry
30850 0a 20 20 20 20 2a 2a 20 77 65 72 65 20 75 73 65  .    ** were use
30860 64 20 61 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f  d as the innermo
30870 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20  st nested loop. 
30880 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
30890 20 61 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20   a table.    ** 
308a0 69 73 20 63 68 6f 73 65 6e 20 73 75 63 68 20 74  is chosen such t
308b0 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20  hat the cost of 
308c0 72 75 6e 6e 69 6e 67 20 74 68 61 74 20 74 61 62  running that tab
308d0 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 64  le cannot be red
308e0 75 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 77  uced.    ** by w
308f0 61 69 74 69 6e 67 20 66 6f 72 20 6f 74 68 65 72  aiting for other
30900 20 74 61 62 6c 65 73 20 74 6f 20 72 75 6e 20 66   tables to run f
30910 69 72 73 74 2e 20 20 54 68 69 73 20 22 6f 70 74  irst.  This "opt
30920 69 6d 61 6c 22 20 74 65 73 74 20 77 6f 72 6b 73  imal" test works
30930 0a 20 20 20 20 2a 2a 20 62 79 20 66 69 72 73 74  .    ** by first
30940 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74   assuming that t
30950 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
30960 73 20 6f 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  s on the inner l
30970 6f 6f 70 20 61 6e 64 20 66 69 6e 64 69 6e 67 0a  oop and finding.
30980 20 20 20 20 2a 2a 20 69 74 73 20 71 75 65 72 79      ** its query
30990 20 70 6c 61 6e 2c 20 74 68 65 6e 20 63 68 65 63   plan, then chec
309a0 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 74  king to see if t
309b0 68 61 74 20 71 75 65 72 79 20 70 6c 61 6e 20 75  hat query plan u
309c0 73 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 6f  ses any.    ** o
309d0 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
309e0 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
309f0 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 2e 20 20  sWBI.notValid.  
30a00 49 66 20 6e 6f 20 6e 6f 74 56 61 6c 69 64 20 74  If no notValid t
30a10 65 72 6d 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  erms.    ** are 
30a20 75 73 65 64 20 74 68 65 6e 20 74 68 65 20 22 6f  used then the "o
30a30 70 74 69 6d 61 6c 22 20 71 75 65 72 79 20 70 6c  ptimal" query pl
30a40 61 6e 20 77 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a  an works..    **
30a50 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
30a60 74 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 2e  t the WhereCost.
30a70 6e 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 66  nRow parameter f
30a80 6f 72 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63  or an optimal sc
30a90 61 6e 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  an might.    ** 
30aa0 6e 6f 74 20 62 65 20 61 73 20 73 6d 61 6c 6c 20  not be as small 
30ab0 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69  as it would be i
30ac0 66 20 74 68 65 20 74 61 62 6c 65 20 72 65 61 6c  f the table real
30ad0 6c 79 20 77 65 72 65 20 74 68 65 20 69 6e 6e 65  ly were the inne
30ae0 72 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 6a 6f 69  rmost.    ** joi
30af0 6e 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  n.  The nRow val
30b00 75 65 20 63 61 6e 20 62 65 20 72 65 64 75 63 65  ue can be reduce
30b10 64 20 62 79 20 57 48 45 52 45 20 63 6c 61 75 73  d by WHERE claus
30b20 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
30b30 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74    ** that do not
30b40 20 75 73 65 20 69 6e 64 69 63 65 73 2e 20 20 42   use indices.  B
30b50 75 74 20 74 68 69 73 20 6e 52 6f 77 20 72 65 64  ut this nRow red
30b60 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 68 61 70 70  uction only happ
30b70 65 6e 73 20 69 66 20 74 68 65 0a 20 20 20 20 2a  ens if the.    *
30b80 2a 20 74 61 62 6c 65 20 72 65 61 6c 6c 79 20 69  * table really i
30b90 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20  s the innermost 
30ba0 6a 6f 69 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  join.  .    **. 
30bb0 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64     ** The second
30bc0 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20   loop iteration 
30bd0 69 73 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65  is only performe
30be0 64 20 69 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20  d if no optimal 
30bf0 73 63 61 6e 0a 20 20 20 20 2a 2a 20 73 74 72 61  scan.    ** stra
30c00 74 65 67 69 65 73 20 77 65 72 65 20 66 6f 75 6e  tegies were foun
30c10 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 69  d by the first i
30c20 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 73  teration. This s
30c30 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 0a  econd iteration.
30c40 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 20 74      ** is used t
30c50 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
30c60 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 63 61   lowest cost sca
30c70 6e 20 6f 76 65 72 61 6c 6c 2e 0a 20 20 20 20 2a  n overall..    *
30c80 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 6f 75 74  *.    ** Without
30c90 20 74 68 65 20 6f 70 74 69 6d 61 6c 20 73 63 61   the optimal sca
30ca0 6e 20 73 74 65 70 20 28 74 68 65 20 66 69 72 73  n step (the firs
30cb0 74 20 69 74 65 72 61 74 69 6f 6e 29 20 61 20 73  t iteration) a s
30cc0 75 62 6f 70 74 69 6d 61 6c 0a 20 20 20 20 2a 2a  uboptimal.    **
30cd0 20 70 6c 61 6e 20 6d 69 67 68 74 20 62 65 20 63   plan might be c
30ce0 68 6f 73 65 6e 20 66 6f 72 20 71 75 65 72 69 65  hosen for querie
30cf0 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  s like this:.   
30d00 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20   **   .    **   
30d10 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
30d20 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20 20  a, b); .    **  
30d30 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
30d40 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20 20  (c, d);.    **  
30d50 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
30d60 32 2c 20 74 31 20 57 48 45 52 45 20 74 32 2e 72  2, t1 WHERE t2.r
30d70 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20 20  owid = t1.a;.   
30d80 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 62   **.    ** The b
30d90 65 73 74 20 73 74 72 61 74 65 67 79 20 69 73 20  est strategy is 
30da0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
30db0 67 68 20 74 61 62 6c 65 20 74 31 20 66 69 72 73  gh table t1 firs
30dc0 74 2e 20 48 6f 77 65 76 65 72 20 69 74 0a 20 20  t. However it.  
30dd0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
30de0 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  ible to determin
30df0 65 20 74 68 69 73 20 77 69 74 68 20 61 20 73 69  e this with a si
30e00 6d 70 6c 65 20 67 72 65 65 64 79 20 61 6c 67 6f  mple greedy algo
30e10 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 53 69  rithm..    ** Si
30e20 6e 63 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20  nce the cost of 
30e30 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
30e40 72 6f 75 67 68 20 74 61 62 6c 65 20 74 32 20 69  rough table t2 i
30e50 73 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20  s the same .    
30e60 2a 2a 20 61 73 20 74 68 65 20 63 6f 73 74 20 6f  ** as the cost o
30e70 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  f a linear scan 
30e80 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31  through table t1
30e90 2c 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64  , a simple greed
30ea0 79 20 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72 69  y .    ** algori
30eb0 74 68 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20 74  thm may choose t
30ec0 6f 20 75 73 65 20 74 32 20 66 6f 72 20 74 68 65  o use t2 for the
30ed0 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68 69   outer loop, whi
30ee0 63 68 20 69 73 20 61 20 6d 75 63 68 0a 20 20 20  ch is a much.   
30ef0 20 2a 2a 20 63 6f 73 74 6c 69 65 72 20 61 70 70   ** costlier app
30f00 72 6f 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  roach..    */.  
30f10 20 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64    nUnconstrained
30f20 20 3d 20 30 3b 0a 20 20 20 20 6e 6f 74 49 6e 64   = 0;.    notInd
30f30 65 78 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  exed = 0;..    /
30f40 2a 20 54 68 65 20 6f 70 74 69 6d 61 6c 20 73 63  * The optimal sc
30f50 61 6e 20 63 68 65 63 6b 20 6f 6e 6c 79 20 6f 63  an check only oc
30f60 63 75 72 73 20 69 66 20 74 68 65 72 65 20 61 72  curs if there ar
30f70 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 61  e two or more ta
30f80 62 6c 65 73 0a 20 20 20 20 2a 2a 20 61 76 61 69  bles.    ** avai
30f90 6c 61 62 6c 65 20 74 6f 20 62 65 20 72 65 6f 72  lable to be reor
30fa0 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  dered */.    if(
30fb0 20 69 46 72 6f 6d 3d 3d 6e 54 61 62 4c 69 73 74   iFrom==nTabList
30fc0 2d 31 20 29 7b 0a 20 20 20 20 20 20 63 6b 4f 70  -1 ){.      ckOp
30fd0 74 69 6d 61 6c 20 3d 20 30 3b 20 20 2f 2a 20 43  timal = 0;  /* C
30fe0 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6a 75  ommon case of ju
30ff0 73 74 20 6f 6e 65 20 74 61 62 6c 65 20 69 6e 20  st one table in 
31000 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
31010 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
31020 20 20 20 20 63 6b 4f 70 74 69 6d 61 6c 20 3d 20      ckOptimal = 
31030 2d 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  -1;.      for(j=
31040 69 46 72 6f 6d 2c 20 73 57 42 49 2e 70 53 72 63  iFrom, sWBI.pSrc
31050 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  =&pTabList->a[j]
31060 3b 20 6a 3c 6e 54 61 62 4c 69 73 74 3b 20 6a 2b  ; j<nTabList; j+
31070 2b 2c 20 73 57 42 49 2e 70 53 72 63 2b 2b 29 7b  +, sWBI.pSrc++){
31080 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 67 65 74  .        m = get
31090 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 73  Mask(pMaskSet, s
310a0 57 42 49 2e 70 53 72 63 2d 3e 69 43 75 72 73 6f  WBI.pSrc->iCurso
310b0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
310c0 28 6d 20 26 20 73 57 42 49 2e 6e 6f 74 56 61 6c  (m & sWBI.notVal
310d0 69 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  id)==0 ){.      
310e0 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d      if( j==iFrom
310f0 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20   ) iFrom++;.    
31100 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
31110 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31120 20 20 69 66 28 20 6a 3e 69 46 72 6f 6d 20 26 26    if( j>iFrom &&
31130 20 28 73 57 42 49 2e 70 53 72 63 2d 3e 6a 6f 69   (sWBI.pSrc->joi
31140 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
31150 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
31160 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
31170 69 66 28 20 2b 2b 63 6b 4f 70 74 69 6d 61 6c 20  if( ++ckOptimal 
31180 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
31190 20 69 66 28 20 28 73 57 42 49 2e 70 53 72 63 2d   if( (sWBI.pSrc-
311a0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
311b0 45 46 54 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  EFT)!=0 ) break;
311c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
311d0 20 20 20 61 73 73 65 72 74 28 20 63 6b 4f 70 74     assert( ckOpt
311e0 69 6d 61 6c 3d 3d 30 20 7c 7c 20 63 6b 4f 70 74  imal==0 || ckOpt
311f0 69 6d 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  imal==1 );..    
31200 66 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d 63 6b  for(isOptimal=ck
31210 4f 70 74 69 6d 61 6c 3b 20 69 73 4f 70 74 69 6d  Optimal; isOptim
31220 61 6c 3e 3d 30 20 26 26 20 62 65 73 74 4a 3c 30  al>=0 && bestJ<0
31230 3b 20 69 73 4f 70 74 69 6d 61 6c 2d 2d 29 7b 0a  ; isOptimal--){.
31240 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f        for(j=iFro
31250 6d 2c 20 73 57 42 49 2e 70 53 72 63 3d 26 70 54  m, sWBI.pSrc=&pT
31260 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c  abList->a[j]; j<
31270 6e 54 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20 73  nTabList; j++, s
31280 57 42 49 2e 70 53 72 63 2b 2b 29 7b 0a 20 20 20  WBI.pSrc++){.   
31290 20 20 20 20 20 69 66 28 20 6a 3e 69 46 72 6f 6d       if( j>iFrom
312a0 20 26 26 20 28 73 57 42 49 2e 70 53 72 63 2d 3e   && (sWBI.pSrc->
312b0 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
312c0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
312d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
312e0 2a 20 54 68 69 73 20 62 72 65 61 6b 20 61 6e 64  * This break and
312f0 20 6f 6e 65 20 6c 69 6b 65 20 69 74 20 69 6e 20   one like it in 
31300 74 68 65 20 63 6b 4f 70 74 69 6d 61 6c 20 63 6f  the ckOptimal co
31310 6d 70 75 74 61 74 69 6f 6e 20 6c 6f 6f 70 0a 20  mputation loop. 
31320 20 20 20 20 20 20 20 20 20 2a 2a 20 61 62 6f 76           ** abov
31330 65 20 70 72 65 76 65 6e 74 20 74 61 62 6c 65 20  e prevent table 
31340 72 65 6f 72 64 65 72 69 6e 67 20 61 63 72 6f 73  reordering acros
31350 73 20 4c 45 46 54 20 61 6e 64 20 43 52 4f 53 53  s LEFT and CROSS
31360 20 4a 4f 49 4e 73 2e 0a 20 20 20 20 20 20 20 20   JOINs..        
31370 20 20 2a 2a 20 54 68 65 20 4c 45 46 54 20 4a 4f    ** The LEFT JO
31380 49 4e 20 63 61 73 65 20 69 73 20 6e 65 63 65 73  IN case is neces
31390 73 61 72 79 20 66 6f 72 20 63 6f 72 72 65 63 74  sary for correct
313a0 6e 65 73 73 2e 20 20 54 68 65 20 70 72 6f 68 69  ness.  The prohi
313b0 62 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  bition.         
313c0 20 2a 2a 20 61 67 61 69 6e 73 74 20 72 65 6f 72   ** against reor
313d0 64 65 72 69 6e 67 20 61 63 72 6f 73 73 20 61 20  dering across a 
313e0 43 52 4f 53 53 20 4a 4f 49 4e 20 69 73 20 61 6e  CROSS JOIN is an
313f0 20 53 51 4c 69 74 65 20 66 65 61 74 75 72 65 20   SQLite feature 
31400 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
31410 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 64 65 76  * allows the dev
31420 65 6c 6f 70 65 72 20 74 6f 20 63 6f 6e 74 72 6f  eloper to contro
31430 6c 20 74 61 62 6c 65 20 72 65 6f 72 64 65 72 69  l table reorderi
31440 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
31450 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
31460 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 67 65 74  .        m = get
31470 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 73  Mask(pMaskSet, s
31480 57 42 49 2e 70 53 72 63 2d 3e 69 43 75 72 73 6f  WBI.pSrc->iCurso
31490 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
314a0 28 6d 20 26 20 73 57 42 49 2e 6e 6f 74 56 61 6c  (m & sWBI.notVal
314b0 69 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  id)==0 ){.      
314c0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e 69 46      assert( j>iF
314d0 72 6f 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  rom );.         
314e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
314f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 57 42     }.        sWB
31500 49 2e 6e 6f 74 52 65 61 64 79 20 3d 20 28 69 73  I.notReady = (is
31510 4f 70 74 69 6d 61 6c 20 3f 20 6d 20 3a 20 73 57  Optimal ? m : sW
31520 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3b 0a 20 20  BI.notValid);.  
31530 20 20 20 20 20 20 69 66 28 20 73 57 42 49 2e 70        if( sWBI.p
31540 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29  Src->pIndex==0 )
31550 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2b   nUnconstrained+
31560 2b 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 57 48  +;.  .        WH
31570 45 52 45 54 52 41 43 45 28 28 22 20 20 20 3d 3d  ERETRACE(("   ==
31580 3d 20 74 72 79 69 6e 67 20 74 61 62 6c 65 20 25  = trying table %
31590 64 20 28 25 73 29 20 77 69 74 68 20 69 73 4f 70  d (%s) with isOp
315a0 74 69 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e 22 2c  timal=%d ===\n",
315b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
315c0 20 20 20 20 20 6a 2c 20 73 57 42 49 2e 70 53 72       j, sWBI.pSr
315d0 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  c->pTab->zName, 
315e0 69 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20 20 20  isOptimal));.   
315f0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 57 42       assert( sWB
31600 49 2e 70 53 72 63 2d 3e 70 54 61 62 20 29 3b 0a  I.pSrc->pTab );.
31610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31620 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
31630 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
31640 69 72 74 75 61 6c 28 73 57 42 49 2e 70 53 72 63  irtual(sWBI.pSrc
31650 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
31660 20 20 20 20 20 73 57 42 49 2e 70 70 49 64 78 49       sWBI.ppIdxI
31670 6e 66 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  nfo = &pWInfo->a
31680 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20  [j].pIdxInfo;.  
31690 20 20 20 20 20 20 20 20 62 65 73 74 56 69 72 74          bestVirt
316a0 75 61 6c 49 6e 64 65 78 28 26 73 57 42 49 29 3b  ualIndex(&sWBI);
316b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 0a  .        }else .
316c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
316d0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 42  .          bestB
316e0 74 72 65 65 49 6e 64 65 78 28 26 73 57 42 49 29  treeIndex(&sWBI)
316f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31700 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
31710 74 69 6d 61 6c 20 7c 7c 20 28 73 57 42 49 2e 63  timal || (sWBI.c
31720 6f 73 74 2e 75 73 65 64 26 73 57 42 49 2e 6e 6f  ost.used&sWBI.no
31730 74 56 61 6c 69 64 29 3d 3d 30 20 29 3b 0a 0a 20  tValid)==0 );.. 
31740 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
31750 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
31760 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  e is present, th
31770 65 6e 20 74 68 65 20 70 6c 61 6e 20 6d 75 73 74  en the plan must
31780 20 75 73 65 20 74 68 61 74 0a 20 20 20 20 20 20   use that.      
31790 20 20 2a 2a 20 69 6e 64 65 78 20 69 66 20 69 74    ** index if it
317a0 20 75 73 65 73 20 61 6e 79 20 69 6e 64 65 78 20   uses any index 
317b0 61 74 20 61 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  at all */.      
317c0 20 20 61 73 73 65 72 74 28 20 73 57 42 49 2e 70    assert( sWBI.p
317d0 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a  Src->pIndex==0 .
317e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317f0 20 20 7c 7c 20 28 73 57 42 49 2e 63 6f 73 74 2e    || (sWBI.cost.
31800 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
31810 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
31820 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  N)==0.          
31830 20 20 20 20 20 20 20 20 7c 7c 20 73 57 42 49 2e          || sWBI.
31840 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
31850 3d 3d 73 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e  ==sWBI.pSrc->pIn
31860 64 65 78 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  dex );..        
31870 69 66 28 20 69 73 4f 70 74 69 6d 61 6c 20 26 26  if( isOptimal &&
31880 20 28 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e   (sWBI.cost.plan
31890 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
318a0 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d  _NOT_FULLSCAN)==
318b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  0 ){.          n
318c0 6f 74 49 6e 64 65 78 65 64 20 7c 3d 20 6d 3b 0a  otIndexed |= m;.
318d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
318e0 20 20 69 66 28 20 69 73 4f 70 74 69 6d 61 6c 20    if( isOptimal 
318f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 57 49  ){.          pWI
31900 6e 66 6f 2d 3e 61 5b 6a 5d 2e 72 4f 70 74 43 6f  nfo->a[j].rOptCo
31910 73 74 20 3d 20 73 57 42 49 2e 63 6f 73 74 2e 72  st = sWBI.cost.r
31920 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  Cost;.        }e
31930 6c 73 65 20 69 66 28 20 63 6b 4f 70 74 69 6d 61  lse if( ckOptima
31940 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
31950 2a 20 49 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  * If two or more
31960 20 74 61 62 6c 65 73 20 68 61 76 65 20 6e 65 61   tables have nea
31970 72 6c 79 20 74 68 65 20 73 61 6d 65 20 6f 75 74  rly the same out
31980 65 72 20 6c 6f 6f 70 20 63 6f 73 74 2c 20 62 75  er loop cost, bu
31990 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  t.          ** v
319a0 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 69 6e  ery different in
319b0 6e 65 72 20 6c 6f 6f 70 20 28 6f 70 74 69 6d 61  ner loop (optima
319c0 6c 29 20 63 6f 73 74 2c 20 77 65 20 77 61 6e 74  l) cost, we want
319d0 20 74 6f 20 63 68 6f 6f 73 65 0a 20 20 20 20 20   to choose.     
319e0 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
319f0 6f 75 74 65 72 20 6c 6f 6f 70 20 74 68 61 74 20  outer loop that 
31a00 74 61 62 6c 65 20 77 68 69 63 68 20 62 65 6e 65  table which bene
31a10 66 69 74 73 20 74 68 65 20 6c 65 61 73 74 20 66  fits the least f
31a20 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rom.          **
31a30 20 62 65 69 6e 67 20 69 6e 20 74 68 65 20 69 6e   being in the in
31a40 6e 65 72 20 6c 6f 6f 70 2e 20 20 54 68 65 20 66  ner loop.  The f
31a50 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 73 63  ollowing code sc
31a60 61 6c 65 73 20 74 68 65 20 0a 20 20 20 20 20 20  ales the .      
31a70 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 6c 6f 6f      ** outer loo
31a80 70 20 63 6f 73 74 20 65 73 74 69 6d 61 74 65 20  p cost estimate 
31a90 74 6f 20 61 63 63 6f 6d 70 6c 69 73 68 20 74 68  to accomplish th
31aa0 61 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  at. */.         
31ab0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20   WHERETRACE(("  
31ac0 20 73 63 61 6c 69 6e 67 20 63 6f 73 74 20 66 72   scaling cost fr
31ad0 6f 6d 20 25 2e 31 66 20 74 6f 20 25 2e 31 66 5c  om %.1f to %.1f\
31ae0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
31af0 20 20 20 20 20 20 20 20 20 20 73 57 42 49 2e 63            sWBI.c
31b00 6f 73 74 2e 72 43 6f 73 74 2c 0a 20 20 20 20 20  ost.rCost,.     
31b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b20 20 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f 73 74   sWBI.cost.rCost
31b30 2f 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 72 4f  /pWInfo->a[j].rO
31b40 70 74 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20  ptCost));.      
31b50 20 20 20 20 73 57 42 49 2e 63 6f 73 74 2e 72 43      sWBI.cost.rC
31b60 6f 73 74 20 2f 3d 20 70 57 49 6e 66 6f 2d 3e 61  ost /= pWInfo->a
31b70 5b 6a 5d 2e 72 4f 70 74 43 6f 73 74 3b 0a 20 20  [j].rOptCost;.  
31b80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
31b90 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 75   /* Conditions u
31ba0 6e 64 65 72 20 77 68 69 63 68 20 74 68 69 73 20  nder which this 
31bb0 74 61 62 6c 65 20 62 65 63 6f 6d 65 73 20 74 68  table becomes th
31bc0 65 20 62 65 73 74 20 73 6f 20 66 61 72 3a 0a 20  e best so far:. 
31bd0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31be0 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 74    **   (1) The t
31bf0 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20 64 65  able must not de
31c00 70 65 6e 64 20 6f 6e 20 6f 74 68 65 72 20 74 61  pend on other ta
31c10 62 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  bles that have n
31c20 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ot.        **   
31c30 20 20 20 20 79 65 74 20 72 75 6e 2e 20 20 28 49      yet run.  (I
31c40 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
31c50 74 20 6d 75 73 74 20 6e 6f 74 20 64 65 70 65 6e  t must not depen
31c60 64 20 6f 6e 20 74 61 62 6c 65 73 0a 20 20 20 20  d on tables.    
31c70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69 6e 20      **       in 
31c80 69 6e 6e 65 72 20 6c 6f 6f 70 73 2e 29 0a 20 20  inner loops.).  
31c90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31ca0 20 2a 2a 20 20 20 28 32 29 20 28 54 68 69 73 20   **   (2) (This 
31cb0 72 75 6c 65 20 77 61 73 20 72 65 6d 6f 76 65 64  rule was removed
31cc0 20 6f 6e 20 32 30 31 32 2d 31 31 2d 30 39 2e 20   on 2012-11-09. 
31cd0 20 54 68 65 20 73 63 61 6c 69 6e 67 20 6f 66 20   The scaling of 
31ce0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  the.        **  
31cf0 20 20 20 20 20 63 6f 73 74 20 75 73 69 6e 67 20       cost using 
31d00 74 68 65 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e  the optimal scan
31d10 20 63 6f 73 74 20 6d 61 64 65 20 74 68 69 73 20   cost made this 
31d20 72 75 6c 65 20 6f 62 73 6f 6c 65 74 65 2e 29 0a  rule obsolete.).
31d30 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31d40 20 20 20 2a 2a 20 20 20 28 33 29 20 41 6c 6c 20     **   (3) All 
31d50 74 61 62 6c 65 73 20 68 61 76 65 20 61 6e 20 49  tables have an I
31d60 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
31d70 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 6c   or this table l
31d80 61 63 6b 73 20 61 6e 0a 20 20 20 20 20 20 20 20  acks an.        
31d90 2a 2a 20 20 20 20 20 20 20 49 4e 44 45 58 45 44  **       INDEXED
31da0 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 74 68   BY clause or th
31db0 69 73 20 74 61 62 6c 65 20 75 73 65 73 20 74 68  is table uses th
31dc0 65 20 73 70 65 63 69 66 69 63 0a 20 20 20 20 20  e specific.     
31dd0 20 20 20 2a 2a 20 20 20 20 20 20 20 69 6e 64 65     **       inde
31de0 78 20 73 70 65 63 69 66 69 65 64 20 62 79 20 69  x specified by i
31df0 74 73 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ts INDEXED BY cl
31e00 61 75 73 65 2e 20 20 54 68 69 73 20 72 75 6c 65  ause.  This rule
31e10 20 65 6e 73 75 72 65 73 0a 20 20 20 20 20 20 20   ensures.       
31e20 20 2a 2a 20 20 20 20 20 20 20 74 68 61 74 20 61   **       that a
31e30 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 69 73 20   best-so-far is 
31e40 61 6c 77 61 79 73 20 73 65 6c 65 63 74 65 64 20  always selected 
31e50 65 76 65 6e 20 69 66 20 61 6e 20 69 6d 70 6f 73  even if an impos
31e60 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
31e70 20 20 20 20 20 20 20 63 6f 6d 62 69 6e 61 74 69         combinati
31e80 6f 6e 20 6f 66 20 49 4e 44 45 58 45 44 20 42 59  on of INDEXED BY
31e90 20 63 6c 61 75 73 65 73 20 61 72 65 20 67 69 76   clauses are giv
31ea0 65 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 0a 20  en.  The error. 
31eb0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
31ec0 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64  will be detected
31ed0 20 61 6e 64 20 72 65 6c 61 79 65 64 20 62 61 63   and relayed bac
31ee0 6b 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63 61  k to the applica
31ef0 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 20 20 20 20  tion later..    
31f00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 54 68 65      **       The
31f10 20 4e 45 56 45 52 28 29 20 63 6f 6d 65 73 20 61   NEVER() comes a
31f20 62 6f 75 74 20 62 65 63 61 75 73 65 20 72 75 6c  bout because rul
31f30 65 20 28 32 29 20 61 62 6f 76 65 20 70 72 65 76  e (2) above prev
31f40 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ents.        ** 
31f50 20 20 20 20 20 20 41 6e 20 69 6e 64 65 78 61 62        An indexab
31f60 6c 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63  le full-table-sc
31f70 61 6e 20 66 72 6f 6d 20 72 65 61 63 68 69 6e 67  an from reaching
31f80 20 72 75 6c 65 20 28 33 29 2e 0a 20 20 20 20 20   rule (3)..     
31f90 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31fa0 20 20 20 28 34 29 20 54 68 65 20 70 6c 61 6e 20     (4) The plan 
31fb0 63 6f 73 74 20 6d 75 73 74 20 62 65 20 6c 6f 77  cost must be low
31fc0 65 72 20 74 68 61 6e 20 70 72 69 6f 72 20 70 6c  er than prior pl
31fd0 61 6e 73 2c 20 77 68 65 72 65 20 22 63 6f 73 74  ans, where "cost
31fe0 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  ".        **    
31ff0 20 20 20 69 73 20 64 65 66 69 6e 65 64 20 62 79     is defined by
32000 20 74 68 65 20 63 6f 6d 70 61 72 65 43 6f 73 74   the compareCost
32010 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  () function abov
32020 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  e. .        */. 
32030 20 20 20 20 20 20 20 69 66 28 20 28 73 57 42 49         if( (sWBI
32040 2e 63 6f 73 74 2e 75 73 65 64 26 73 57 42 49 2e  .cost.used&sWBI.
32050 6e 6f 74 56 61 6c 69 64 29 3d 3d 30 20 20 20 20  notValid)==0    
32060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32070 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
32080 20 20 20 20 20 20 26 26 20 28 6e 55 6e 63 6f 6e        && (nUncon
32090 73 74 72 61 69 6e 65 64 3d 3d 30 20 7c 7c 20 73  strained==0 || s
320a0 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e 64 65 78  WBI.pSrc->pIndex
320b0 3d 3d 30 20 20 20 20 20 20 20 20 2f 2a 20 28 33  ==0        /* (3
320c0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
320d0 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28 28 73       || NEVER((s
320e0 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73  WBI.cost.plan.ws
320f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
32100 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29 29  T_FULLSCAN)!=0))
32110 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
32120 28 62 65 73 74 4a 3c 30 20 7c 7c 20 63 6f 6d 70  (bestJ<0 || comp
32130 61 72 65 43 6f 73 74 28 26 73 57 42 49 2e 63 6f  areCost(&sWBI.co
32140 73 74 2c 20 26 62 65 73 74 50 6c 61 6e 29 29 20  st, &bestPlan)) 
32150 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
32160 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
32170 20 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20   WHERETRACE(("  
32180 20 3d 3d 3d 20 74 61 62 6c 65 20 25 64 20 28 25   === table %d (%
32190 73 29 20 69 73 20 62 65 73 74 20 73 6f 20 66 61  s) is best so fa
321a0 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  r\n".           
321b0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20             "    
321c0 20 20 20 63 6f 73 74 3d 25 2e 31 66 2c 20 6e 52     cost=%.1f, nR
321d0 6f 77 3d 25 2e 31 66 2c 20 6e 4f 42 53 61 74 3d  ow=%.1f, nOBSat=
321e0 25 64 2c 20 77 73 46 6c 61 67 73 3d 25 30 38 78  %d, wsFlags=%08x
321f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
32200 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20 73 57             j, sW
32210 42 49 2e 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  BI.pSrc->pTab->z
32220 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
32230 20 20 20 20 20 20 20 20 20 20 20 20 73 57 42 49              sWBI
32240 2e 63 6f 73 74 2e 72 43 6f 73 74 2c 20 73 57 42  .cost.rCost, sWB
32250 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77  I.cost.plan.nRow
32260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32270 20 20 20 20 20 20 20 20 73 57 42 49 2e 63 6f 73          sWBI.cos
32280 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 2c 20 73  t.plan.nOBSat, s
32290 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73  WBI.cost.plan.ws
322a0 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 20 20 20  Flags));.       
322b0 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 57     bestPlan = sW
322c0 42 49 2e 63 6f 73 74 3b 0a 20 20 20 20 20 20 20  BI.cost;.       
322d0 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20     bestJ = j;.  
322e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
322f0 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 6c 69   /* In a join li
32300 6b 65 20 22 77 20 4a 4f 49 4e 20 78 20 4c 45 46  ke "w JOIN x LEF
32310 54 20 4a 4f 49 4e 20 79 20 4a 4f 49 4e 20 7a 22  T JOIN y JOIN z"
32320 20 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74    make sure that
32330 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
32340 65 20 79 20 28 61 6e 64 20 6e 6f 74 20 74 61 62  e y (and not tab
32350 6c 65 20 7a 29 20 69 73 20 61 6c 77 61 79 73 20  le z) is always 
32360 74 68 65 20 6e 65 78 74 20 69 6e 6e 65 72 20 6c  the next inner l
32370 6f 6f 70 20 69 6e 73 69 64 65 0a 20 20 20 20 20  oop inside.     
32380 20 20 20 2a 2a 20 6f 66 20 74 61 62 6c 65 20 78     ** of table x
32390 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
323a0 20 28 73 57 42 49 2e 70 53 72 63 2d 3e 6a 6f 69   (sWBI.pSrc->joi
323b0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
323c0 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
323d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
323e0 73 73 65 72 74 28 20 62 65 73 74 4a 3e 3d 30 20  ssert( bestJ>=0 
323f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
32400 57 42 49 2e 6e 6f 74 56 61 6c 69 64 20 26 20 67  WBI.notValid & g
32410 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
32420 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
32430 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a  tJ].iCursor) );.
32440 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74      assert( best
32450 4a 3d 3d 69 46 72 6f 6d 20 7c 7c 20 28 70 54 61  J==iFrom || (pTa
32460 62 4c 69 73 74 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  bList->a[iFrom].
32470 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
32480 46 54 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65  FT)==0 );.    te
32490 73 74 63 61 73 65 28 20 62 65 73 74 4a 3e 69 46  stcase( bestJ>iF
324a0 72 6f 6d 20 26 26 20 28 70 54 61 62 4c 69 73 74  rom && (pTabList
324b0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74  ->a[iFrom].joint
324c0 79 70 65 20 26 20 4a 54 5f 43 52 4f 53 53 29 21  ype & JT_CROSS)!
324d0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
324e0 73 65 28 20 62 65 73 74 4a 3e 69 46 72 6f 6d 20  se( bestJ>iFrom 
324f0 26 26 20 62 65 73 74 4a 3c 6e 54 61 62 4c 69 73  && bestJ<nTabLis
32500 74 2d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20  t-1.            
32510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
32520 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65   (pTabList->a[be
32530 73 74 4a 2b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  stJ+1].jointype 
32540 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 3b  & JT_LEFT)!=0 );
32550 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
32560 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
32570 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64  selects table %d
32580 20 28 25 73 29 20 66 6f 72 20 6c 6f 6f 70 20 25   (%s) for loop %
32590 64 20 77 69 74 68 3a 5c 6e 22 0a 20 20 20 20 20  d with:\n".     
325a0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20             "    
325b0 63 6f 73 74 3d 25 2e 31 66 2c 20 6e 52 6f 77 3d  cost=%.1f, nRow=
325c0 25 2e 31 66 2c 20 6e 4f 42 53 61 74 3d 25 64 2c  %.1f, nOBSat=%d,
325d0 20 77 73 46 6c 61 67 73 3d 30 78 25 30 38 78 5c   wsFlags=0x%08x\
325e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
325f0 20 20 20 20 62 65 73 74 4a 2c 20 70 54 61 62 4c      bestJ, pTabL
32600 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 54  ist->a[bestJ].pT
32610 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
32620 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65             pLeve
32630 6c 2d 70 57 49 6e 66 6f 2d 3e 61 2c 20 62 65 73  l-pWInfo->a, bes
32640 74 50 6c 61 6e 2e 72 43 6f 73 74 2c 20 62 65 73  tPlan.rCost, bes
32650 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 2c  tPlan.plan.nRow,
32660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32670 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e   bestPlan.plan.n
32680 4f 42 53 61 74 2c 20 62 65 73 74 50 6c 61 6e 2e  OBSat, bestPlan.
32690 70 6c 61 6e 2e 77 73 46 6c 61 67 73 29 29 3b 0a  plan.wsFlags));.
326a0 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61      if( (bestPla
326b0 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
326c0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 29   WHERE_DISTINCT)
326d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
326e0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69  ert( pWInfo->eDi
326f0 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20  stinct==0 );.   
32700 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
32710 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
32720 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
32730 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67     }.    andFlag
32740 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c  s &= bestPlan.pl
32750 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  an.wsFlags;.    
32760 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20 62  pLevel->plan = b
32770 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20 20  estPlan.plan;.  
32780 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
32790 72 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  r = pTabList->a[
327a0 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 3b 0a  bestJ].iCursor;.
327b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 65      testcase( be
327c0 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
327d0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
327e0 58 45 44 20 29 3b 0a 20 20 20 20 74 65 73 74 63  XED );.    testc
327f0 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ase( bestPlan.pl
32800 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
32810 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 3b  RE_TEMP_INDEX );
32820 0a 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61  .    if( bestPla
32830 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
32840 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c   (WHERE_INDEXED|
32850 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
32860 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
32870 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
32880 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
32890 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 62 65  ) .       && (be
328a0 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
328b0 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
328c0 5f 49 4e 44 45 58 29 3d 3d 30 20 0a 20 20 20 20  _INDEX)==0 .    
328d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 65    ){.        pLe
328e0 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
328f0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  IdxCur;.      }e
32900 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4c 65  lse{.        pLe
32910 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70  vel->iIdxCur = p
32920 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
32930 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
32940 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
32950 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20  iIdxCur = -1;.  
32960 20 20 7d 0a 20 20 20 20 73 57 42 49 2e 6e 6f 74    }.    sWBI.not
32970 56 61 6c 69 64 20 26 3d 20 7e 67 65 74 4d 61 73  Valid &= ~getMas
32980 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
32990 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
329a0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65  Cursor);.    pLe
329b0 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38  vel->iFrom = (u8
329c0 29 62 65 73 74 4a 3b 0a 20 20 20 20 69 66 28 20  )bestJ;.    if( 
329d0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52  bestPlan.plan.nR
329e0 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b  ow>=(double)1 ){
329f0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
32a00 51 75 65 72 79 4c 6f 6f 70 20 2a 3d 20 62 65 73  QueryLoop *= bes
32a10 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3b  tPlan.plan.nRow;
32a20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
32a30 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65  heck that if the
32a40 20 74 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62   table scanned b
32a50 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72  y this loop iter
32a60 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20  ation had an.   
32a70 20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63   ** INDEXED BY c
32a80 6c 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74  lause attached t
32a90 6f 20 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e  o it, that the n
32aa0 61 6d 65 64 20 69 6e 64 65 78 20 69 73 20 62 65  amed index is be
32ab0 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20  ing.    ** used 
32ac0 66 6f 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66  for the scan. If
32ad0 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79   not, then query
32ae0 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73   compilation has
32af0 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   failed..    ** 
32b00 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e  Return an error.
32b10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78  .    */.    pIdx
32b20 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62   = pTabList->a[b
32b30 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20  estJ].pIndex;.  
32b40 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
32b50 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61      if( (bestPla
32b60 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
32b70 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
32b80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
32b90 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
32ba0 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73  arse, "cannot us
32bb0 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49  e index: %s", pI
32bc0 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
32bd0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
32be0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  ginError;.      
32bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
32c00 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20  * If an INDEXED 
32c10 42 59 20 63 6c 61 75 73 65 20 69 73 20 75 73 65  BY clause is use
32c20 64 2c 20 74 68 65 20 62 65 73 74 49 6e 64 65 78  d, the bestIndex
32c30 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  () function is. 
32c40 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
32c50 74 65 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  teed to find the
32c60 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65 64   index specified
32c70 20 69 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20   in the INDEXED 
32c80 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  BY clause.      
32c90 20 20 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20    ** if it find 
32ca0 61 6e 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e  an index at all.
32cb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
32cc0 72 74 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  rt( bestPlan.pla
32cd0 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29  n.u.pIdx==pIdx )
32ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32cf0 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
32d00 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
32d10 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
32d20 29 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  ));.  if( pParse
32d30 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
32d40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
32d50 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
32d60 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  nError;.  }.  if
32d70 28 20 6e 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  ( nTabList ){.  
32d80 20 20 70 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20    pLevel--;.    
32d90 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
32da0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 4f   pLevel->plan.nO
32db0 42 53 61 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BSat;.  }else{. 
32dc0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61     pWInfo->nOBSa
32dd0 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
32de0 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   If the total qu
32df0 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73  ery only selects
32e00 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74   a single row, t
32e10 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  hen the ORDER BY
32e20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  .  ** clause is 
32e30 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f  irrelevant..  */
32e40 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73  .  if( (andFlags
32e50 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29   & WHERE_UNIQUE)
32e60 21 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 20  !=0 && pOrderBy 
32e70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
32e80 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 28 70  TabList==0 || (p
32e90 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
32ea0 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f  ags & WHERE_ALL_
32eb0 55 4e 49 51 55 45 29 21 3d 30 20 29 3b 0a 20 20  UNIQUE)!=0 );.  
32ec0 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74    pWInfo->nOBSat
32ed0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
32ee0 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  pr;.  }..  /* If
32ef0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
32f00 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
32f10 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
32f20 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a  t is requesting.
32f30 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e    ** to use a on
32f40 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
32f50 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  , determine if t
32f60 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61  his is appropria
32f70 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65  te..  ** The one
32f80 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20  -pass algorithm 
32f90 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68  only works if th
32fa0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
32fb0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
32fc0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
32fd0 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65   update a single
32fe0 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   row..  */.  ass
32ff0 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
33000 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
33010 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
33020 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
33030 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
33040 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
33050 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
33060 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20  =0 && (andFlags 
33070 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
33080 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
33090 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
330a0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
330b0 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ].plan.wsFlags &
330c0 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
330d0 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  Y;.  }..  /* Ope
330e0 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
330f0 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
33100 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
33110 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
33120 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
33130 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ables..  */.  sq
33140 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
33150 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
33160 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
33170 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
33180 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65   Goto */.  notRe
33190 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
331a0 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  0;.  pWInfo->nRo
331b0 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 31  wOut = (double)1
331c0 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c  ;.  for(ii=0, pL
331d0 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
331e0 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
331f0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
33200 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
33210 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
33220 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
33230 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
33240 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
33250 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
33260 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  e/index */.    s
33270 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
33280 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20  em *pTabItem;.. 
33290 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
332a0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
332b0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
332c0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
332d0 70 54 61 62 3b 0a 20 20 20 20 70 57 49 6e 66 6f  pTab;.    pWInfo
332e0 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70 4c 65  ->nRowOut *= pLe
332f0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  vel->plan.nRow;.
33300 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
33310 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
33320 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
33330 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
33340 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
33350 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
33360 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
33370 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
33380 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
33390 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
333a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
333b0 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 65  BLE.    if( (pLe
333c0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
333d0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
333e0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
333f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
33400 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
33410 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
33420 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
33430 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
33440 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
33450 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
33460 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
33470 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
33480 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
33490 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
334a0 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
334b0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
334c0 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65  * noop */.    }e
334d0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
334e0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
334f0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
33500 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
33510 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
33520 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
33530 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
33540 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
33550 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
33560 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
33570 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
33580 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
33590 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
335a0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
335b0 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
335c0 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74   op);.      test
335d0 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  case( pTab->nCol
335e0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
335f0 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d   testcase( pTab-
33600 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
33610 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
33620 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
33630 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a  ab->nCol<BMS ){.
33640 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
33650 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
33660 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
33670 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
33680 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
33690 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
336a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
336b0 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
336c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
336d0 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
336e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336f0 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
33700 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
33710 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
33720 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
33730 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
33740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
33750 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
33760 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
33770 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
33780 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  >zName);.    }.#
33790 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
337a0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
337b0 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
337c0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
337d0 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
337e0 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
337f0 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
33800 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
33810 20 73 57 42 49 2e 70 57 43 2c 20 70 54 61 62 49   sWBI.pWC, pTabI
33820 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  tem, notReady, p
33830 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  Level);.    }els
33840 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
33850 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
33860 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
33870 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20  NDEXED)!=0 ){.  
33880 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
33890 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
338a0 70 49 64 78 3b 0a 20 20 20 20 20 20 4b 65 79 49  pIdx;.      KeyI
338b0 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  nfo *pKey = sqli
338c0 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
338d0 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20  pParse, pIx);.  
338e0 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75      int iIndexCu
338f0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
33900 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Cur;.      asser
33910 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
33920 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
33930 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33940 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a  iIndexCur>=0 );.
33950 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33960 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
33970 65 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75  enRead, iIndexCu
33980 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
33990 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
339a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
339b0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
339c0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
339d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
339e0 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
339f0 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
33a00 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
33a10 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
33a20 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65   iDb);.    notRe
33a30 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
33a40 73 57 42 49 2e 70 57 43 2d 3e 70 4d 61 73 6b 53  sWBI.pWC->pMaskS
33a50 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  et, pTabItem->iC
33a60 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57  ursor);.  }.  pW
33a70 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
33a80 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
33a90 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
33aa0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
33ab0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
33ac0 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
33ad0 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
33ae0 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
33af0 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
33b00 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
33b10 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
33b20 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
33b30 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
33b40 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
33b50 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
33b60 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
33b70 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
33b80 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
33b90 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70  st; ii++){.    p
33ba0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
33bb0 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70 6c  >a[ii];.    expl
33bc0 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73  ainOneScan(pPars
33bd0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65  e, pTabList, pLe
33be0 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d  vel, ii, pLevel-
33bf0 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61  >iFrom, wctrlFla
33c00 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  gs);.    notRead
33c10 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  y = codeOneLoopS
33c20 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
33c30 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74   wctrlFlags, not
33c40 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e  Ready);.    pWIn
33c50 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
33c60 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
33c70 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
33c80 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f  LITE_TEST  /* Fo
33c90 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
33ca0 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
33cb0 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20   */.  /* Record 
33cc0 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  in the query pla
33cd0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
33ce0 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  out the current 
33cf0 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74  table.  ** and t
33d00 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  he index used to
33d10 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61   access it (if a
33d20 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62  ny).  If the tab
33d30 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  le itself.  ** i
33d40 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20  s not used, its 
33d50 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d  name is just '{}
33d60 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20  '.  If no index 
33d70 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65  is used.  ** the
33d80 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64   index is listed
33d90 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68   as "{}".  If th
33da0 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
33db0 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69   used the.  ** i
33dc0 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27  ndex name is '*'
33dd0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
33de0 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
33df0 69 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20  ii++){.    char 
33e00 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  *z;.    int n;. 
33e10 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 73 74     int w;.    st
33e20 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
33e30 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20  m *pTabItem;..  
33e40 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
33e50 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77  fo->a[ii];.    w
33e60 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
33e70 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 54 61  wsFlags;.    pTa
33e80 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
33e90 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
33ea0 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61  om];.    z = pTa
33eb0 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  bItem->zAlias;. 
33ec0 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
33ed0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
33ee0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d  ->zName;.    n =
33ef0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
33f00 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e  (z);.    if( n+n
33f10 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
33f20 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
33f30 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69  n)-10 ){.      i
33f40 66 28 20 28 77 20 26 20 57 48 45 52 45 5f 49 44  f( (w & WHERE_ID
33f50 58 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 28 77  X_ONLY)!=0 && (w
33f60 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f 53   & WHERE_COVER_S
33f70 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  CAN)==0 ){.     
33f80 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
33f90 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
33fa0 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b  Plan], "{}", 2);
33fb0 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
33fc0 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
33fd0 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  e{.        memcp
33fe0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
33ff0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
34000 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
34010 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
34020 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
34030 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
34040 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
34050 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
34060 20 77 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44   w & WHERE_ROWID
34070 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _EQ );.    testc
34080 61 73 65 28 20 77 20 26 20 57 48 45 52 45 5f 52  ase( w & WHERE_R
34090 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20  OWID_RANGE );.  
340a0 20 20 69 66 28 20 77 20 26 20 28 57 48 45 52 45    if( w & (WHERE
340b0 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
340c0 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
340d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
340e0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
340f0 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20  [nQPlan], "* ", 
34100 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  2);.      nQPlan
34110 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65   += 2;.    }else
34120 20 69 66 28 20 28 77 20 26 20 57 48 45 52 45 5f   if( (w & WHERE_
34130 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 28  INDEXED)!=0 && (
34140 77 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52 5f  w & WHERE_COVER_
34150 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SCAN)==0 ){.    
34160 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
34170 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70 6c  len30(pLevel->pl
34180 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
34190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e  );.      if( n+n
341a0 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
341b0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
341c0 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  n)-2 ){.        
341d0 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
341e0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
341f0 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  n], pLevel->plan
34200 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  .u.pIdx->zName, 
34210 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
34220 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  an += n;.       
34230 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
34240 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
34250 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
34260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
34270 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
34280 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
34290 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20  , "{} ", 3);.   
342a0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
342b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
342c0 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73  e( nQPlan>0 && s
342d0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
342e0 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27  n[nQPlan-1]==' '
342f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
34300 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50  query_plan[--nQP
34310 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lan] = 0;.  }.  
34320 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
34330 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  an[nQPlan] = 0;.
34340 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65    nQPlan = 0;.#e
34350 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
34360 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61  EST // Testing a
34370 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
34380 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52   only */..  /* R
34390 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e  ecord the contin
343a0 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69  uation address i
343b0 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  n the WhereInfo 
343c0 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e  structure.  Then
343d0 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61  .  ** clean up a
343e0 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
343f0 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
34400 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
34410 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
34420 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
34430 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
34440 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
34450 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
34460 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
34470 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
34480 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
34490 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
344a0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
344b0 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
344c0 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
344d0 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
344e0 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
344f0 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
34500 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
34510 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
34520 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
34530 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
34540 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
34550 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
34560 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
34570 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
34580 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
34590 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
345a0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
345b0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
345c0 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
345d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
345e0 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
345f0 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
34600 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
34610 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
34620 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
34630 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
34640 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
34650 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
34660 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
34670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
34680 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
34690 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
346a0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
346b0 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
346c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
346d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
346e0 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
346f0 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
34700 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34710 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
34720 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
34730 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
34740 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
34750 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
34760 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
34770 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
34780 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
34790 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
347a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
347b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
347c0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
347d0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
347e0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
347f0 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
34800 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
34810 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
34820 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34830 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
34840 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
34850 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
34860 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
34870 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
34880 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49  p, pIn->iCur, pI
34890 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20  n->addrInTop);. 
348a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
348b0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
348c0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b  n->addrInTop-1);
348d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
348e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
348f0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
34900 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  nLoop);.    }.  
34910 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
34920 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
34930 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
34940 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
34950 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
34960 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
34970 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
34980 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34990 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
349a0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
349b0 20 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65    assert( (pLeve
349c0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
349d0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
349e0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
349f0 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  || (pLevel->plan
34a00 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
34a10 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a  _INDEXED)!=0 );.
34a20 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65        if( (pLeve
34a30 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
34a40 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
34a50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
34a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34a70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
34a80 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
34a90 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
34aa0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
34ab0 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29  el->iIdxCur>=0 )
34ac0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34ad0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
34ae0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
34af0 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
34b00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
34b10 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65  Level->op==OP_Re
34b20 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  turn ){.        
34b30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34b40 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
34b50 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
34b60 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
34b70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34b80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34b90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
34ba0 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
34bb0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
34bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34bd0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
34be0 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dr);.    }.  }..
34bf0 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
34c00 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
34c10 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
34c20 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
34c30 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
34c40 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
34c50 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
34c60 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
34c70 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  ak);..  /* Close
34c80 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73   all of the curs
34c90 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70  ors that were op
34ca0 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  ened by sqlite3W
34cb0 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a  hereBegin..  */.
34cc0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
34cd0 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  ->nLevel==1 || p
34ce0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70  WInfo->nLevel==p
34cf0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
34d00 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
34d10 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
34d20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
34d30 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
34d40 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
34d50 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
34d60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
34d70 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
34d80 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
34d90 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
34da0 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
34db0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
34dc0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
34dd0 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
34de0 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
34df0 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26  meral)==0.     &
34e00 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
34e10 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e  =0.     && (pWIn
34e20 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
34e30 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
34e40 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29  _CLOSE)==0.    )
34e50 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d  {.      int ws =
34e60 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
34e70 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28  Flags;.      if(
34e80 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
34e90 61 73 73 20 26 26 20 28 77 73 20 26 20 57 48 45  ass && (ws & WHE
34ea0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
34eb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34ec0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
34ed0 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74  OP_Close, pTabIt
34ee0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
34ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
34f00 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
34f10 58 45 44 29 21 3d 30 20 26 26 20 28 77 73 20 26  XED)!=0 && (ws &
34f20 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
34f30 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  X)==0 ){.       
34f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34f50 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
34f60 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
34f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34f80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
34f90 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64  scan uses an ind
34fa0 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75  ex, make code su
34fb0 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72  bstitutions to r
34fc0 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  ead data.    ** 
34fd0 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69  from the index i
34fe0 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20  n preference to 
34ff0 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74  the table. Somet
35000 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73  imes, this means
35010 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
35020 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20  e need never be 
35030 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20  read from. This 
35040 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  is a performance
35050 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61   boost,.    ** a
35060 73 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c  s the vdbe level
35070 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65   waits until the
35080 20 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62   table is read b
35090 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20  efore actually. 
350a0 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68     ** seeking th
350b0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74  e table cursor t
350c0 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72  o the record cor
350d0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
350e0 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
350f0 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
35100 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a   index..    ** .
35110 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
35120 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
35130 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
35140 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
35150 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
35160 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
35170 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
35180 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
35190 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
351a0 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
351b0 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
351c0 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
351d0 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
351e0 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
351f0 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
35200 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
35210 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
35220 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
35230 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
35240 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
35250 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
35260 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
35270 58 45 44 20 29 7b 0a 20 20 20 20 20 20 70 49 64  XED ){.      pId
35280 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
35290 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 7d 65 6c  .u.pIdx;.    }el
352a0 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
352b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
352c0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
352d0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65        pIdx = pLe
352e0 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a  vel->u.pCovidx;.
352f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
35300 64 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  dx && !db->mallo
35310 63 46 61 69 6c 65 64 29 7b 0a 20 20 20 20 20 20  cFailed){.      
35320 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a  int k, j, last;.
35330 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
35340 70 3b 0a 0a 20 20 20 20 20 20 70 4f 70 20 3d 20  p;..      pOp = 
35350 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
35360 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  (v, pWInfo->iTop
35370 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20  );.      last = 
35380 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
35390 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
353a0 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69   for(k=pWInfo->i
353b0 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  Top; k<last; k++
353c0 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
353d0 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
353e0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
353f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
35400 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
35410 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
35420 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
35430 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
35440 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
35450 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
35460 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  p2==pIdx->aiColu
35470 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  mn[j] ){.       
35480 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
35490 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
354a0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
354b0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
354c0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
354d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
354e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
354f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
35500 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
35510 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
35520 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
35530 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 70 49 64          || j<pId
35540 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
35550 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
35560 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
35570 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
35580 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
35590 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
355a0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
355b0 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69  ode = OP_IdxRowi
355c0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
355d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
355e0 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e    /* Final clean
355f0 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65  up.  */.  pParse
35600 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
35610 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
35620 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49  ryLoop;.  whereI
35630 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
35640 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
35650 0a                                               .