/ Hex Artifact Content
Login

Artifact e36bbfbf565c7a2ce49c5cd3101ca7310cd379af:


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 4f 42 5f 55 4e 49 51 55 45 20 20 20 20 30  E_OB_UNIQUE    0
2dc0: 78 30 30 30 30 34 30 30 30 20 20 2f 2a 20 56 61  x00004000  /* Va
2dd0: 6c 75 65 73 20 69 6e 20 4f 52 44 45 52 20 42 59  lues in ORDER BY
2de0: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 0a 20 20   columns are .  
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e       ** differen
2e20: 74 20 66 6f 72 20 65 76 65 72 79 20 6f 75 74 70  t for every outp
2e30: 75 74 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e  ut row */.#defin
2e40: 65 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  e WHERE_VIRTUALT
2e50: 41 42 4c 45 20 30 78 30 38 30 30 30 30 30 30 20  ABLE 0x08000000 
2e60: 20 2f 2a 20 55 73 65 20 76 69 72 74 75 61 6c 2d   /* Use virtual-
2e70: 74 61 62 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  table processing
2e80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2e90: 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20 20 20 30  E_MULTI_OR     0
2ea0: 78 31 30 30 30 30 30 30 30 20 20 2f 2a 20 4f 52  x10000000  /* OR
2eb0: 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20   using multiple 
2ec0: 69 6e 64 69 63 65 73 20 2a 2f 0a 23 64 65 66 69  indices */.#defi
2ed0: 6e 65 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e  ne WHERE_TEMP_IN
2ee0: 44 45 58 20 20 20 30 78 32 30 30 30 30 30 30 30  DEX   0x20000000
2ef0: 20 20 2f 2a 20 55 73 65 73 20 61 6e 20 65 70 68    /* Uses an eph
2f00: 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a  emeral index */.
2f10: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 44 49  #define WHERE_DI
2f20: 53 54 49 4e 43 54 20 20 20 20 20 30 78 34 30 30  STINCT     0x400
2f30: 30 30 30 30 30 20 20 2f 2a 20 43 6f 72 72 65 63  00000  /* Correc
2f40: 74 20 6f 72 64 65 72 20 66 6f 72 20 44 49 53 54  t order for DIST
2f50: 49 4e 43 54 20 2a 2f 0a 23 64 65 66 69 6e 65 20  INCT */.#define 
2f60: 57 48 45 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e  WHERE_COVER_SCAN
2f70: 20 20 20 30 78 38 30 30 30 30 30 30 30 20 20 2f     0x80000000  /
2f80: 2a 20 46 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61  * Full scan of a
2f90: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
2fa0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  */../*.** This m
2fb0: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6d  odule contains m
2fc0: 61 6e 79 20 73 65 70 61 72 61 74 65 20 73 75 62  any separate sub
2fd0: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 77 6f  routines that wo
2fe0: 72 6b 20 74 6f 67 65 74 68 65 72 20 74 6f 0a 2a  rk together to.*
2ff0: 2a 20 66 69 6e 64 20 74 68 65 20 62 65 73 74 20  * find the best 
3000: 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 20 66  indices to use f
3010: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70  or accessing a p
3020: 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20  articular table 
3030: 69 6e 20 61 20 71 75 65 72 79 2e 0a 2a 2a 20 41  in a query..** A
3040: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3050: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3060: 63 74 75 72 65 20 68 6f 6c 64 73 20 63 6f 6e 74  cture holds cont
3070: 65 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ext information 
3080: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 69 6e 64  about the.** ind
3090: 65 78 20 73 65 61 72 63 68 20 73 6f 20 74 68 61  ex search so tha
30a0: 74 20 69 74 20 63 61 6e 20 62 65 20 6d 6f 72 65  t it can be more
30b0: 20 65 61 73 69 6c 79 20 70 61 73 73 65 64 20 62   easily passed b
30c0: 65 74 77 65 65 6e 20 74 68 65 20 76 61 72 69 6f  etween the vario
30d0: 75 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 2e 0a  us.** routines..
30e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
30f0: 74 20 57 68 65 72 65 42 65 73 74 49 64 78 20 57  t WhereBestIdx W
3100: 68 65 72 65 42 65 73 74 49 64 78 3b 0a 73 74 72  hereBestIdx;.str
3110: 75 63 74 20 57 68 65 72 65 42 65 73 74 49 64 78  uct WhereBestIdx
3120: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
3130: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
3140: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
3150: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
3160: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
3170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3180: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3190: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
31a0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
31b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
31c0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
31d0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
31e0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
3200: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e  ask of cursors n
3210: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
3220: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c    Bitmask notVal
3230: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3240: 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74    /* Cursors not
3250: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
3260: 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20  ny purpose */.  
3270: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
3280: 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  By;             
3290: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
32a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
32b0: 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 3b  List *pDistinct;
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32d0: 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69  he select-list i
32e0: 66 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49  f query is DISTI
32f0: 4e 43 54 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  NCT */.  sqlite3
3300: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70  _index_info **pp
3310: 49 64 78 49 6e 66 6f 3b 20 2f 2a 20 49 6e 64 65  IdxInfo; /* Inde
3320: 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  x information pa
3330: 73 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64  ssed to xBestInd
3340: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6e  ex */.  int i, n
3350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3360: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
3370: 20 6c 6f 6f 70 20 69 73 20 62 65 69 6e 67 20 63   loop is being c
3380: 6f 64 65 64 3b 20 23 20 6f 66 20 6c 6f 6f 70 73  oded; # of loops
3390: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
33a0: 20 2a 61 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *aLevel;       
33b0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62        /* Info ab
33c0: 6f 75 74 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20  out outer loops 
33d0: 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 63  */.  WhereCost c
33e0: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
33f0: 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63       /* Lowest c
3400: 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  ost query plan *
3410: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  /.};../*.** Retu
3420: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
3430: 72 6f 62 65 20 63 6f 73 74 20 69 73 20 6c 65 73  robe cost is les
3440: 73 20 74 68 61 6e 20 74 68 65 20 62 61 73 65 6c  s than the basel
3450: 69 6e 65 20 63 6f 73 74 0a 2a 2f 0a 73 74 61 74  ine cost.*/.stat
3460: 69 63 20 69 6e 74 20 63 6f 6d 70 61 72 65 43 6f  ic int compareCo
3470: 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 43 6f  st(const WhereCo
3480: 73 74 20 2a 70 50 72 6f 62 65 2c 20 63 6f 6e 73  st *pProbe, cons
3490: 74 20 57 68 65 72 65 43 6f 73 74 20 2a 70 42 61  t WhereCost *pBa
34a0: 73 65 6c 69 6e 65 29 7b 0a 20 20 69 66 28 20 70  seline){.  if( p
34b0: 50 72 6f 62 65 2d 3e 72 43 6f 73 74 3c 70 42 61  Probe->rCost<pBa
34c0: 73 65 6c 69 6e 65 2d 3e 72 43 6f 73 74 20 29 20  seline->rCost ) 
34d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
34e0: 70 50 72 6f 62 65 2d 3e 72 43 6f 73 74 3e 70 42  pProbe->rCost>pB
34f0: 61 73 65 6c 69 6e 65 2d 3e 72 43 6f 73 74 20 29  aseline->rCost )
3500: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
3510: 20 70 50 72 6f 62 65 2d 3e 70 6c 61 6e 2e 6e 4f   pProbe->plan.nO
3520: 42 53 61 74 3e 70 42 61 73 65 6c 69 6e 65 2d 3e  BSat>pBaseline->
3530: 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 29 20 72 65  plan.nOBSat ) re
3540: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 50  turn 1;.  if( pP
3550: 72 6f 62 65 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3c  robe->plan.nRow<
3560: 70 42 61 73 65 6c 69 6e 65 2d 3e 70 6c 61 6e 2e  pBaseline->plan.
3570: 6e 52 6f 77 20 29 20 72 65 74 75 72 6e 20 31 3b  nRow ) return 1;
3580: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3590: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
35a0: 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
35b0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
35c0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
35d0: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
35e0: 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c  eInit(.  WhereCl
35f0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
3600: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c    /* The WhereCl
3610: 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69  ause to be initi
3620: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73  alized */.  Pars
3630: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3640: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
3650: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
3660: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
3670: 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70  MaskSet,  /* Map
3680: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20  ping from table 
3690: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74  cursor numbers t
36a0: 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20  o bitmasks */.  
36b0: 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
36c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68           /* Migh
36d0: 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45 5f  t include WHERE_
36e0: 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  AND_ONLY */.){. 
36f0: 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70   pWC->pParse = p
3700: 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d  Parse;.  pWC->pM
3710: 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65  askSet = pMaskSe
3720: 74 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72  t;.  pWC->pOuter
3730: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65   = 0;.  pWC->nTe
3740: 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  rm = 0;.  pWC->n
3750: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
3760: 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a  (pWC->aStatic);.
3770: 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e    pWC->a = pWC->
3780: 61 53 74 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e  aStatic;.  pWC->
3790: 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
37a0: 72 6c 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 20 46  rlFlags;.}../* F
37b0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
37c0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
37d0: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
37e0: 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a  (WhereClause*);.
37f0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
3800: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
3810: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57  ociated with a W
3820: 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63  hereOrInfo objec
3830: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
3840: 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c  d whereOrInfoDel
3850: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
3860: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29   WhereOrInfo *p)
3870: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
3880: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
3890: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
38a0: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
38b0: 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65  eallocate all me
38c0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
38d0: 77 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49  with a WhereAndI
38e0: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
38f0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
3900: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  AndInfoDelete(sq
3910: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
3920: 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  AndInfo *p){.  w
3930: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
3940: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
3950: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
3960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
3970: 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75  cate a WhereClau
3980: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  se structure.  T
3990: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
39a0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
39b0: 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e  lf is not freed.
39c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
39d0: 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  s the inverse of
39e0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
39f0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
3a00: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  id whereClauseCl
3a10: 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20  ear(WhereClause 
3a20: 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  *pWC){.  int i;.
3a30: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a    WhereTerm *a;.
3a40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3a50: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  pWC->pParse->db;
3a60: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
3a70: 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b  erm-1, a=pWC->a;
3a80: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29   i>=0; i--, a++)
3a90: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46  {.    if( a->wtF
3aa0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
3ab0: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MIC ){.      sql
3ac0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
3ad0: 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20  b, a->pExpr);.  
3ae0: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77    }.    if( a->w
3af0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
3b00: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
3b10: 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28  ereOrInfoDelete(
3b20: 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f  db, a->u.pOrInfo
3b30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
3b40: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
3b50: 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20  RM_ANDINFO ){.  
3b60: 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f      whereAndInfo
3b70: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
3b80: 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  pAndInfo);.    }
3b90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e  .  }.  if( pWC->
3ba0: 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  a!=pWC->aStatic 
3bb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
3bc0: 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Free(db, pWC->a)
3bd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3be0: 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  dd a single new 
3bf0: 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20  WhereTerm entry 
3c00: 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  to the WhereClau
3c10: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
3c20: 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54  * The new WhereT
3c30: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
3c40: 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45  nstructed from E
3c50: 78 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77  xpr p and with w
3c60: 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69  tFlags..** The i
3c70: 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d  ndex in pWC->a[]
3c80: 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72   of the new Wher
3c90: 65 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65  eTerm is returne
3ca0: 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  d on success..**
3cb0: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   0 is returned i
3cc0: 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54  f the new WhereT
3cd0: 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  erm could not be
3ce0: 20 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20   added due to a 
3cf0: 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
3d00: 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  tion error.  The
3d10: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
3d20: 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  on failure will 
3d30: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a  be recorded in.*
3d40: 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  * the db->malloc
3d50: 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74  Failed flag so t
3d60: 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  hat higher-level
3d70: 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64   functions can d
3d80: 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  etect it..**.** 
3d90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
3da0: 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  l increase the s
3db0: 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e  ize of the pWC->
3dc0: 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63  a[] array as nec
3dd0: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
3de0: 20 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67   the wtFlags arg
3df0: 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54  ument includes T
3e00: 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ERM_DYNAMIC, the
3e10: 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  n responsibility
3e20: 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20  .** for freeing 
3e30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
3e40: 20 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74   is assumed by t
3e50: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
3e60: 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68  bject pWC..** Th
3e70: 69 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20  is is true even 
3e80: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
3e90: 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  fails to allocat
3ea0: 65 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72  e a new WhereTer
3eb0: 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  m..**.** WARNING
3ec0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
3ed0: 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65  might reallocate
3ee0: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
3ef0: 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72  to store.** Wher
3f00: 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69  eTerms.  All poi
3f10: 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65  nters to WhereTe
3f20: 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  rms should be in
3f30: 76 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a  validated after.
3f40: 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
3f50: 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70  routine.  Such p
3f60: 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72  ointers may be r
3f70: 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20  einitialized by 
3f80: 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74  referencing.** t
3f90: 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61  he pWC->a[] arra
3fa0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
3fb0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
3fc0: 72 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  rt(WhereClause *
3fd0: 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38  pWC, Expr *p, u8
3fe0: 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65   wtFlags){.  Whe
3ff0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
4000: 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74   int idx;.  test
4010: 63 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20  case( wtFlags & 
4020: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
4030: 20 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d   /* EV: R-00211-
4040: 31 35 31 30 30 20 2a 2f 0a 20 20 69 66 28 20 70  15100 */.  if( p
4050: 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e  WC->nTerm>=pWC->
4060: 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65  nSlot ){.    Whe
4070: 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70  reTerm *pOld = p
4080: 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74  WC->a;.    sqlit
4090: 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50  e3 *db = pWC->pP
40a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57  arse->db;.    pW
40b0: 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  C->a = sqlite3Db
40c0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
40d0: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
40e0: 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a  pWC->nSlot*2 );.
40f0: 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d      if( pWC->a==
4100: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  0 ){.      if( w
4110: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  tFlags & TERM_DY
4120: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20  NAMIC ){.       
4130: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4140: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  te(db, p);.     
4150: 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20   }.      pWC->a 
4160: 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65  = pOld;.      re
4170: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
4180: 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c    memcpy(pWC->a,
4190: 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57   pOld, sizeof(pW
41a0: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54  C->a[0])*pWC->nT
41b0: 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  erm);.    if( pO
41c0: 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63  ld!=pWC->aStatic
41d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
41e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64  3DbFree(db, pOld
41f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43  );.    }.    pWC
4200: 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65  ->nSlot = sqlite
4210: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
4220: 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66  , pWC->a)/sizeof
4230: 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d  (pWC->a[0]);.  }
4240: 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  .  pTerm = &pWC-
4250: 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54  >a[idx = pWC->nT
4260: 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d  erm++];.  pTerm-
4270: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
4280: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
4290: 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46  p);.  pTerm->wtF
42a0: 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a  lags = wtFlags;.
42b0: 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70    pTerm->pWC = p
42c0: 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  WC;.  pTerm->iPa
42d0: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74  rent = -1;.  ret
42e0: 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn idx;.}../*.*
42f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4300: 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70  dentifies subexp
4310: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
4320: 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65  WHERE clause whe
4330: 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78  re.** each subex
4340: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
4350: 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44  rated by the AND
4360: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d   operator or som
4370: 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61  e other.** opera
4380: 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  tor specified in
4390: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
43a0: 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  r.  The WhereCla
43b0: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
43c0: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
43d0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65  pointers to sube
43e0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72  xpressions.  For
43f0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
4400: 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65     WHERE  a=='he
4410: 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63  llo' AND coalesc
4420: 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28  e(b,11)<10 AND (
4430: 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32  c+12!=d OR c==22
4440: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c  ).**           \
4450: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
4460: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ______________/ 
4470: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
4480: 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
4490: 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20       slot[0]    
44a0: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20          slot[1] 
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c                sl
44c0: 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ot[2].**.** The 
44d0: 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
44e0: 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69  lause in pExpr i
44f0: 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c  s unaltered.  Al
4500: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  l this routine.*
4510: 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  * does is make s
4520: 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f  lot[] entries po
4530: 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74  int to substruct
4540: 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72  ure within pExpr
4550: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70  ..**.** In the p
4560: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
4570: 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67   and in the diag
4580: 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65  ram, "slot[]" re
4590: 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57  fers to.** the W
45a0: 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61  hereClause.a[] a
45b0: 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b  rray.  The slot[
45c0: 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73  ] array grows as
45d0: 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61   needed to conta
45e0: 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20  in.** all terms 
45f0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
4600: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
4610: 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57  oid whereSplit(W
4620: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
4630: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
4640: 74 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  t op){.  pWC->op
4650: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28   = (u8)op;.  if(
4660: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
4670: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
4680: 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77  >op!=op ){.    w
4690: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
46a0: 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b  (pWC, pExpr, 0);
46b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
46c0: 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45  ereSplit(pWC, pE
46d0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b  xpr->pLeft, op);
46e0: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
46f0: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  pWC, pExpr->pRig
4700: 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ht, op);.  }.}..
4710: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
4720: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
4730: 61 73 6b 20 73 65 74 20 28 61 20 57 68 65 72 65  ask set (a Where
4740: 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a  MaskSet object).
4750: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d  */.#define initM
4760: 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65  askSet(P)  memse
4770: 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(P, 0, sizeof(*
4780: 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  P))../*.** Retur
4790: 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  n the bitmask fo
47a0: 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  r the given curs
47b0: 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  or number.  Retu
47c0: 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73  rn 0 if.** iCurs
47d0: 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  or is not in the
47e0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
47f0: 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28  Bitmask getMask(
4800: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
4810: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
4820: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
4830: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
4840: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
4850: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
4860: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
4870: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
4880: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
4890: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
48a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
48b0: 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69   ((Bitmask)1)<<i
48c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
48d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
48e0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
48f0: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
4900: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
4910: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
4920: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
4930: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
4940: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
4950: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
4960: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
4970: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
4980: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
4990: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
49a0: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
49b0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
49c0: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
49d0: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
49e0: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
49f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
4a00: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
4a10: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
4a20: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
4a30: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
4a40: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
4a50: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
4a60: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
4a70: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
4a80: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
4a90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4aa0: 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76   walks (recursiv
4ab0: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
4ac0: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
4ad0: 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61  rates.** a bitma
4ae0: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
4af0: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
4b00: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
4b10: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
4b20: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
4b30: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
4b40: 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c  to work, the cal
4b50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
4b60: 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69  st have.** previ
4b70: 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71  ously invoked sq
4b80: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
4b90: 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65  Names() on the e
4ba0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a  xpression.  See.
4bb0: 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ** the header co
4bc0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f  mment on that ro
4bd0: 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
4be0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
4bf0: 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
4c00: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
4c10: 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b  () routines look
4c20: 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d  s for column nam
4c30: 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74  es and.** sets t
4c40: 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20  heir opcodes to 
4c50: 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68  TK_COLUMN and th
4c60: 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20  eir Expr.iTable 
4c70: 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65  fields to.** the
4c80: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
4c90: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
4ca0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
4cb0: 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74  just has to.** t
4cc0: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72  ranslate the cur
4cd0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
4ce0: 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
4cf0: 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68  and OR all.** th
4d00: 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74  e bitmasks toget
4d10: 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  her..*/.static B
4d20: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
4d30: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4d40: 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73  askSet*, ExprLis
4d50: 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d  t*);.static Bitm
4d60: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
4d70: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
4d80: 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29  skSet*, Select*)
4d90: 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  ;.static Bitmask
4da0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
4db0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
4dc0: 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29  askSet, Expr *p)
4dd0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
4de0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30   = 0;.  if( p==0
4df0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4e00: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
4e10: 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20  UMN ){.    mask 
4e20: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
4e30: 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a  et, p->iTable);.
4e40: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b      return mask;
4e50: 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78  .  }.  mask = ex
4e60: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
4e70: 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74  skSet, p->pRight
4e80: 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  );.  mask |= exp
4e90: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
4ea0: 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  kSet, p->pLeft);
4eb0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
4ec0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
4ed0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d  Select) ){.    m
4ee0: 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63  ask |= exprSelec
4ef0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
4f00: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  kSet, p->x.pSele
4f10: 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ct);.  }else{.  
4f20: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
4f30: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
4f40: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73  skSet, p->x.pLis
4f50: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
4f60: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
4f70: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
4f80: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
4f90: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
4fa0: 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  t, ExprList *pLi
4fb0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
4fc0: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
4fd0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
4fe0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4ff0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
5000: 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c  +){.      mask |
5010: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
5020: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74  (pMaskSet, pList
5030: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
5040: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5050: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
5060: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c   Bitmask exprSel
5070: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  ectTableUsage(Wh
5080: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
5090: 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53  kSet, Select *pS
50a0: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
50b0: 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  k = 0;.  while( 
50c0: 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  pS ){.    SrcLis
50d0: 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70 53  t *pSrc = pS->pS
50e0: 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  rc;.    mask |= 
50f0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
5100: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
5110: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61  >pEList);.    ma
5120: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
5130: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
5140: 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29  t, pS->pGroupBy)
5150: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
5160: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
5170: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
5180: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61  OrderBy);.    ma
5190: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
51a0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
51b0: 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  S->pWhere);.    
51c0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
51d0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
51e0: 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20   pS->pHaving);. 
51f0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
5200: 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  rc!=0) ){.      
5210: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
5220: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
5230: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
5240: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65    mask |= exprSe
5250: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
5260: 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61  MaskSet, pSrc->a
5270: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
5280: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78        mask |= ex
5290: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
52a0: 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69  skSet, pSrc->a[i
52b0: 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ].pOn);.      }.
52c0: 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70      }.    pS = p
52d0: 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20  S->pPrior;.  }. 
52e0: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
52f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
5300: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
5310: 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20  operator is one 
5320: 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
5330: 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f   that is.** allo
5340: 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  wed for an index
5350: 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  able WHERE claus
5360: 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c  e term.  The all
5370: 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61  owed operators a
5380: 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20  re.** "=", "<", 
5390: 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c  ">", "<=", ">=",
53a0: 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a 0a 2a 2a   and "IN"..**.**
53b0: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
53c0: 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32 36 33 39  OF: R-59926-2639
53d0: 33 20 54 6f 20 62 65 20 75 73 61 62 6c 65 20 62  3 To be usable b
53e0: 79 20 61 6e 20 69 6e 64 65 78 20 61 20 74 65 72  y an index a ter
53f0: 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f 66 20  m must be.** of 
5400: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
5410: 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f 6c 75  wing forms: colu
5420: 6d 6e 20 3d 20 65 78 70 72 65 73 73 69 6f 6e 20  mn = expression 
5430: 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65 73 73  column > express
5440: 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e 3d  ion.** column >=
5450: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75   expression colu
5460: 6d 6e 20 3c 20 65 78 70 72 65 73 73 69 6f 6e 20  mn < expression 
5470: 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72 65 73  column <= expres
5480: 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  sion.** expressi
5490: 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78 70 72  on = column expr
54a0: 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e 20  ession > column 
54b0: 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20 63 6f  expression >= co
54c0: 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  lumn.** expressi
54d0: 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78 70 72  on < column expr
54e0: 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d 6e  ession <= column
54f0: 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28 65   column IN.** (e
5500: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 29 20  xpression-list) 
5510: 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62 71 75  column IN (subqu
5520: 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53 20 4e  ery) column IS N
5530: 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ULL.*/.static in
5540: 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20  t allowedOp(int 
5550: 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54  op){.  assert( T
5560: 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_GT>TK_EQ && TK
5570: 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _GT<TK_GE );.  a
5580: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f  ssert( TK_LT>TK_
5590: 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47  EQ && TK_LT<TK_G
55a0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
55b0: 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_LE>TK_EQ && TK
55c0: 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _LE<TK_GE );.  a
55d0: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
55e0: 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72  _EQ+4 );.  retur
55f0: 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28  n op==TK_IN || (
5600: 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c  op>=TK_EQ && op<
5610: 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54  =TK_GE) || op==T
5620: 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a  K_ISNULL;.}../*.
5630: 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65  ** Swap two obje
5640: 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50 45  cts of type TYPE
5650: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41  ..*/.#define SWA
5660: 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50  P(TYPE,A,B) {TYP
5670: 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b  E t=A; A=B; B=t;
5680: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65  }../*.** Commute
5690: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
56a0: 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73  erator.  Express
56b0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
56c0: 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65   "X op Y".** are
56d0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
56e0: 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20  "Y op X"..**.** 
56f0: 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20 70 72  If left/right pr
5700: 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73 20 63  ecedence rules c
5710: 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20 77 68  ome into play wh
5720: 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74  en determining t
5730: 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 0a  he.** collating.
5740: 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  ** side of the c
5750: 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65  omparison, it re
5760: 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64  mains associated
5770: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 73   with the same s
5780: 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ide after.** the
5790: 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f   commutation. So
57a0: 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "Y collate NOCA
57b0: 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73  SE op X" becomes
57c0: 20 0a 2a 2a 20 22 58 20 6f 70 20 59 22 2e 20 54   .** "X op Y". T
57d0: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61  his is because a
57e0: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
57f0: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
5800: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
5810: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
5820: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
5830: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
5840: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
5850: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
5860: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
5870: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
5880: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
5890: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
58a0: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
58b0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
58c0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
58d0: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
58e0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
58f0: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
5900: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
5910: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
5920: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  ft->flags & EP_C
5930: 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72  ollate);.  asser
5940: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
5950: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
5960: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
5970: 20 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65   if( expRight==e
5980: 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a  xpLeft ){.    /*
5990: 20 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20   Either X and Y 
59a0: 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54  both have COLLAT
59b0: 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65  E operator or ne
59c0: 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20  ither do */.    
59d0: 69 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a  if( expRight ){.
59e0: 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20        /* Both X 
59f0: 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  and Y have COLLA
5a00: 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d  TE operators.  M
5a10: 61 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c  ake sure X is al
5a20: 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ways.      ** us
5a30: 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ed by clearing t
5a40: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
5a50: 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20  ag from Y. */.  
5a60: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
5a70: 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f  t->flags &= ~EP_
5a80: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c  Collate;.    }el
5a90: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  se if( sqlite3Ex
5aa0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
5ab0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  , pExpr->pLeft)!
5ac0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  =0 ){.      /* N
5ad0: 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68  either X nor Y h
5ae0: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
5af0: 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73  ators, but X has
5b00: 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20   a non-default. 
5b10: 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e       ** collatin
5b20: 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20  g sequence.  So 
5b30: 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  add the EP_Colla
5b40: 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74  te marker on X t
5b50: 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  o cause.      **
5b60: 20 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68   it to be search
5b70: 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  ed first. */.   
5b80: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d     pExpr->pLeft-
5b90: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c  >flags |= EP_Col
5ba0: 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  late;.    }.  }.
5bb0: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
5bc0: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
5bd0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
5be0: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
5bf0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5c00: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
5c10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
5c20: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
5c30: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
5c40: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
5c50: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
5c60: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
5c70: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
5c80: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
5c90: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
5ca0: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
5cb0: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
5cc0: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
5cd0: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
5ce0: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
5cf0: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
5d00: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
5d10: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
5d20: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
5d30: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
5d40: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
5d50: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
5d60: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
5d70: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
5d80: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
5d90: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
5da0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
5db0: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
5dc0: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
5dd0: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
5de0: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
5df0: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
5e00: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
5e10: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
5e20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5e30: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
5e40: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
5e50: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
5e60: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
5e70: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
5e80: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
5e90: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
5ea0: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
5eb0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5ec0: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
5ed0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
5ee0: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
5ef0: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
5f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
5f10: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
5f20: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
5f30: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
5f40: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
5f50: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
5f60: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
5f70: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
5f80: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
5f90: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
5fa0: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
5fb0: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
5fc0: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
5fd0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
5fe0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
5ff0: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
6000: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
6010: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  d..**.** The ter
6020: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
6030: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
6040: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
6050: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
6060: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
6070: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
6080: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
6090: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
60a0: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
60b0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
60c0: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
60d0: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
60e0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
60f0: 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61  ** aEquiv[] arra
6100: 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c  y holds X and al
6110: 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74  l its equivalent
6120: 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c  s, with each SQL
6130: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b   variable.** tak
6140: 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73  ing up two slots
6150: 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54   in aEquiv[].  T
6160: 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73  he first slot is
6170: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20   for the cursor 
6180: 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68  number.** and th
6190: 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20  e second is for 
61a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
61b0: 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32  r.  There are 22
61c0: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
61d0: 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65  [].** so that me
61e0: 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20  ans we can look 
61f0: 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f  for X plus up to
6200: 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61   10 other equiva
6210: 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  lent values..** 
6220: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
6230: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
6240: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20   <expr> if X=A1 
6250: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
6260: 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61  =A3.** and ... a
6270: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
6280: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
6290: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
62a0: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
62b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
62c0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
62d0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
62e0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
62f0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
6300: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
6310: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
6320: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
6330: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
6340: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
6350: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
6360: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
6370: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
6380: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
6390: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
63a0: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
63b0: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
63c0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
63d0: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
63e0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
63f0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
6400: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
6410: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
6420: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
6430: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
6440: 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  IV..*/.static Wh
6450: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
6460: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
6470: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
6480: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
6490: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
64a0: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
64b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
64c0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
64d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
64e0: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
64f0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
6500: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
6510: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
6520: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
6530: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
6540: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f   mask */.  u32 o
6550: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6560: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
6570: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
6580: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
6590: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
65a0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
65b0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
65c0: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
65d0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
65e0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
65f0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
6600: 2f 2a 20 54 65 72 6d 20 62 65 69 6e 67 20 65 78  /* Term being ex
6610: 61 6d 69 6e 65 64 20 61 73 20 70 6f 73 73 69 62  amined as possib
6620: 6c 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 57  le result */.  W
6630: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
6640: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  t = 0;      /* T
6650: 68 65 20 61 6e 73 77 65 72 20 74 6f 20 72 65 74  he answer to ret
6660: 75 72 6e 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  urn */.  WhereCl
6670: 61 75 73 65 20 2a 70 57 43 4f 72 69 67 20 3d 20  ause *pWCOrig = 
6680: 70 57 43 3b 20 20 2f 2a 20 4f 72 69 67 69 6e 61  pWC;  /* Origina
6690: 6c 20 70 57 43 20 76 61 6c 75 65 20 2a 2f 0a 20  l pWC value */. 
66a0: 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20   int j, k;      
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
66c0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
66d0: 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20  /.  Expr *pX;   
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
66f0: 50 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78  Pointer to an ex
6700: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 50 61  pression */.  Pa
6710: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
6720: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
6730: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
6740: 6e 74 20 69 4f 72 69 67 43 6f 6c 20 3d 20 69 43  nt iOrigCol = iC
6750: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 4f 72 69 67 69  olumn;  /* Origi
6760: 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 43 6f  nal value of iCo
6770: 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  lumn */.  int nE
6780: 71 75 69 76 20 3d 20 32 3b 20 20 20 20 20 20 20  quiv = 2;       
6790: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
67a0: 65 6e 74 69 72 65 73 20 69 6e 20 61 45 71 75 69  entires in aEqui
67b0: 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71  v[] */.  int iEq
67c0: 75 69 76 20 3d 20 32 3b 20 20 20 20 20 20 20 20  uiv = 2;        
67d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
67e0: 6e 74 72 69 65 73 20 6f 66 20 61 45 71 75 69 76  ntries of aEquiv
67f0: 5b 5d 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20  [] processed so 
6800: 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20 61 45 71  far */.  int aEq
6810: 75 69 76 5b 32 32 5d 3b 20 20 20 20 20 20 20 20  uiv[22];        
6820: 20 20 2f 2a 20 69 43 75 72 2c 69 43 6f 6c 75 6d    /* iCur,iColum
6830: 6e 20 61 6e 64 20 75 70 20 74 6f 20 31 30 20 6f  n and up to 10 o
6840: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 73  ther equivalents
6850: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
6860: 43 75 72 3e 3d 30 20 29 3b 0a 20 20 61 45 71 75  Cur>=0 );.  aEqu
6870: 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20  iv[0] = iCur;.  
6880: 61 45 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c  aEquiv[1] = iCol
6890: 75 6d 6e 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  umn;.  for(;;){.
68a0: 20 20 20 20 66 6f 72 28 70 57 43 3d 70 57 43 4f      for(pWC=pWCO
68b0: 72 69 67 3b 20 70 57 43 3b 20 70 57 43 3d 70 57  rig; pWC; pWC=pW
68c0: 43 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  C->pOuter){.    
68d0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
68e0: 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, k=pWC->nTerm
68f0: 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  ; k; k--, pTerm+
6900: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
6910: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
6920: 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20  r==iCur.        
6930: 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65    && pTerm->u.le
6940: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
6950: 6e 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  n.        ){.   
6960: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
6970: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
6980: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20   notReady)==0.  
6990: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54 65           && (pTe
69a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
69b0: 6f 70 20 26 20 57 4f 5f 41 4c 4c 29 21 3d 30 0a  op & WO_ALL)!=0.
69c0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
69d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 72           if( iOr
69e0: 69 67 43 6f 6c 3e 3d 30 20 26 26 20 70 49 64 78  igCol>=0 && pIdx
69f0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
6a00: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
6a10: 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
6a20: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
6a30: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
6a40: 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66       char idxaff
6a50: 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 20  ;.      .       
6a60: 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72         pX = pTer
6a70: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
6a80: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 20 3d          pParse =
6a90: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pWC->pParse;.  
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 69 64 78 61              idxa
6ab0: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
6ac0: 65 2d 3e 61 43 6f 6c 5b 69 4f 72 69 67 43 6f 6c  e->aCol[iOrigCol
6ad0: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
6ae0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
6af0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
6b00: 69 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66  ityOk(pX, idxaff
6b10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
6b20: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6b40: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
6b50: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
6b60: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
6b70: 73 65 71 75 65 6e 63 65 20 72 65 71 75 69 72 65  sequence require
6b80: 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20  d from an index 
6b90: 66 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  for.            
6ba0: 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75 73    ** it to be us
6bb0: 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69 73  eful for optimis
6bc0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ing expression p
6bd0: 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20 20  X. Store this.  
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76              ** v
6bf0: 61 6c 75 65 20 69 6e 20 76 61 72 69 61 62 6c 65  alue in variable
6c00: 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20   pColl..        
6c10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6c20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58         assert(pX
6c30: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
6c40: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
6c50: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
6c60: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
6c70: 73 65 2c 70 58 2d 3e 70 4c 65 66 74 2c 70 58 2d  se,pX->pLeft,pX-
6c80: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
6c90: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
6ca0: 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70  l==0 ) pColl = p
6cb0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
6cc0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 0a 20 20 20  Coll;.      .   
6cd0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
6ce0: 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  =0; pIdx->aiColu
6cf0: 6d 6e 5b 6a 5d 21 3d 69 4f 72 69 67 43 6f 6c 3b  mn[j]!=iOrigCol;
6d00: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
6d10: 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
6d20: 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  (j>=pIdx->nColum
6d30: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
6d60: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6d70: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
6d80: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29  dx->azColl[j]) )
6d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6da0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6db0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6dc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6dd0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
6de0: 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 20  >prereqRight==0 
6df0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6e00: 20 70 52 65 73 75 6c 74 20 3d 20 70 54 65 72 6d   pResult = pTerm
6e10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6e20: 67 6f 74 6f 20 66 69 6e 64 54 65 72 6d 5f 73 75  goto findTerm_su
6e30: 63 63 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20  ccess;.         
6e40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 65     }else if( pRe
6e50: 73 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sult==0 ){.     
6e60: 20 20 20 20 20 20 20 20 20 70 52 65 73 75 6c 74           pResult
6e70: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
6e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6e90: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
6ea0: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
6eb0: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21  tor & WO_EQUIV)!
6ec0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
6ed0: 20 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a   nEquiv<ArraySiz
6ee0: 65 28 61 45 71 75 69 76 29 0a 20 20 20 20 20 20  e(aEquiv).      
6ef0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
6f00: 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45     pX = sqlite3E
6f10: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
6f20: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
6f30: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
6f40: 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
6f50: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
6f60: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
6f70: 3d 30 3b 20 6a 3c 6e 45 71 75 69 76 3b 20 6a 2b  =0; j<nEquiv; j+
6f80: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  =2){.           
6f90: 20 20 20 69 66 28 20 61 45 71 75 69 76 5b 6a 5d     if( aEquiv[j]
6fa0: 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 20 26 26 20  ==pX->iTable && 
6fb0: 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d  aEquiv[j+1]==pX-
6fc0: 3e 69 43 6f 6c 75 6d 6e 20 29 20 62 72 65 61 6b  >iColumn ) break
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 20 20 69 66 28 20              if( 
6ff0: 6a 3d 3d 6e 45 71 75 69 76 20 29 7b 0a 20 20 20  j==nEquiv ){.   
7000: 20 20 20 20 20 20 20 20 20 20 20 61 45 71 75 69             aEqui
7010: 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c  v[j] = pX->iTabl
7020: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
7030: 20 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70   aEquiv[j+1] = p
7040: 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  X->iColumn;.    
7050: 20 20 20 20 20 20 20 20 20 20 6e 45 71 75 69 76            nEquiv
7060: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
7070: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
7080: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7090: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
70a0: 20 69 45 71 75 69 76 3e 3d 6e 45 71 75 69 76 20   iEquiv>=nEquiv 
70b0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 43 75  ) break;.    iCu
70c0: 72 20 3d 20 61 45 71 75 69 76 5b 69 45 71 75 69  r = aEquiv[iEqui
70d0: 76 2b 2b 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d  v++];.    iColum
70e0: 6e 20 3d 20 61 45 71 75 69 76 5b 69 45 71 75 69  n = aEquiv[iEqui
70f0: 76 2b 2b 5d 3b 0a 20 20 7d 0a 66 69 6e 64 54 65  v++];.  }.findTe
7100: 72 6d 5f 73 75 63 63 65 73 73 3a 0a 20 20 72 65  rm_success:.  re
7110: 74 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a  turn pResult;.}.
7120: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
7130: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
7140: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
7150: 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65  (SrcList*, Where
7160: 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a  Clause*, int);..
7170: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41  /*.** Call exprA
7180: 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65  nalyze on all te
7190: 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63  rms in a WHERE c
71a0: 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  lause.  .**.**.*
71b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
71c0: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20  prAnalyzeAll(.  
71d0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
71e0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  t,       /* the 
71f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
7200: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
7210: 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  C         /* the
7220: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
7230: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
7240: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
7250: 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31  r(i=pWC->nTerm-1
7260: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
7270: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54    exprAnalyze(pT
7280: 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b  abList, pWC, i);
7290: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
72a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
72b0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a  _OPTIMIZATION./*
72c0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
72d0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
72e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49  pression is a LI
72f0: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
7300: 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  tor that.** can 
7310: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  be optimized usi
7320: 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ng inequality co
7330: 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75  nstraints.  Retu
7340: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
7350: 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65  .** so and false
7360: 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49   if not..**.** I
7370: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  n order for the 
7380: 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
7390: 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20  ptimizible, the 
73a0: 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74  RHS must be a st
73b0: 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20  ring.** literal 
73c0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  that does not be
73d0: 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63  gin with a wildc
73e0: 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  ard.  .*/.static
73f0: 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f   int isLikeOrGlo
7400: 62 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  b(.  Parse *pPar
7410: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
7420: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
7430: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
7440: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
7450: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
7460: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
7470: 20 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69    Expr **ppPrefi
7480: 78 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  x,  /* Pointer t
7490: 6f 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72  o TK_STRING expr
74a0: 65 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74  ession with patt
74b0: 65 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  ern prefix */.  
74c0: 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  int *pisComplete
74d0: 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  , /* True if the
74e0: 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69   only wildcard i
74f0: 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20  s % in the last 
7500: 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69  character */.  i
7510: 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20  nt *pnoCase     
7520: 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65   /* True if uppe
7530: 72 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c  rcase is equival
7540: 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65  ent to lowercase
7550: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
7560: 68 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20  har *z = 0;     
7570: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e      /* String on
7580: 20 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65   RHS of LIKE ope
7590: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20  rator */.  Expr 
75a0: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
75b0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61        /* Right a
75c0: 6e 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20  nd left size of 
75d0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
75e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
75f0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
7600: 20 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64   List of operand
7610: 73 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70  s to the LIKE op
7620: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
7630: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7640: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68         /* One ch
7650: 61 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a  aracter in z[] *
7660: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7680: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d  * Number of non-
7690: 77 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20  wildcard prefix 
76a0: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
76b0: 63 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20  char wc[3];     
76c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
76d0: 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72  ldcard character
76e0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
76f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7700: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
7710: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  nnection */.  sq
7720: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
7730: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b  l = 0;.  int op;
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7750: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66      /* Opcode of
7760: 20 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66   pRight */..  if
7770: 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  ( !sqlite3IsLike
7780: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78  Function(db, pEx
7790: 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29  pr, pnoCase, wc)
77a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
77b0: 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
77c0: 49 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28  ITE_EBCDIC.  if(
77d0: 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75   *pnoCase ) retu
77e0: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70  rn 0;.#endif.  p
77f0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
7800: 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d  pList;.  pLeft =
7810: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
7820: 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d  pr;.  if( pLeft-
7830: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a  >op!=TK_COLUMN .
7840: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70     || sqlite3Exp
7850: 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
7860: 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  !=SQLITE_AFF_TEX
7870: 54 20 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75  T .   || IsVirtu
7880: 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a  al(pLeft->pTab).
7890: 20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a    ){.    /* IMP:
78a0: 20 52 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54   R-02065-49465 T
78b0: 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
78c0: 65 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72  e of the LIKE or
78d0: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d   GLOB operator m
78e0: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
78f0: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64  e name of an ind
7900: 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68  exed column with
7910: 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20   TEXT affinity. 
7920: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
7930: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
7940: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28  Left->iColumn!=(
7950: 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73  -1) ); /* Becaus
7960: 65 20 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20  e IPK never has 
7970: 41 46 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70  AFF_TEXT */..  p
7980: 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61  Right = pList->a
7990: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20  [0].pExpr;.  op 
79a0: 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20  = pRight->op;.  
79b0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
79c0: 54 45 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  TER ){.    op = 
79d0: 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d  pRight->op2;.  }
79e0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41  .  if( op==TK_VA
79f0: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64  RIABLE ){.    Vd
7a00: 62 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d  be *pReprepare =
7a10: 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70   pParse->pReprep
7a20: 61 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  are;.    int iCo
7a30: 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  l = pRight->iCol
7a40: 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  umn;.    pVal = 
7a50: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61  sqlite3VdbeGetVa
7a60: 6c 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20  lue(pReprepare, 
7a70: 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46  iCol, SQLITE_AFF
7a80: 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20  _NONE);.    if( 
7a90: 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f  pVal && sqlite3_
7aa0: 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29  value_type(pVal)
7ab0: 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b  ==SQLITE_TEXT ){
7ac0: 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72  .      z = (char
7ad0: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
7ae0: 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20  _text(pVal);.   
7af0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
7b00: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61  beSetVarmask(pPa
7b10: 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c  rse->pVdbe, iCol
7b20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
7b30: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  Right->op==TK_VA
7b40: 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74  RIABLE || pRight
7b50: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
7b60: 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  R );.  }else if(
7b70: 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29   op==TK_STRING )
7b80: 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74  {.    z = pRight
7b90: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a  ->u.zToken;.  }.
7ba0: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63    if( z ){.    c
7bb0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
7bc0: 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30  e( (c=z[cnt])!=0
7bd0: 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20   && c!=wc[0] && 
7be0: 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77  c!=wc[1] && c!=w
7bf0: 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e  c[2] ){.      cn
7c00: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t++;.    }.    i
7c10: 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35  f( cnt!=0 && 255
7c20: 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29  !=(u8)z[cnt-1] )
7c30: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50  {.      Expr *pP
7c40: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69  refix;.      *pi
7c50: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77  sComplete = c==w
7c60: 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d  c[0] && z[cnt+1]
7c70: 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66  ==0;.      pPref
7c80: 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ix = sqlite3Expr
7c90: 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20  (db, TK_STRING, 
7ca0: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  z);.      if( pP
7cb0: 72 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d  refix ) pPrefix-
7cc0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d  >u.zToken[cnt] =
7cd0: 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65   0;.      *ppPre
7ce0: 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20  fix = pPrefix;. 
7cf0: 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
7d00: 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20  VARIABLE ){.    
7d10: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
7d20: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
7d30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7d40: 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52  SetVarmask(v, pR
7d50: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  ight->iColumn);.
7d60: 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73          if( *pis
7d70: 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67  Complete && pRig
7d80: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20  ht->u.zToken[1] 
7d90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
7da0: 49 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68  If the rhs of th
7db0: 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f  e LIKE expressio
7dc0: 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c  n is a variable,
7dd0: 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
7de0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61  .          ** va
7df0: 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61  lue of the varia
7e00: 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ble means there 
7e10: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e  is no need to in
7e20: 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20  voke the LIKE.  
7e30: 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
7e40: 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f  ion, then no OP_
7e50: 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65  Variable will be
7e60: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72   added to the pr
7e70: 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20  ogram..         
7e80: 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20   ** This causes 
7e90: 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65  problems for the
7ea0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
7eb0: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20  rameter_name(). 
7ec0: 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e           ** API.
7ed0: 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74   To workaround t
7ee0: 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79  hem, add a dummy
7ef0: 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72   OP_Variable her
7f00: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20  e..          */ 
7f10: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72  .          int r
7f20: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
7f30: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
7f40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7f50: 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
7f60: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
7f70: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
7f80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7f90: 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  3(v, sqlite3Vdbe
7fa0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
7fb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7fc0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
7fd0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
7fe0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7ff0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8000: 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20        z = 0;.   
8010: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
8020: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
8030: 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30  ;.  return (z!=0
8040: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
8050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
8060: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
8070: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8080: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8090: 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  LE./*.** Check t
80a0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
80b0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
80c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
80d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
80e0: 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a  n MATCH expr.**.
80f0: 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e  ** If it is then
8100: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49   return TRUE.  I
8110: 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41  f not, return FA
8120: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
8130: 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  nt isMatchOfColu
8140: 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70  mn(.  Expr *pExp
8150: 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74  r      /* Test t
8160: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
8170: 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
8180: 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70  *pList;..  if( p
8190: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e  Expr->op!=TK_FUN
81a0: 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74  CTION ){.    ret
81b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
81c0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
81d0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
81e0: 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20  "match")!=0 ){. 
81f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8200: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
8210: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28  ->x.pList;.  if(
8220: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32   pList->nExpr!=2
8230: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8240: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
8250: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[1].pExpr->o
8260: 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29  p != TK_COLUMN )
8270: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
8290: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
82a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
82b0: 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ABLE */../*.** I
82c0: 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72  f the pBase expr
82d0: 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
82e0: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
82f0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a  SING clause of.*
8300: 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  * a join, then t
8310: 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72  ransfer the appr
8320: 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73  opriate markings
8330: 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64   over to derived
8340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8350: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
8360: 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72  kings(Expr *pDer
8370: 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73  ived, Expr *pBas
8380: 65 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  e){.  pDerived->
8390: 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e  flags |= pBase->
83a0: 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a  flags & EP_FromJ
83b0: 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d  oin;.  pDerived-
83c0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
83d0: 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74   = pBase->iRight
83e0: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69  JoinTable;.}..#i
83f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8400: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
8410: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
8420: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8430: 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20  SUBQUERY)./*.** 
8440: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
8450: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
8460: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63  two or more OR-c
8470: 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74  onnected.** subt
8480: 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a  erms.  So in:.**
8490: 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52  .**     ... WHER
84a0: 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d  E  (a=5) AND (b=
84b0: 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33  7 OR c=9 OR d=13
84c0: 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20  ) AND (d=13).** 
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84e0: 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e           ^^^^^^^
84f0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a  ^^^^^^^^^^^^^.**
8500: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8510: 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20   analyzes terms 
8520: 73 75 63 68 20 61 73 20 74 68 65 20 6d 69 64 64  such as the midd
8530: 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61  le term in the a
8540: 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a  bove example..**
8550: 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f   A WhereOrTerm o
8560: 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65  bject is compute
8570: 64 20 61 6e 64 20 61 74 74 61 63 68 65 64 20 74  d and attached t
8580: 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72  o the term under
8590: 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65  .** analysis, re
85a0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
85b0: 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61  outcome of the a
85c0: 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a  nalysis.  Hence:
85d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  .**.**     Where
85e0: 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c  Term.wtFlags   |
85f0: 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a  =  TERM_ORINFO.*
8600: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
8610: 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20  u.pOrInfo  =  a 
8620: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
8630: 63 61 74 65 64 20 57 68 65 72 65 4f 72 54 65 72  cated WhereOrTer
8640: 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54  m object.**.** T
8650: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  he term being an
8660: 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65  alyzed must have
8670: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20   two or more of 
8680: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62  OR-connected sub
8690: 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67  terms..** A sing
86a0: 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74  le subterm might
86b0: 20 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44   be a set of AND
86c0: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73  -connected sub-s
86d0: 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d  ubterms..** Exam
86e0: 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e  ples of terms un
86f0: 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a  der analysis:.**
8700: 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20 20  .**     (A)     
8710: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e  t1.x=t2.y OR t1.
8720: 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31  x=t2.z OR t1.y=1
8730: 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35  5 OR t1.z=t3.a+5
8740: 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20 20  .**     (B)     
8750: 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72 32  x=expr1 OR expr2
8760: 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a  =x OR x=expr3.**
8770: 20 20 20 20 20 28 43 29 20 20 20 20 20 74 31 2e       (C)     t1.
8780: 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d  x=t2.y OR (t1.x=
8790: 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35  t2.z AND t1.y=15
87a0: 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20  ).**     (D)    
87b0: 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31   x=expr1 OR (y>1
87c0: 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a  1 AND y<22 AND z
87d0: 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29   LIKE '*hello*')
87e0: 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20 20  .**     (E)     
87f0: 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32  (p.a=1 AND q.b=2
8800: 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28   AND r.c=3) OR (
8810: 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20  p.x=4 AND q.y=5 
8820: 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a  AND r.z=6).**.**
8830: 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 1:.**.** I
8840: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
8850: 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54  re of the form T
8860: 2e 43 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65  .C=expr for some
8870: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f   single column o
8880: 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e  f C and.** a sin
8890: 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73 20  gle table T (as 
88a0: 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65  shown in example
88b0: 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63   B above) then c
88c0: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
88d0: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74  ual.** term that
88e0: 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   is an equivalen
88f0: 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  t IN expression.
8900: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
8910: 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a  , if the term.**
8920: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
8930: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
8940: 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78   = expr1  OR  ex
8950: 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d  pr2 = x  OR  x =
8960: 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65   expr3.**.** the
8970: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
8980: 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65  irtual term like
8990: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
89a0: 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78    x IN (expr1,ex
89b0: 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a  pr2,expr3).**.**
89c0: 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 2:.**.** I
89d0: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
89e0: 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20  re indexable by 
89f0: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
8a00: 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a  , then set.**.**
8a10: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65       WhereTerm.e
8a20: 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20 20  Operator        
8a30: 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a        =  WO_OR.*
8a40: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
8a50: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
8a60: 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75  able  |=  the cu
8a70: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
8a80: 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20  table T.**.** A 
8a90: 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65  subterm is "inde
8aa0: 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73 20  xable" if it is 
8ab0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22  of the form.** "
8ac0: 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22  T.C <op> <expr>"
8ad0: 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79 20   where C is any 
8ae0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
8af0: 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69  T and .** <op> i
8b00: 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c  s one of "=", "<
8b10: 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e  ", "<=", ">", ">
8b20: 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f  =", "IS NULL", o
8b30: 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62  r "IN"..** A sub
8b40: 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64  term is also ind
8b50: 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73 20  exable if it is 
8b60: 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72  an AND of two or
8b70: 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74   more.** subsubt
8b80: 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  erms at least on
8b90: 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e  e of which is in
8ba0: 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61  dexable.  Indexa
8bb0: 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74  ble AND .** subt
8bc0: 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72 20  erms have their 
8bd0: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
8be0: 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79   WO_AND and they
8bf0: 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49   have.** u.pAndI
8c00: 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e  nfo set to a dyn
8c10: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
8c20: 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20  ed WhereAndTerm 
8c30: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72  object..**.** Fr
8c40: 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74  om another point
8c50: 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78   of view, "index
8c60: 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74  able" means that
8c70: 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75   the subterm cou
8c80: 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c  ld.** potentiall
8c90: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
8ca0: 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70  n index if an ap
8cb0: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20  propriate index 
8cc0: 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20  exists..** This 
8cd0: 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f  analysis does no
8ce0: 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68  t consider wheth
8cf0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e  er or not the in
8d00: 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61 74  dex exists; that
8d10: 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  .** is something
8d20: 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29   the bestIndex()
8d30: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65   routine will de
8d40: 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61  termine.  This a
8d50: 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20  nalysis.** only 
8d60: 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72  looks at whether
8d70: 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70   subterms approp
8d80: 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69  riate for indexi
8d90: 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ng exist..**.** 
8da0: 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74  All examples A t
8db0: 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61  hrough E above a
8dc0: 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ll satisfy case 
8dd0: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
8de0: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73  m.** also statis
8df0: 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63  fies case 1 (suc
8e00: 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20  h as B) we know 
8e10: 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
8e20: 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79  er will.** alway
8e30: 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c  s prefer case 1,
8e40: 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
8e50: 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74   we pretend that
8e60: 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a   case 2 is not.*
8e70: 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a  * satisfied..**.
8e80: 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74  ** It might be t
8e90: 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c  he case that mul
8ea0: 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65  tiple tables are
8eb0: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72   indexable.  For
8ec0: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29   example,.** (E)
8ed0: 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61   above is indexa
8ee0: 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c  ble on tables P,
8ef0: 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a   Q, and R..**.**
8f00: 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69   Terms that sati
8f10: 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63  sfy case 2 are c
8f20: 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f  andidates for lo
8f30: 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a  okup by using.**
8f40: 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
8f50: 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73  s to find rowids
8f60: 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72   for each subter
8f70: 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a  m and composing.
8f80: 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20  ** the union of 
8f90: 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67  all rowids using
8fa0: 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
8fb0: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
8fc0: 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70  ar.** to "bitmap
8fd0: 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68   indices" in oth
8fe0: 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  er database engi
8ff0: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52  nes..**.** OTHER
9000: 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  WISE:.**.** If n
9010: 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f  either case 1 no
9020: 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20  r case 2 apply, 
9030: 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65  then leave the e
9040: 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a  Operator set to.
9050: 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74  ** zero.  This t
9060: 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75  erm is not usefu
9070: 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f  l for search..*/
9080: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9090: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a  rAnalyzeOrTerm(.
90a0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
90c0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
90d0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
90e0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
90f0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48   the complete WH
9100: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
9110: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
9120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9130: 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72  ex of the OR-ter
9140: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
9150: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
9160: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
9170: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
9180: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
9190: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
91a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
91b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
91c0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
91d0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ection */.  Wher
91e0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
91f0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
9200: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
9210: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
9220: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
9230: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20  = pTerm->pExpr; 
9240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9250: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
9260: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57   the term */.  W
9270: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
9280: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
9290: 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20  skSet; /* Table 
92a0: 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69  use masks */.  i
92b0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
92e0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
92f0: 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
9300: 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75         /* Breaku
9310: 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20  p of pTerm into 
9320: 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68  subterms */.  Wh
9330: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
9340: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62  ;       /* A Sub
9350: 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  -term within the
9360: 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72   pOrWc */.  Wher
9370: 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f  eOrInfo *pOrInfo
9380: 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f  ;     /* Additio
9390: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
93a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
93b0: 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61  pTerm */.  Bitma
93c0: 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20  sk chngToIN;    
93d0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
93e0: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
93f0: 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69  y case 1 */.  Bi
9400: 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b  tmask indexable;
9410: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
9420: 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78  s that are index
9430: 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67  able, satisfying
9440: 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a   case 2 */..  /*
9450: 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20  .  ** Break the 
9460: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69  OR clause into i
9470: 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74  ts separate subt
9480: 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65  erms.  The subte
9490: 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f  rms are.  ** sto
94a0: 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c  red in a WhereCl
94b0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63  ause structure c
94c0: 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e  ontaining within
94d0: 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f   the WhereOrInfo
94e0: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  .  ** object tha
94f0: 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  t is attached to
9500: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52   the original OR
9510: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20   clause term..  
9520: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  */.  assert( (pT
9530: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
9540: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52  TERM_DYNAMIC|TER
9550: 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e  M_ORINFO|TERM_AN
9560: 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  DINFO))==0 );.  
9570: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
9580: 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54  p==TK_OR );.  pT
9590: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d  erm->u.pOrInfo =
95a0: 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74   pOrInfo = sqlit
95b0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
95c0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e  b, sizeof(*pOrIn
95d0: 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49  fo));.  if( pOrI
95e0: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nfo==0 ) return;
95f0: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
9600: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  s |= TERM_ORINFO
9610: 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72  ;.  pOrWc = &pOr
9620: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72  Info->wc;.  wher
9630: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57  eClauseInit(pOrW
9640: 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  c, pWC->pParse, 
9650: 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77  pMaskSet, pWC->w
9660: 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 77 68  ctrlFlags);.  wh
9670: 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20  ereSplit(pOrWc, 
9680: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
9690: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
96a0: 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20  pSrc, pOrWc);.  
96b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
96c0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
96d0: 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e   assert( pOrWc->
96e0: 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f  nTerm>=2 );..  /
96f0: 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74  *.  ** Compute t
9700: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
9710: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
9720: 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32  sfy cases 1 or 2
9730: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62  ..  */.  indexab
9740: 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  le = ~(Bitmask)0
9750: 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e  ;.  chngToIN = ~
9760: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
9770: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
9780: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
9790: 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e  c->a; i>=0 && in
97a0: 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f  dexable; i--, pO
97b0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  rTerm++){.    if
97c0: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
97d0: 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c  rator & WO_SINGL
97e0: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  E)==0 ){.      W
97f0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e  hereAndInfo *pAn
9800: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73  dInfo;.      ass
9810: 65 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77  ert( (pOrTerm->w
9820: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41  tFlags & (TERM_A
9830: 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e  NDINFO|TERM_ORIN
9840: 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  FO))==0 );.     
9850: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
9860: 20 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20       pAndInfo = 
9870: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
9880: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
9890: 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  AndInfo));.     
98a0: 20 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b   if( pAndInfo ){
98b0: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c  .        WhereCl
98c0: 61 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20  ause *pAndWC;.  
98d0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
98e0: 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20  *pAndTerm;.     
98f0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
9900: 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b    Bitmask b = 0;
9910: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
9920: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70  ->u.pAndInfo = p
9930: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AndInfo;.       
9940: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
9950: 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46  s |= TERM_ANDINF
9960: 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  O;.        pOrTe
9970: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
9980: 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  WO_AND;.        
9990: 70 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e  pAndWC = &pAndIn
99a0: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
99b0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
99c0: 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 50 61  pAndWC, pWC->pPa
99d0: 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70  rse, pMaskSet, p
99e0: 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b  WC->wctrlFlags);
99f0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 53 70  .        whereSp
9a00: 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54  lit(pAndWC, pOrT
9a10: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41  erm->pExpr, TK_A
9a20: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  ND);.        exp
9a30: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63  rAnalyzeAll(pSrc
9a40: 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20  , pAndWC);.     
9a50: 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65     pAndWC->pOute
9a60: 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20  r = pWC;.       
9a70: 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d   testcase( db->m
9a80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9a90: 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e         if( !db->
9aa0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9ab0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
9ac0: 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64  0, pAndTerm=pAnd
9ad0: 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d  WC->a; j<pAndWC-
9ae0: 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e  >nTerm; j++, pAn
9af0: 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  dTerm++){.      
9b00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41        assert( pA
9b10: 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b  ndTerm->pExpr );
9b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
9b30: 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54   allowedOp(pAndT
9b40: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20  erm->pExpr->op) 
9b50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9b60: 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d   b |= getMask(pM
9b70: 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d  askSet, pAndTerm
9b80: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
9b90: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9bb0: 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78   }.        index
9bc0: 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20  able &= b;.     
9bd0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
9be0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
9bf0: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
9c00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70  ){.      /* Skip
9c10: 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e   this term for n
9c20: 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74 20  ow.  We revisit 
9c30: 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65  it when we proce
9c40: 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ss the.      ** 
9c50: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45  corresponding TE
9c60: 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20  RM_VIRTUAL term 
9c70: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
9c80: 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20      Bitmask b;. 
9c90: 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b       b = getMask
9ca0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  (pMaskSet, pOrTe
9cb0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
9cc0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
9cd0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9ce0: 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20  RM_VIRTUAL ){.  
9cf0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
9d00: 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63  *pOther = &pOrWc
9d10: 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61  ->a[pOrTerm->iPa
9d20: 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62  rent];.        b
9d30: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73   |= getMask(pMas
9d40: 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65  kSet, pOther->le
9d50: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
9d60: 20 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62   }.      indexab
9d70: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69  le &= b;.      i
9d80: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
9d90: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d  erator & WO_EQ)=
9da0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
9db0: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
9dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9dd0: 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a   chngToIN &= b;.
9de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9df0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63  }..  /*.  ** Rec
9e00: 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66 20 74  ord the set of t
9e10: 61 62 6c 65 73 20 74 68 61 74 20 73 61 74 69 73  ables that satis
9e20: 66 79 20 63 61 73 65 20 32 2e 20 20 54 68 65 20  fy case 2.  The 
9e30: 73 65 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a  set might be.  *
9e40: 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  * empty..  */.  
9e50: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
9e60: 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a  le = indexable;.
9e70: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
9e80: 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d  or = indexable==
9e90: 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a  0 ? 0 : WO_OR;..
9ea0: 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    /*.  ** chngTo
9eb0: 49 4e 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f  IN holds a set o
9ec0: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d  f tables that *m
9ed0: 69 67 68 74 2a 20 73 61 74 69 73 66 79 20 63 61  ight* satisfy ca
9ee0: 73 65 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20  se 1.  But.  ** 
9ef0: 77 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  we have to do so
9f00: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68  me additional ch
9f10: 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66  ecking to see if
9f20: 20 63 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20   case 1 really. 
9f30: 20 2a 2a 20 69 73 20 73 61 74 69 73 66 69 65 64   ** is satisfied
9f40: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67  ..  **.  ** chng
9f50: 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65  ToIN will hold e
9f60: 69 74 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32  ither 0, 1, or 2
9f70: 20 62 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69   bits.  The 0-bi
9f80: 74 20 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a  t case means.  *
9f90: 2a 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  * that there is 
9fa0: 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f  no possibility o
9fb0: 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  f transforming t
9fc0: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74  he OR clause int
9fd0: 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65  o an.  ** IN ope
9fe0: 72 61 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e  rator because on
9ff0: 65 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20  e or more terms 
a000: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
a010: 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f   contain.  ** so
a020: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
a030: 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d  an == on a colum
a040: 6e 20 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20  n in the single 
a050: 74 61 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69  table.  The 1-bi
a060: 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e  t.  ** case mean
a070: 73 20 74 68 61 74 20 65 76 65 72 79 20 74 65 72  s that every ter
a080: 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75  m of the OR clau
a090: 73 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  se is of the for
a0a0: 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f  m.  ** "table.co
a0b0: 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73  lumn=expr" for s
a0c0: 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  ome single table
a0d0: 2e 20 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74  .  The one bit t
a0e0: 68 61 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20  hat is set.  ** 
a0f0: 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20  will correspond 
a100: 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61  to the common ta
a110: 62 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e  ble.  We still n
a120: 65 65 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  eed to check to 
a130: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74  make.  ** sure t
a140: 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69  he same column i
a150: 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65  s used on all te
a160: 72 6d 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20  rms.  The 2-bit 
a170: 63 61 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a  case is when.  *
a180: 2a 20 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20  * the all terms 
a190: 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  are of the form 
a1a0: 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74  "table1.column=t
a1b0: 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20  able2.column".  
a1c0: 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  It.  ** might be
a1d0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72   possible to for
a1e0: 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  m an IN operator
a1f0: 20 77 69 74 68 20 65 69 74 68 65 72 20 74 61 62   with either tab
a200: 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  le1.column.  ** 
a210: 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  or table2.column
a220: 20 61 73 20 74 68 65 20 4c 48 53 20 69 66 20 65   as the LHS if e
a230: 69 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20  ither is common 
a240: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  to every term of
a250: 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61  .  ** the OR cla
a260: 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  use..  **.  ** N
a270: 6f 74 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f  ote that terms o
a280: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
a290: 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e  e.column1=table.
a2a0: 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20  column2" (the.  
a2b0: 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e  ** same table on
a2c0: 20 62 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74   both sizes of t
a2d0: 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65  he ==) cannot be
a2e0: 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f   optimized..  */
a2f0: 0a 20 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20  .  if( chngToIN 
a300: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43  ){.    int okToC
a310: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20  hngToIN = 0;    
a320: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
a330: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e  conversion to IN
a340: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20   is valid */.   
a350: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d   int iColumn = -
a360: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  1;         /* Co
a370: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68  lumn index on lh
a380: 73 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  s of IN operator
a390: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72   */.    int iCur
a3a0: 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  sor = -1;       
a3b0: 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f    /* Table curso
a3c0: 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  r common to all 
a3d0: 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
a3e0: 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   j = 0;         
a3f0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
a400: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  ounter */..    /
a410: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
a420: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
a430: 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20  that appears on 
a440: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a  one side or the.
a450: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20      ** other of 
a460: 74 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20  the == operator 
a470: 69 6e 20 65 76 65 72 79 20 73 75 62 74 65 72 6d  in every subterm
a480: 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e  .  That table an
a490: 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20  d column.    ** 
a4a0: 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64  will be recorded
a4b0: 20 69 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20   in iCursor and 
a4c0: 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20  iColumn.  There 
a4d0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79  might not be any
a4e0: 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62  .    ** such tab
a4f0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20  le and column.  
a500: 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  Set okToChngToIN
a510: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
a520: 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  te table.    ** 
a530: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f  and column is fo
a540: 75 6e 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b  und but leave ok
a550: 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65  ToChngToIN false
a560: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
a570: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d     */.    for(j=
a580: 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43  0; j<2 && !okToC
a590: 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20  hngToIN; j++){. 
a5a0: 20 20 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70       pOrTerm = p
a5b0: 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66  OrWc->a;.      f
a5c0: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
a5d0: 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  m-1; i>=0; i--, 
a5e0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
a5f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
a600: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
a610: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
a620: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
a630: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
a640: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
a650: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
a660: 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or==iCursor ){. 
a670: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
a680: 20 69 73 20 74 68 65 20 32 2d 62 69 74 20 63 61   is the 2-bit ca
a690: 73 65 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e  se and we are on
a6a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
a6b0: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
a6c0: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
a6d0: 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20  erm is from the 
a6e0: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e  first iteration.
a6f0: 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74    So skip this t
a700: 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
a710: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
a720: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
a730: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
a740: 20 20 20 20 20 20 20 20 69 66 28 20 28 63 68 6e          if( (chn
a750: 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28  gToIN & getMask(
a760: 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72  pMaskSet, pOrTer
a770: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d  m->leftCursor))=
a780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a790: 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73  /* This term mus
a7a0: 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  t be of the form
a7b0: 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72   t1.a==t2.b wher
a7c0: 65 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20  e t2 is in the. 
a7d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67           ** chng
a7e0: 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20  ToIN set but t1 
a7f0: 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65  is not.  This te
a800: 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65  rm will be eithe
a810: 72 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20  r preceeded.    
a820: 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c        ** or foll
a830: 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74  wed by an invert
a840: 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74  ed copy (t2.b==t
a850: 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73  1.a).  Skip this
a860: 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20   term .         
a870: 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20   ** and use its 
a880: 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20  inversion. */.  
a890: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
a8a0: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
a8b0: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
a8c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
a8d0: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
a8e0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
a8f0: 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
a900: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
a910: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
a920: 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52  (TERM_COPIED|TER
a930: 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20  M_VIRTUAL) );.  
a940: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
a950: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a960: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f      iColumn = pO
a970: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
a980: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75  umn;.        iCu
a990: 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  rsor = pOrTerm->
a9a0: 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  leftCursor;.    
a9b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a9c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30   }.      if( i<0
a9d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
a9e0: 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  o candidate tabl
a9f0: 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75  e+column was fou
aa00: 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e  nd.  This can on
aa10: 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20  ly occur.       
aa20: 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e   ** on the secon
aa30: 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  d iteration */. 
aa40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
aa50: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
aa60: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
aa70: 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b  Two(chngToIN) );
aa80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
aa90: 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61   chngToIN==getMa
aaa0: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43 75  sk(pMaskSet, iCu
aab0: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
aac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
aad0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
aae0: 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  j==1 );..      /
aaf0: 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20  * We have found 
ab00: 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  a candidate tabl
ab10: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43  e and column.  C
ab20: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
ab30: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  hat.      ** tab
ab40: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  le and column is
ab50: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
ab60: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20   term in the OR 
ab70: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
ab80: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31  okToChngToIN = 1
ab90: 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e  ;.      for(; i>
aba0: 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f  =0 && okToChngTo
abb0: 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  IN; i--, pOrTerm
abc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
abd0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
abe0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
abf0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
ac00: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
ac10: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
ac20: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
ac30: 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45  ->wtFlags &= ~TE
ac40: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
ac50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
ac60: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
ac70: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
ac80: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
ac90: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
aca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
acb0: 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20     int affLeft, 
acc0: 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20  affRight;.      
acd0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69      /* If the ri
ace0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
acf0: 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20   also a column, 
ad00: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
ad10: 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
ad20: 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61   of both right a
ad30: 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75  nd left sides mu
ad40: 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20  st be such that 
ad50: 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20  no type.        
ad60: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
ad70: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
ad80: 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69   the right.  (Ti
ad90: 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20  cket #2249).    
ada0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
adb0: 20 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71     affRight = sq
adc0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
add0: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
ade0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
adf0: 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73       affLeft = s
ae00: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
ae10: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
ae20: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
ae30: 20 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68       if( affRigh
ae40: 74 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74  t!=0 && affRight
ae50: 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20  !=affLeft ){.   
ae60: 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e           okToChn
ae70: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
ae80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ae90: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
aea0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
aeb0: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
aec0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
aed0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
aee0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
aef0: 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  t, okToChngToIN 
af00: 69 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69  is true if origi
af10: 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66  nal pTerm satisf
af20: 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  ies.    ** case 
af30: 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  1.  In that case
af40: 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  , construct a ne
af50: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74  w virtual term t
af60: 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70  hat is .    ** p
af70: 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69  Term converted i
af80: 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  nto an IN operat
af90: 6f 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  or..    **.    *
afa0: 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35  * EV: R-00211-15
afb0: 31 30 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  100.    */.    i
afc0: 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  f( okToChngToIN 
afd0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
afe0: 44 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dup;            
aff0: 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64  /* A transient d
b000: 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73  uplicate express
b010: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
b020: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
b030: 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f  ;   /* The RHS o
b040: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
b050: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
b060: 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *pLeft = 0;     
b070: 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
b080: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
b090: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
b0a0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
b0b0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
b0c0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a  IN operator */..
b0d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
b0e0: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
b0f0: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
b100: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
b110: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
b120: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
b130: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
b140: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
b150: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b160: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
b170: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
b180: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
b190: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
b1a0: 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20  r==iCursor );.  
b1b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
b1c0: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
b1d0: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a  umn==iColumn );.
b1e0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
b1f0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b200: 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
b210: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
b220: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71        pList = sq
b230: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
b240: 65 6e 64 28 70 57 43 2d 3e 70 50 61 72 73 65 2c  end(pWC->pParse,
b250: 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20   pList, pDup);. 
b260: 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70         pLeft = p
b270: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
b280: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Left;.      }.  
b290: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
b2a0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44  t!=0 );.      pD
b2b0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
b2c0: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
b2d0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
b2e0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b2f0: 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70  rse, TK_IN, pDup
b300: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
b310: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
b320: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
b330: 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a         transferJ
b340: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
b350: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
b360: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
b370: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
b380: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
b390: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
b3a0: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
b3b0: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
b3c0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
b3d0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54  ert(pWC, pNew, T
b3e0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
b3f0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
b400: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
b410: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
b420: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
b430: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
b440: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
b450: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
b460: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d  m];.        pWC-
b470: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65  >a[idxNew].iPare
b480: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
b490: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
b4a0: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ild = 1;.      }
b4b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b4c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
b4d0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
b4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
b4f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
b500: 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61   WO_NOOP;  /* ca
b510: 73 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65  se 1 trumps case
b520: 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a   2 */.    }.  }.
b530: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
b540: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
b550: 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c  MIZATION && !SQL
b560: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b570: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  Y */../*.** The 
b580: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
b590: 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72  utine is an Wher
b5a0: 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20  eTerm structure 
b5b0: 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  with only the.**
b5c0: 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66   "pExpr" field f
b5d0: 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a  illed in.  The j
b5e0: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
b5f0: 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65  ne is to analyze
b600: 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65   the.** subexpre
b610: 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61  ssion and popula
b620: 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  te all the other
b630: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57   fields of the W
b640: 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75  hereTerm.** stru
b650: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
b660: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
b670: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  s of the form "<
b680: 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74  expr> <op> X" it
b690: 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a   gets commuted.*
b6a0: 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72  * to the standar
b6b0: 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70  d form of "X <op
b6c0: 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a  > <expr>"..**.**
b6d0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
b6e0: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
b6f0: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
b700: 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20  re both X and Y 
b710: 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20  are.** columns, 
b720: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
b730: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  l expression is 
b740: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
b750: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
b760: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
b770: 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64  "Y <op> X" is ad
b780: 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45  ded to the WHERE
b790: 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61   clause and.** a
b7a0: 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65  nalyzed separate
b7b0: 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61  ly.  The origina
b7c0: 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  l term is marked
b7d0: 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45   with TERM_COPIE
b7e0: 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77  D.** and the new
b7f0: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
b800: 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49  with TERM_DYNAMI
b810: 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20  C (because it's 
b820: 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74  pExpr.** needs t
b830: 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20  o be freed with 
b840: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29  the WhereClause)
b850: 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41   and TERM_VIRTUA
b860: 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a  L (because it.**
b870: 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63   is a commuted c
b880: 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74  opy of a prior t
b890: 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69  erm.)  The origi
b8a0: 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68  nal term has nCh
b8b0: 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65  ild=1.** and the
b8c0: 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72   copy has idxPar
b8d0: 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69  ent set to the i
b8e0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67  ndex of the orig
b8f0: 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  inal term..*/.st
b900: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
b910: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74  alyze(.  SrcList
b920: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
b930: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
b940: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
b950: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
b960: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
b970: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
b980: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
b990: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
b9a0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20   of the term to 
b9b0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
b9c0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
b9d0: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
b9e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d       /* The term
b9f0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
ba00: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
ba10: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
ba20: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
ba30: 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b  table index mask
ba40: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  s */.  Expr *pEx
ba50: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
ba60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
ba70: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
ba80: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69  analyzed */.  Bi
ba90: 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74  tmask prereqLeft
baa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
bab0: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
bac0: 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  of the pExpr->pL
bad0: 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  eft */.  Bitmask
bae0: 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20   prereqAll;     
baf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
bb00: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45  requesites of pE
bb10: 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  xpr */.  Bitmask
bb20: 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b   extraRight = 0;
bb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
bb40: 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  ra dependencies 
bb50: 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a  on LEFT JOIN */.
bb60: 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20    Expr *pStr1 = 
bb70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
bb80: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b     /* RHS of LIK
bb90: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
bba0: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  */.  int isCompl
bbb0: 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ete = 0;        
bbc0: 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
bbd0: 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77  LIKE/GLOB ends w
bbe0: 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a  ith wildcard */.
bbf0: 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30    int noCase = 0
bc00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bc10: 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20     /* LIKE/GLOB 
bc20: 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63 61  distinguishes ca
bc30: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  se */.  int op; 
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d           /* Top-
bc60: 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20  level operator. 
bc70: 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20   pExpr->op */.  
bc80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
bc90: 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  pWC->pParse;    
bca0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
bcb0: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
bcc0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
bcd0: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  b;        /* Dat
bce0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
bcf0: 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
bd00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
bd10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
bd20: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
bd30: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61  [idxTerm];.  pMa
bd40: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
bd50: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
bd60: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
bd70: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
bd80: 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78  op!=TK_AS && pEx
bd90: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41  pr->op!=TK_COLLA
bda0: 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65  TE );.  prereqLe
bdb0: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
bdc0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
bdd0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
bde0: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
bdf0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
be00: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
be10: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
be20: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
be30: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
be40: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
be50: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
be60: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
be70: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
be80: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
be90: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
bea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
beb0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
bec0: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
bed0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
bee0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
bef0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
bf00: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
bf10: 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  LL ){.    pTerm-
bf20: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
bf30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
bf40: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
bf50: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
bf60: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
bf70: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
bf80: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
bf90: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
bfa0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
bfb0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
bfc0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
bfd0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
bfe0: 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74   Bitmask x = get
bff0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
c000: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
c010: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72  Table);.    prer
c020: 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20  eqAll |= x;.    
c030: 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31  extraRight = x-1
c040: 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20  ;  /* ON clause 
c050: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
c060: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
c070: 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
c080: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
c090: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
c0a0: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63   LEFT JOIN.  Tic
c0b0: 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d  ket #3015 */.  }
c0c0: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
c0d0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
c0e0: 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  .  pTerm->leftCu
c0f0: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rsor = -1;.  pTe
c100: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
c110: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
c120: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ator = 0;.  if( 
c130: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b  allowedOp(op) ){
c140: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
c150: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
c160: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
c170: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70  >pLeft);.    Exp
c180: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
c190: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
c1a0: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
c1b0: 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73  );.    u16 opMas
c1c0: 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  k = (pTerm->prer
c1d0: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
c1e0: 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c  Left)==0 ? WO_AL
c1f0: 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  L : WO_EQUIV;.  
c200: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
c210: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
c220: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
c230: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
c240: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
c250: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
c260: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
c270: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
c280: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
c290: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f  atorMask(op) & o
c2a0: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  pMask;.    }.   
c2b0: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
c2c0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
c2d0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68  LUMN ){.      Wh
c2e0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20  ereTerm *pNew;. 
c2f0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
c300: 0a 20 20 20 20 20 20 75 31 36 20 65 45 78 74 72  .      u16 eExtr
c310: 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  aOp = 0;        
c320: 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20 66 6f  /* Extra bits fo
c330: 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f  r pNew->eOperato
c340: 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
c350: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
c360: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
c370: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
c380: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
c390: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
c3a0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
c3b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
c3c0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
c3d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
c3e0: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
c3f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
c400: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c410: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
c420: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c430: 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49  C, pDup, TERM_VI
c440: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
c450: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IC);.        if(
c460: 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74   idxNew==0 ) ret
c470: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
c480: 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  w = &pWC->a[idxN
c490: 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew];.        pNe
c4a0: 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w->iParent = idx
c4b0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
c4c0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
c4d0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
c4e0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
c4f0: 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  1;.        pTerm
c500: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
c510: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
c520: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
c530: 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20 20 20  =TK_EQ.         
c540: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
c550: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
c560: 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
c570: 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
c580: 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
c590: 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29 0a 20  TE_Transitive). 
c5a0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
c5b0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
c5c0: 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56  ator |= WO_EQUIV
c5d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45 78 74  ;.          eExt
c5e0: 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b  raOp = WO_EQUIV;
c5f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c610: 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20  pDup = pExpr;.  
c620: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65        pNew = pTe
c630: 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
c640: 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50    exprCommute(pP
c650: 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20  arse, pDup);.   
c660: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
c670: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
c680: 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a  e(pDup->pLeft);.
c690: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
c6a0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
c6b0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
c6c0: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
c6d0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
c6e0: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
c6f0: 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c  e( (prereqLeft |
c700: 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20   extraRight) != 
c710: 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20  prereqLeft );.  
c720: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
c730: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
c740: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b  ft | extraRight;
c750: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
c760: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
c770: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
c780: 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f 70 65  eOperator = (ope
c790: 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e  ratorMask(pDup->
c7a0: 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70 29 20  op) + eExtraOp) 
c7b0: 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  & opMask;.    }.
c7c0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
c7d0: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
c7e0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
c7f0: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
c800: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
c810: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
c820: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
c830: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
c840: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
c850: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
c860: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
c870: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
c880: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
c890: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
c8a0: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
c8b0: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
c8c0: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
c8d0: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
c8e0: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
c8f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
c900: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
c910: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
c920: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
c930: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
c940: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
c950: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
c960: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
c970: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
c980: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
c990: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
c9a0: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
c9b0: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
c9c0: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
c9d0: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
c9e0: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
c9f0: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
ca00: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
ca10: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
ca20: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
ca30: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
ca40: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
ca50: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
ca60: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
ca70: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
ca80: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
ca90: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
caa0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
cab0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
cac0: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
cad0: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
cae0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
caf0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
cb00: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
cb10: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
cb20: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
cb30: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
cb40: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
cb50: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
cb60: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
cb70: 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20  , ops[i], .     
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
cba0: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
cbb0: 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  ->pLeft, 0),.   
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cbe0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69  3ExprDup(db, pLi
cbf0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
cc00: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
cc10: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
cc20: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
cc30: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
cc40: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
cc50: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
cc60: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
cc70: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
cc80: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
cc90: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
cca0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
ccb0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
ccc0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
ccd0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
cce0: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
ccf0: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
cd00: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
cd10: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
cd20: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
cd30: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
cd40: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
cd50: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
cd60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
cd70: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
cd80: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
cd90: 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20  hat is composed 
cda0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
cdb0: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
cdc0: 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20  d by.  ** an OR 
cdd0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
cde0: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
cdf0: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
ce00: 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f    assert( pWC->o
ce10: 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
ce20: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
ce30: 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  rm(pSrc, pWC, id
ce40: 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  xTerm);.    pTer
ce50: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
ce60: 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  erm];.  }.#endif
ce70: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ce80: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
ce90: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
cea0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
ceb0: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
cec0: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
ced0: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
cee0: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
cef0: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
cf00: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
cf10: 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74    ** A like patt
cf20: 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ern of the form 
cf30: 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20  "x LIKE 'abc%'" 
cf40: 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20  is changed into 
cf50: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
cf60: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78  .  **          x
cf70: 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61  >='abc' AND x<'a
cf80: 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27  bd' AND x LIKE '
cf90: 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20  abc%'.  **.  ** 
cfa0: 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  The last charact
cfb0: 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  er of the prefix
cfc0: 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d   "abc" is increm
cfd0: 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68  ented to form th
cfe0: 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69  e.  ** terminati
cff0: 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62  on condition "ab
d000: 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d"..  */.  if( p
d010: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a  WC->op==TK_AND .
d020: 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c     && isLikeOrGl
d030: 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ob(pParse, pExpr
d040: 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d  , &pStr1, &isCom
d050: 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a  plete, &noCase).
d060: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
d070: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Left;       /* L
d080: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
d090: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
d0a0: 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20  Expr *pStr2;    
d0b0: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53     /* Copy of pS
d0c0: 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b  tr1 - RHS of LIK
d0d0: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
d0e0: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  */.    Expr *pNe
d0f0: 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72  wExpr1;.    Expr
d100: 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
d110: 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20   int idxNew1;.  
d120: 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20    int idxNew2;. 
d130: 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65     Token sCollSe
d140: 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  qName;  /* Name 
d150: 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  of collating seq
d160: 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c  uence */..    pL
d170: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
d180: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
d190: 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71  ;.    pStr2 = sq
d1a0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
d1b0: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
d1c0: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
d1d0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75  ailed ){.      u
d1e0: 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20  8 c, *pC;       
d1f0: 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65  /* Last characte
d200: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
d210: 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  st wildcard */. 
d220: 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26       pC = (u8*)&
d230: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pStr2->u.zToken[
d240: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
d250: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pStr2->u.zToken)
d260: 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
d270: 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
d280: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
d290: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20  /* The point is 
d2a0: 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
d2b0: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
d2c0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
d2d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64  .        ** wild
d2e0: 63 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65  card.  But if we
d2f0: 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20   increment '@', 
d300: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69  that will push i
d310: 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  t into the.     
d320: 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63     ** alphabetic
d330: 20 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73   range where cas
d340: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69  e conversions wi
d350: 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a  ll mess up the .
d360: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75          ** inequ
d370: 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64  ality.  To avoid
d380: 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65   this, make sure
d390: 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65   to also run the
d3a0: 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   full.        **
d3b0: 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e   LIKE on all can
d3c0: 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f  didate expressio
d3d0: 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ns by clearing t
d3e0: 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c  he isComplete fl
d3f0: 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ag.        */.  
d400: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27        if( c=='A'
d410: 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20  -1 ) isComplete 
d420: 3d 20 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d  = 0;   /* EV: R-
d430: 36 34 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a  64339-08207 */..
d440: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
d450: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
d460: 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [c];.      }.   
d470: 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a     *pC = c + 1;.
d480: 20 20 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53      }.    sCollS
d490: 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73  eqName.z = noCas
d4a0: 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22  e ? "NOCASE" : "
d4b0: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 73 43 6f  BINARY";.    sCo
d4c0: 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b  llSeqName.n = 6;
d4d0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d  .    pNewExpr1 =
d4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
d4f0: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
d500: 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73     pNewExpr1 = s
d510: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
d520: 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20  se, TK_GE, .    
d530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d540: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
d550: 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70  n(pParse,pNewExp
d560: 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  r1,&sCollSeqName
d570: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ),.           pS
d580: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78  tr1, 0);.    idx
d590: 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75  New1 = whereClau
d5a0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
d5b0: 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49  ewExpr1, TERM_VI
d5c0: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
d5d0: 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  IC);.    testcas
d5e0: 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b  e( idxNew1==0 );
d5f0: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
d600: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
d610: 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  ew1);.    pNewEx
d620: 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pr2 = sqlite3Exp
d630: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
d640: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
d650: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
d660: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a  (pParse, TK_LT,.
d670: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d680: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
d690: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65  Token(pParse,pNe
d6a0: 77 45 78 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71  wExpr2,&sCollSeq
d6b0: 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
d6c0: 20 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20    pStr2, 0);.   
d6d0: 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65   idxNew2 = where
d6e0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
d6f0: 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52  , pNewExpr2, TER
d700: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
d710: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
d720: 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d  tcase( idxNew2==
d730: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
d740: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
d750: 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54  idxNew2);.    pT
d760: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
d770: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20  xTerm];.    if( 
d780: 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  isComplete ){.  
d790: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
d7a0: 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w1].iParent = id
d7b0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43  xTerm;.      pWC
d7c0: 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61  ->a[idxNew2].iPa
d7d0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
d7e0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
d7f0: 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  ild = 2;.    }. 
d800: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
d810: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
d820: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
d830: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d840: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
d850: 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41    /* Add a WO_MA
d860: 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65  TCH auxiliary te
d870: 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72  rm to the constr
d880: 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a  aint set if the.
d890: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70    ** current exp
d8a0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
d8b0: 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20  e form:  column 
d8c0: 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a  MATCH expr..  **
d8d0: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
d8e0: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
d8f0: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
d900: 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74  ods of.  ** virt
d910: 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65  ual tables.  The
d920: 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70   native query op
d930: 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74  timizer does not
d940: 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f   attempt.  ** to
d950: 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74   do anything wit
d960: 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e  h MATCH function
d970: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  s..  */.  if( is
d980: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45  MatchOfColumn(pE
d990: 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
d9a0: 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72  idxNew;.    Expr
d9b0: 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
d9c0: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
d9d0: 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42  *pNewTerm;.    B
d9e0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c  itmask prereqCol
d9f0: 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b  umn, prereqExpr;
da00: 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ..    pRight = p
da10: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
da20: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [0].pExpr;.    p
da30: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Left = pExpr->x.
da40: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
da50: 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70  r;.    prereqExp
da60: 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  r = exprTableUsa
da70: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69  ge(pMaskSet, pRi
da80: 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ght);.    prereq
da90: 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62  Column = exprTab
daa0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
dab0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
dac0: 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20  ( (prereqExpr & 
dad0: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30  prereqColumn)==0
dae0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
daf0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
db00: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
db10: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
db20: 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20  TK_MATCH, .     
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
db50: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
db60: 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20  Right, 0), 0);. 
db70: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
db80: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
db90: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
dba0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
dbb0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
dbc0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
dbd0: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  w==0 );.      pN
dbe0: 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
dbf0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
dc00: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
dc10: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78  Right = prereqEx
dc20: 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  pr;.      pNewTe
dc30: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
dc40: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
dc50: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
dc60: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
dc70: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
dc80: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
dc90: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41  Operator = WO_MA
dca0: 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  TCH;.      pNewT
dcb0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
dcc0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
dcd0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
dce0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
dcf0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
dd00: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
dd10: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
dd20: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
dd30: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
dd40: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
dd50: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
dd60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
dd70: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
dd80: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
dd90: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
dda0: 20 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65    /* When sqlite
ddb0: 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d  _stat3 histogram
ddc0: 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
ddd0: 6c 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f  le an operator o
dde0: 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20  f the.  ** form 
ddf0: 22 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  "x IS NOT NULL" 
de00: 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65  can sometimes be
de10: 20 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20   evaluated more 
de20: 65 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a  efficiently.  **
de30: 20 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20   as "x>NULL" if 
de40: 78 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  x is not an INTE
de50: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
de60: 20 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61    So construct a
de70: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65  .  ** virtual te
de80: 72 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e  rm of that form.
de90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
dea0: 74 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c  that the virtual
deb0: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61   term must be ta
dec0: 67 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56  gged with TERM_V
ded0: 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a  NULL.  This.  **
dee0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20   TERM_VNULL tag 
def0: 77 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68  will suppress th
df00: 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
df10: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
df20: 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f  g.  ** of the lo
df30: 6f 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65  op.  Without the
df40: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67   TERM_VNULL flag
df50: 2c 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63  , the not-null c
df60: 68 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65  heck at.  ** the
df70: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f   start of the lo
df80: 6f 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20  op will prevent 
df90: 61 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  any results from
dfa0: 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e   being returned.
dfb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
dfc0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op==TK_NOTNUL
dfd0: 4c 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  L.   && pExpr->p
dfe0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
dff0: 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d  UMN.   && pExpr-
e000: 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e  >pLeft->iColumn>
e010: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  =0.  ){.    Expr
e020: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
e030: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
e040: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
e050: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
e060: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54  WhereTerm *pNewT
e070: 65 72 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78  erm;..    pNewEx
e080: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
e090: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c  r(pParse, TK_GT,
e0a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e0c0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
e0d0: 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20  pLeft, 0),.     
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 45         sqlite3PE
e100: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e  xpr(pParse, TK_N
e110: 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30  ULL, 0, 0, 0), 0
e120: 29 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d  );..    idxNew =
e130: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
e140: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
e150: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
e180: 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56  M_DYNAMIC|TERM_V
e190: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69  NULL);.    if( i
e1a0: 64 78 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70  dxNew ){.      p
e1b0: 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
e1c0: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
e1d0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
e1e0: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  qRight = 0;.    
e1f0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
e200: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
e210: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
e220: 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  ewTerm->u.leftCo
e230: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
e240: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
e250: 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  wTerm->eOperator
e260: 20 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20   = WO_GT;.      
e270: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
e280: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
e290: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
e2a0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
e2b0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
e2c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
e2d0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
e2e0: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
e2f0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
e300: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
e310: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
e320: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
e330: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 20  ITE_ENABLE_STAT 
e340: 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
e350: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
e360: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
e370: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
e380: 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
e390: 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
e3a0: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
e3b0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
e3c0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
e3d0: 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
e3e0: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ht;.}../*.** Thi
e3f0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
e400: 68 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  hes the expressi
e410: 6f 6e 20 6c 69 73 74 20 70 61 73 73 65 64 20 61  on list passed a
e420: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
e430: 75 6d 65 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 20  ument.** for an 
e440: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 79  expression of ty
e450: 70 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61  pe TK_COLUMN tha
e460: 74 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20  t refers to the 
e470: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a  same column and.
e480: 2a 2a 20 75 73 65 73 20 74 68 65 20 73 61 6d 65  ** uses the same
e490: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
e4a0: 6e 63 65 20 61 73 20 74 68 65 20 69 43 6f 6c 27  nce as the iCol'
e4b0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  th column of ind
e4c0: 65 78 20 70 49 64 78 2e 0a 2a 2a 20 41 72 67 75  ex pIdx..** Argu
e4d0: 6d 65 6e 74 20 69 42 61 73 65 20 69 73 20 74 68  ment iBase is th
e4e0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
e4f0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  used for the tab
e500: 6c 65 20 74 68 61 74 20 70 49 64 78 20 72 65 66  le that pIdx ref
e510: 65 72 73 0a 2a 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a  ers.** to..**.**
e520: 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
e530: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
e540: 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
e550: 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
e560: 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
e570: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
e580: 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
e590: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
e5a0: 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
e5b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
e5e0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
e5f0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
e600: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
e610: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
e620: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
e630: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
e640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
e650: 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
e660: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
e670: 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
e680: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
e690: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
e6a0: 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
e6b0: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
e6c0: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
e6d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
e6e0: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
e6f0: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
e700: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
e710: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
e720: 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
e730: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
e740: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
e750: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
e760: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
e770: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
e780: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
e790: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
e7a0: 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
e7b0: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
e7c0: 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
e7d0: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
e7e0: 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
e7f0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
e800: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
e810: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
e820: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
e830: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
e840: 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73  S(pColl) && 0==s
e850: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
e860: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  oll->zName, zCol
e870: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  l) ){.        re
e880: 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a  turn i;.      }.
e890: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
e8a0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
e8b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65   This routine de
e8c0: 74 65 72 6d 69 6e 65 73 20 69 66 20 70 49 64 78  termines if pIdx
e8d0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
e8e0: 61 73 73 69 73 74 20 69 6e 20 70 72 6f 63 65 73  assist in proces
e8f0: 73 69 6e 67 20 61 0a 2a 2a 20 44 49 53 54 49 4e  sing a.** DISTIN
e900: 43 54 20 71 75 61 6c 69 66 69 65 72 2e 20 49 6e  CT qualifier. In
e910: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
e920: 20 74 65 73 74 73 20 77 68 65 74 68 65 72 20 6f   tests whether o
e930: 72 20 6e 6f 74 20 75 73 69 6e 67 20 74 68 69 73  r not using this
e940: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
e950: 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 67 75 61  e outer loop gua
e960: 72 61 6e 74 65 65 73 20 74 68 61 74 20 72 6f 77  rantees that row
e970: 73 20 77 69 74 68 20 65 71 75 61 6c 20 76 61 6c  s with equal val
e980: 75 65 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65  ues for.** all e
e990: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
e9a0: 65 20 70 44 69 73 74 69 6e 63 74 20 6c 69 73 74  e pDistinct list
e9b0: 20 61 72 65 20 64 65 6c 69 76 65 72 65 64 20 67   are delivered g
e9c0: 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e  rouped together.
e9d0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
e9e0: 6c 65 2c 20 74 68 65 20 71 75 65 72 79 20 0a 2a  le, the query .*
e9f0: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 44 49  *.**   SELECT DI
ea00: 53 54 49 4e 43 54 20 61 2c 20 62 2c 20 63 20 46  STINCT a, b, c F
ea10: 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20  ROM tbl WHERE a 
ea20: 3d 20 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65  = ?.**.** can be
ea30: 6e 65 66 69 74 20 66 72 6f 6d 20 61 6e 79 20 69  nefit from any i
ea40: 6e 64 65 78 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20  ndex on columns 
ea50: 22 62 22 20 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a  "b" and "c"..*/.
ea60: 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73  static int isDis
ea70: 74 69 6e 63 74 49 6e 64 65 78 28 0a 20 20 50 61  tinctIndex(.  Pa
ea80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eaa0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
eab0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
eac0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
ead0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
eae0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49  RE clause */.  I
eaf0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eb10: 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e  * The index bein
eb20: 67 20 63 6f 6e 73 69 64 65 72 65 64 20 2a 2f 0a  g considered */.
eb30: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
eb60: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
eb70: 20 70 49 64 78 20 69 73 20 6f 6e 20 2a 2f 0a 20   pIdx is on */. 
eb80: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
eb90: 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  inct,           
eba0: 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54   /* The DISTINCT
ebb0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
ebc0: 20 20 69 6e 74 20 6e 45 71 43 6f 6c 20 20 20 20    int nEqCol    
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
ebf0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74  ndex columns wit
ec00: 68 20 3d 3d 20 2a 2f 0a 29 7b 0a 20 20 42 69 74  h == */.){.  Bit
ec10: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 20 20  mask mask = 0;  
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec30: 4d 61 73 6b 20 6f 66 20 75 6e 61 63 63 6f 75 6e  Mask of unaccoun
ec40: 74 65 64 20 66 6f 72 20 70 44 69 73 74 69 6e 63  ted for pDistinc
ec50: 74 20 65 78 70 72 73 20 2a 2f 0a 20 20 69 6e 74  t exprs */.  int
ec60: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec80: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
ec90: 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
eca0: 70 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a  pDistinct!=0 );.
ecb0: 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d    if( pIdx->zNam
ecc0: 65 3d 3d 30 20 7c 7c 20 70 44 69 73 74 69 6e 63  e==0 || pDistinc
ecd0: 74 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20  t->nExpr>=BMS ) 
ece0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74  return 0;.  test
ecf0: 63 61 73 65 28 20 70 44 69 73 74 69 6e 63 74 2d  case( pDistinct-
ed00: 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b  >nExpr==BMS-1 );
ed10: 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
ed20: 75 67 68 20 61 6c 6c 20 74 68 65 20 65 78 70 72  ugh all the expr
ed30: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 64  essions in the d
ed40: 69 73 74 69 6e 63 74 20 6c 69 73 74 2e 20 49 66  istinct list. If
ed50: 20 61 6e 79 20 6f 66 20 74 68 65 6d 0a 20 20 2a   any of them.  *
ed60: 2a 20 61 72 65 20 6e 6f 74 20 73 69 6d 70 6c 65  * are not simple
ed70: 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63   column referenc
ed80: 65 73 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  es, return early
ed90: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 65 73  . Otherwise, tes
eda0: 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48  t if the.  ** WH
edb0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
edc0: 69 6e 73 20 61 20 22 63 6f 6c 3d 58 22 20 63 6c  ins a "col=X" cl
edd0: 61 75 73 65 2e 20 49 66 20 69 74 20 64 6f 65 73  ause. If it does
ede0: 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
edf0: 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e  .  ** can be ign
ee00: 6f 72 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73  ored. If it does
ee10: 20 6e 6f 74 2c 20 61 6e 64 20 74 68 65 20 63 6f   not, and the co
ee20: 6c 75 6d 6e 20 64 6f 65 73 20 6e 6f 74 20 62 65  lumn does not be
ee30: 6c 6f 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a  long to the.  **
ee40: 20 73 61 6d 65 20 74 61 62 6c 65 20 61 73 20 69   same table as i
ee50: 6e 64 65 78 20 70 49 64 78 2c 20 72 65 74 75 72  ndex pIdx, retur
ee60: 6e 20 65 61 72 6c 79 2e 20 46 69 6e 61 6c 6c 79  n early. Finally
ee70: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  , if there is no
ee80: 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20 22  .  ** matching "
ee90: 63 6f 6c 3d 58 22 20 65 78 70 72 65 73 73 69 6f  col=X" expressio
eea0: 6e 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e  n and the column
eeb0: 20 69 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20   is on the same 
eec0: 74 61 62 6c 65 20 61 73 20 70 49 64 78 2c 0a 20  table as pIdx,. 
eed0: 20 2a 2a 20 73 65 74 20 74 68 65 20 63 6f 72 72   ** set the corr
eee0: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
eef0: 20 76 61 72 69 61 62 6c 65 20 6d 61 73 6b 2e 0a   variable mask..
ef00: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
ef10: 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78  i<pDistinct->nEx
ef20: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 57 68  pr; i++){.    Wh
ef30: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
ef40: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
ef50: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
ef60: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
ef70: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
ef80: 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43   if( p->op!=TK_C
ef90: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
efa0: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69  ;.    pTerm = fi
efb0: 6e 64 54 65 72 6d 28 70 57 43 2c 20 70 2d 3e 69  ndTerm(pWC, p->i
efc0: 54 61 62 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75 6d  Table, p->iColum
efd0: 6e 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  n, ~(Bitmask)0, 
efe0: 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 20 20 69  WO_EQ, 0);.    i
eff0: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
f000: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
f010: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
f020: 20 43 6f 6c 6c 53 65 71 20 2a 70 31 20 3d 20 73   CollSeq *p1 = s
f030: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
f040: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
f050: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
f060: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
f070: 20 43 6f 6c 6c 53 65 71 20 2a 70 32 20 3d 20 73   CollSeq *p2 = s
f080: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
f090: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
f0a0: 20 20 20 20 69 66 28 20 70 31 3d 3d 70 32 20 29      if( p1==p2 )
f0b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
f0c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
f0d0: 6c 65 21 3d 62 61 73 65 20 29 20 72 65 74 75 72  le!=base ) retur
f0e0: 6e 20 30 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  n 0;.    mask |=
f0f0: 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c   (((Bitmask)1) <
f100: 3c 20 69 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  < i);.  }..  for
f110: 28 69 3d 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b 20  (i=nEqCol; mask 
f120: 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  && i<pIdx->nColu
f130: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  mn; i++){.    in
f140: 74 20 69 45 78 70 72 20 3d 20 66 69 6e 64 49 6e  t iExpr = findIn
f150: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
f160: 44 69 73 74 69 6e 63 74 2c 20 62 61 73 65 2c 20  Distinct, base, 
f170: 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 69 66  pIdx, i);.    if
f180: 28 20 69 45 78 70 72 3c 30 20 29 20 62 72 65 61  ( iExpr<0 ) brea
f190: 6b 3b 0a 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e  k;.    mask &= ~
f1a0: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c  (((Bitmask)1) <<
f1b0: 20 69 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20   iExpr);.  }..  
f1c0: 72 65 74 75 72 6e 20 28 6d 61 73 6b 3d 3d 30 29  return (mask==0)
f1d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
f1e0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44  rn true if the D
f1f0: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
f200: 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  on-list passed a
f210: 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
f220: 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e  ment.** is redun
f230: 64 61 6e 74 2e 20 41 20 44 49 53 54 49 4e 43 54  dant. A DISTINCT
f240: 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61   list is redunda
f250: 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61  nt if the databa
f260: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  se contains a.**
f270: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 74 68   UNIQUE index th
f280: 61 74 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  at guarantees th
f290: 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  at the result of
f2a0: 20 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c 20   the query will 
f2b0: 62 65 20 64 69 73 74 69 6e 63 74 0a 2a 2a 20 61  be distinct.** a
f2c0: 6e 79 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  nyway..*/.static
f2d0: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
f2e0: 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
f2f0: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 72 63  e *pParse,.  Src
f300: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 0a  List *pTabList,.
f310: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
f320: 57 43 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  WC,.  ExprList *
f330: 70 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20 54  pDistinct.){.  T
f340: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
f350: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
f360: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
f380: 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a  int iBase;..  /*
f390: 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72   If there is mor
f3a0: 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65  e than one table
f3b0: 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69   or sub-select i
f3c0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
f3d0: 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71  e of.  ** this q
f3e0: 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69  uery, then it wi
f3f0: 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
f400: 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20  le to show that 
f410: 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20  the DISTINCT .  
f420: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64  ** clause is red
f430: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  undant. */.  if(
f440: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21   pTabList->nSrc!
f450: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
f460: 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73   iBase = pTabLis
f470: 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  t->a[0].iCursor;
f480: 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69  .  pTab = pTabLi
f490: 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  st->a[0].pTab;..
f4a0: 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    /* If any of t
f4b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
f4c0: 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20  s an IPK column 
f4d0: 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20  on table iBase, 
f4e0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a  then return .  *
f4f0: 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68  * true. Note: Th
f500: 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  e (p->iTable==iB
f510: 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69  ase) part of thi
f520: 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61  s test may be fa
f530: 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  lse if the.  ** 
f540: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
f550: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
f560: 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  ub-query..  */. 
f570: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73   for(i=0; i<pDis
f580: 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  tinct->nExpr; i+
f590: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
f5a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
f5b0: 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e  pCollate(pDistin
f5c0: 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  ct->a[i].pExpr);
f5d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
f5e0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e  TK_COLUMN && p->
f5f0: 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26  iTable==iBase &&
f600: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20   p->iColumn<0 ) 
f610: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
f620: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
f630: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20   all indices on 
f640: 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b  the table, check
f650: 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65 20  ing each to see 
f660: 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a  if it makes.  **
f670: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75   the DISTINCT qu
f680: 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e  alifier redundan
f690: 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66  t. It does so if
f6a0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
f6b0: 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69 74   The index is it
f6c0: 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64  self UNIQUE, and
f6d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20  .  **.  **   2. 
f6e0: 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  All of the colum
f6f0: 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
f700: 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74 20  are either part 
f710: 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63 74  of the pDistinct
f720: 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c  .  **      list,
f730: 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48 45   or else the WHE
f740: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
f750: 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  ns a term of the
f760: 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20   form "col=X",. 
f770: 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20 58   **      where X
f780: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76   is a constant v
f790: 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74  alue. The collat
f7a0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66  ion sequences of
f7b0: 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63   the.  **      c
f7c0: 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65  omparison and se
f7d0: 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73  lect-list expres
f7e0: 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68  sions must match
f7f0: 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e   those of the in
f800: 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  dex..  **.  **  
f810: 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65   3. All of those
f820: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66   index columns f
f830: 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48 45  or which the WHE
f840: 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  RE clause does n
f850: 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e  ot.  **      con
f860: 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74  tain a "col=X" t
f870: 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20  erm are subject 
f880: 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  to a NOT NULL co
f890: 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20  nstraint..  */. 
f8a0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
f8b0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
f8c0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
f8d0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f  .    if( pIdx->o
f8e0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
f8f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
f900: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
f910: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
f920: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
f930: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
f940: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i];.      if( 0=
f950: 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69  =findTerm(pWC, i
f960: 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69  Base, iCol, ~(Bi
f970: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
f980: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
f990: 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66   int iIdxCol = f
f9a0: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72  indIndexCol(pPar
f9b0: 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69  se, pDistinct, i
f9c0: 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a  Base, pIdx, i);.
f9d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64 78          if( iIdx
f9e0: 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61  Col<0 || pTab->a
f9f0: 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75  Col[pIdx->aiColu
fa00: 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  mn[i]].notNull==
fa10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
fa20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
fa30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fa40: 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e    if( i==pIdx->n
fa50: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
fa60: 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d  /* This index im
fa70: 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44  plies that the D
fa80: 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65  ISTINCT qualifie
fa90: 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  r is redundant. 
faa0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
fab0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
fac0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
fad0: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75  ** Prepare a cru
fae0: 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  de estimate of t
faf0: 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  he logarithm of 
fb00: 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e  the input value.
fb10: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
fb20: 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63  need not be exac
fb30: 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  t.  This is only
fb40: 20 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61   used for estima
fb50: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61  ting.** the tota
fb60: 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72  l cost of perfor
fb70: 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  ming operations 
fb80: 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20  with O(logN) or 
fb90: 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70  O(NlogN).** comp
fba0: 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65  lexity.  Because
fbb0: 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65   N is just a gue
fbc0: 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65  ss, it is no gre
fbd0: 61 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a  at tragedy if.**
fbe0: 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c   logN is a littl
fbf0: 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  e off..*/.static
fc00: 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64   double estLog(d
fc10: 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62  ouble N){.  doub
fc20: 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64  le logN = 1;.  d
fc30: 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20  ouble x = 10;.  
fc40: 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20  while( N>x ){.  
fc50: 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20    logN += 1;.   
fc60: 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20   x *= 10;.  }.  
fc70: 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a  return logN;.}..
fc80: 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e  /*.** Two routin
fc90: 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  es for printing 
fca0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
fcb0: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
fcc0: 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  info.** structur
fcd0: 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73  e.  Used for tes
fce0: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
fcf0: 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69  ng only.  If nei
fd00: 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  ther.** SQLITE_T
fd10: 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  EST or SQLITE_DE
fd20: 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c  BUG are defined,
fd30: 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74   then these rout
fd40: 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f  ines.** are no-o
fd50: 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ps..*/.#if !defi
fd60: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fd70: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
fd80: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
fd90: 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
fda0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
fdb0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
fdc0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
fdd0: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
fde0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
fdf0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
fe00: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
fe10: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
fe20: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
fe30: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
fe40: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
fe50: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
fe60: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
fe70: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
fe80: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
fe90: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
fea0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
feb0: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
fec0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
fed0: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
fee0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
fef0: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
ff00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
ff10: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
ff20: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
ff30: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
ff40: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
ff50: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
ff60: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
ff70: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
ff80: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
ff90: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
ffa0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
ffb0: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
ffc0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
ffd0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
ffe0: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
fff0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
10000 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
10010 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
10020 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
10030 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
10040 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
10050 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
10060 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
10070 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
10080 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
10090 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
100a0 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
100b0 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
100c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
100d0 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
100e0 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
100f0 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
10100 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
10110 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
10120 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
10130 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
10140 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
10150 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
10160 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
10170 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
10180 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
10190 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
101a0 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c  atedCost);.}.#el
101b0 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
101c0 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
101d0 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
101e0 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
101f0 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69  if../* .** Requi
10200 72 65 64 20 62 65 63 61 75 73 65 20 62 65 73 74  red because best
10210 49 6e 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65  Index() is calle
10220 64 20 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73  d by bestOrClaus
10230 65 49 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61  eIndex() .*/.sta
10240 74 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64  tic void bestInd
10250 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78 2a  ex(WhereBestIdx*
10260 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  );../*.** This r
10270 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
10280 74 6f 20 66 69 6e 64 20 61 6e 20 73 63 61 6e 6e  to find an scann
10290 69 6e 67 20 73 74 72 61 74 65 67 79 20 74 68 61  ing strategy tha
102a0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a 2a  t can be used .*
102b0 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e  * to optimize an
102c0 20 27 4f 52 27 20 65 78 70 72 65 73 73 69 6f 6e   'OR' expression
102d0 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
102e0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
102f0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c   .**.** The tabl
10300 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
10310 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  h FROM clause te
10320 72 6d 20 70 53 72 63 20 6d 61 79 20 62 65 20 65  rm pSrc may be e
10330 69 74 68 65 72 20 61 0a 2a 2a 20 72 65 67 75 6c  ither a.** regul
10340 61 72 20 42 2d 54 72 65 65 20 74 61 62 6c 65 20  ar B-Tree table 
10350 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  or a virtual tab
10360 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
10370 69 64 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49  id bestOrClauseI
10380 6e 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64  ndex(WhereBestId
10390 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  x *p){.#ifndef S
103a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
103b0 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 57 68 65  TIMIZATION.  Whe
103c0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20  reClause *pWC = 
103d0 70 2d 3e 70 57 43 3b 20 20 20 20 20 20 20 20 20  p->pWC;         
103e0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
103f0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
10400 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
10410 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
10420 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
10430 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
10440 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  h */.  const int
10450 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43   iCur = pSrc->iC
10460 75 72 73 6f 72 3b 20 20 20 20 20 20 2f 2a 20 54  ursor;      /* T
10470 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
10480 20 74 61 62 6c 65 20 20 2a 2f 0a 20 20 63 6f 6e   table  */.  con
10490 73 74 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53  st Bitmask maskS
104a0 72 63 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43  rc = getMask(pWC
104b0 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->pMaskSet, iCur
104c0 29 3b 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66  );  /* Bitmask f
104d0 6f 72 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65  or pSrc */.  Whe
104e0 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
104f0 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
10500 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20 20  pWC->nTerm];    
10510 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
10520 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  C->a[] */.  Wher
10530 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
10560 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
10570 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54  lause */..  /* T
10580 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 6f 70 74  he OR-clause opt
10590 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 64 69 73  imization is dis
105a0 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20 49  allowed if the I
105b0 4e 44 45 58 45 44 20 42 59 20 6f 72 0a 20 20 2a  NDEXED BY or.  *
105c0 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  * NOT INDEXED cl
105d0 61 75 73 65 73 20 61 72 65 20 75 73 65 64 20 6f  auses are used o
105e0 72 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 41  r if the WHERE_A
105f0 4e 44 5f 4f 4e 4c 59 20 62 69 74 20 69 73 20 73  ND_ONLY bit is s
10600 65 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  et. */.  if( pSr
10610 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 7c 7c  c->notIndexed ||
10620 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 21 3d 30   pSrc->pIndex!=0
10630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
10640 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 77    }.  if( pWC->w
10650 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
10660 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_AND_ONLY ){.  
10670 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
10680 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 57   /* Search the W
10690 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
106a0 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20 57  s for a usable W
106b0 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  O_OR term. */.  
106c0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
106d0 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
106e0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
106f0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
10700 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a  tor & WO_OR)!=0.
10710 20 20 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d       && ((pTerm-
10720 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61  >prereqAll & ~ma
10730 73 6b 53 72 63 29 20 26 20 70 2d 3e 6e 6f 74 52  skSrc) & p->notR
10740 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 26 26  eady)==0.     &&
10750 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
10760 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
10770 6d 61 73 6b 53 72 63 29 21 3d 30 20 0a 20 20 20  maskSrc)!=0 .   
10780 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
10790 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
107a0 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
107b0 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
107c0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
107d0 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
107e0 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
107f0 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
10800 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
10810 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  m;.      int fla
10820 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs = WHERE_MULTI
10830 5f 4f 52 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  _OR;.      doubl
10840 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  e rTotal = 0;.  
10850 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 20      double nRow 
10860 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  = 0;.      Bitma
10870 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20  sk used = 0;.   
10880 20 20 20 57 68 65 72 65 42 65 73 74 49 64 78 20     WhereBestIdx 
10890 73 42 4f 49 3b 0a 0a 20 20 20 20 20 20 73 42 4f  sBOI;..      sBO
108a0 49 20 3d 20 2a 70 3b 0a 20 20 20 20 20 20 73 42  I = *p;.      sB
108b0 4f 49 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  OI.pOrderBy = 0;
108c0 0a 20 20 20 20 20 20 73 42 4f 49 2e 70 44 69 73  .      sBOI.pDis
108d0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
108e0 20 73 42 4f 49 2e 70 70 49 64 78 49 6e 66 6f 20   sBOI.ppIdxInfo 
108f0 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  = 0;.      for(p
10900 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b  OrTerm=pOrWC->a;
10910 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e   pOrTerm<pOrWCEn
10920 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  d; pOrTerm++){. 
10930 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
10940 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e  E(("... Multi-in
10950 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20 66  dex OR testing f
10960 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25 64  or term %d of %d
10970 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20  ....\n", .      
10980 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d 20 70      (pOrTerm - p
10990 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65 72 6d  OrWC->a), (pTerm
109a0 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20 20 20   - pWC->a).     
109b0 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20 69     ));.        i
109c0 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
109d0 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21  erator& WO_AND)!
109e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
109f0 73 42 4f 49 2e 70 57 43 20 3d 20 26 70 4f 72 54  sBOI.pWC = &pOrT
10a00 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d  erm->u.pAndInfo-
10a10 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >wc;.          b
10a20 65 73 74 49 6e 64 65 78 28 26 73 42 4f 49 29 3b  estIndex(&sBOI);
10a30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10a40 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
10a50 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
10a60 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43            WhereC
10a70 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
10a80 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
10a90 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
10aa0 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 74  rse;.          t
10ab0 65 6d 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d  empWC.pMaskSet =
10ac0 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a   pWC->pMaskSet;.
10ad0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
10ae0 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
10af0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
10b00 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
10b10 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
10b20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
10b30 20 20 20 20 20 74 65 6d 70 57 43 2e 77 63 74 72       tempWC.wctr
10b40 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  lFlags = 0;.    
10b50 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
10b60 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
10b70 20 20 73 42 4f 49 2e 70 57 43 20 3d 20 26 74 65    sBOI.pWC = &te
10b80 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20  mpWC;.          
10b90 62 65 73 74 49 6e 64 65 78 28 26 73 42 4f 49 29  bestIndex(&sBOI)
10ba0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10bb0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
10bc0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
10bd0 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d         rTotal +=
10be0 20 73 42 4f 49 2e 63 6f 73 74 2e 72 43 6f 73 74   sBOI.cost.rCost
10bf0 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b  ;.        nRow +
10c00 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 70 6c 61 6e  = sBOI.cost.plan
10c10 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 75  .nRow;.        u
10c20 73 65 64 20 7c 3d 20 73 42 4f 49 2e 63 6f 73 74  sed |= sBOI.cost
10c30 2e 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  .used;.        i
10c40 66 28 20 72 54 6f 74 61 6c 3e 3d 70 2d 3e 63 6f  f( rTotal>=p->co
10c50 73 74 2e 72 43 6f 73 74 20 29 20 62 72 65 61 6b  st.rCost ) break
10c60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
10c70 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
10c80 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
10c90 73 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  se, increase the
10ca0 20 73 63 61 6e 20 63 6f 73 74 20 74 6f 20 61 63   scan cost to ac
10cb0 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  count .      ** 
10cc0 66 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20  for the cost of 
10cd0 74 68 65 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20  the sort. */.   
10ce0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
10cf0 42 79 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By!=0 ){.       
10d00 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
10d10 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61  . sorting increa
10d20 73 65 73 20 4f 52 20 63 6f 73 74 20 25 2e 39 67  ses OR cost %.9g
10d30 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20   to %.9g\n",.   
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 72 54 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b   rTotal, rTotal+
10d60 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77  nRow*estLog(nRow
10d70 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 54 6f  )));.        rTo
10d80 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c  tal += nRow*estL
10d90 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  og(nRow);.      
10da0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
10db0 68 65 20 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e  he cost of scann
10dc0 69 6e 67 20 75 73 69 6e 67 20 74 68 69 73 20 4f  ing using this O
10dd0 52 20 74 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d  R term for optim
10de0 69 7a 61 74 69 6f 6e 20 69 73 0a 20 20 20 20 20  ization is.     
10df0 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68   ** less than th
10e00 65 20 63 75 72 72 65 6e 74 20 63 6f 73 74 20 73  e current cost s
10e10 74 6f 72 65 64 20 69 6e 20 70 43 6f 73 74 2c 20  tored in pCost, 
10e20 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  replace the cont
10e30 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ents.      ** of
10e40 20 70 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20   pCost. */.     
10e50 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
10e60 2e 20 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52  . multi-index OR
10e70 20 63 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d   cost=%.9g nrow=
10e80 25 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c  %.9g\n", rTotal,
10e90 20 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69   nRow));.      i
10ea0 66 28 20 72 54 6f 74 61 6c 3c 70 2d 3e 63 6f 73  f( rTotal<p->cos
10eb0 74 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  t.rCost ){.     
10ec0 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74     p->cost.rCost
10ed0 20 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20   = rTotal;.     
10ee0 20 20 20 70 2d 3e 63 6f 73 74 2e 75 73 65 64 20     p->cost.used 
10ef0 3d 20 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20  = used;.        
10f00 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f  p->cost.plan.nRo
10f10 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20  w = nRow;.      
10f20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e    p->cost.plan.n
10f30 4f 42 53 61 74 20 3d 20 70 2d 3e 69 20 3f 20 70  OBSat = p->i ? p
10f40 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
10f50 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3a 20 30  .plan.nOBSat : 0
10f60 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73  ;.        p->cos
10f70 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  t.plan.wsFlags =
10f80 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
10f90 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70  p->cost.plan.u.p
10fa0 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  Term = pTerm;.  
10fb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10fc0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10fd0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
10fe0 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e  ATION */.}..#ifn
10ff0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11000 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
11010 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
11020 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
11030 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
11040 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
11050 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
11060 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
11070 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
11080 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
11090 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
110a0 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
110b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
110c0 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
110d0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
110e0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
110f0 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
11100 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
11110 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
11120 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
11130 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
11140 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
11150 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
11160 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
11170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
11180 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
11190 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
111a0 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
111b0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
111c0 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
111d0 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
111e0 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
111f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
11200 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  EQ)==0 ) return 
11210 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
11220 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
11230 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
11240 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
11250 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
11260 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
11270 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
11280 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
11290 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
112a0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
112b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
112c0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
112d0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
112e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
112f0 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 49 66 20  _INDEX./*.** If 
11300 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66  the query plan f
11310 6f 72 20 70 53 72 63 20 73 70 65 63 69 66 69 65  or pSrc specifie
11320 64 20 69 6e 20 70 43 6f 73 74 20 69 73 20 61 20  d in pCost is a 
11330 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 0a  full table scan.
11340 2a 2a 20 61 6e 64 20 69 6e 64 65 78 69 6e 67 20  ** and indexing 
11350 69 73 20 61 6c 6c 6f 77 73 20 28 69 66 20 74 68  is allows (if th
11360 65 72 65 20 69 73 20 6e 6f 20 4e 4f 54 20 49 4e  ere is no NOT IN
11370 44 45 58 45 44 20 63 6c 61 75 73 65 29 20 61 6e  DEXED clause) an
11380 64 20 69 74 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  d it.** possible
11390 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
113a0 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
113b0 74 68 61 74 20 77 6f 75 6c 64 20 70 65 72 66 6f  that would perfo
113c0 72 6d 20 62 65 74 74 65 72 0a 2a 2a 20 74 68 61  rm better.** tha
113d0 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  n a full table s
113e0 63 61 6e 20 65 76 65 6e 20 77 68 65 6e 20 74 68  can even when th
113f0 65 20 63 6f 73 74 20 6f 66 20 63 6f 6e 73 74 72  e cost of constr
11400 75 63 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  ucting the index
11410 0a 2a 2a 20 69 73 20 74 61 6b 65 6e 20 69 6e 74  .** is taken int
11420 6f 20 61 63 63 6f 75 6e 74 2c 20 74 68 65 6e 20  o account, then 
11430 61 6c 74 65 72 20 74 68 65 20 71 75 65 72 79 20  alter the query 
11440 70 6c 61 6e 20 74 6f 20 75 73 65 20 74 68 65 0a  plan to use the.
11450 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
11460 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
11470 69 64 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63  id bestAutomatic
11480 49 6e 64 65 78 28 57 68 65 72 65 42 65 73 74 49  Index(WhereBestI
11490 64 78 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  dx *p){.  Parse 
114a0 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
114b0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
114c0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
114d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
114e0 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70  eClause *pWC = p
114f0 2d 3e 70 57 43 3b 20 20 20 20 20 20 20 20 20 20  ->pWC;          
11500 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
11510 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
11520 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
11530 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
11540 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
11550 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
11560 63 68 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e  ch */.  double n
11570 54 61 62 6c 65 52 6f 77 3b 20 20 20 20 20 20 20  TableRow;       
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11590 20 52 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 70   Rows in the inp
115a0 75 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 64 6f  ut table */.  do
115b0 75 62 6c 65 20 6c 6f 67 4e 3b 20 20 20 20 20 20  uble logN;      
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 20 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c      /* log(nTabl
115e0 65 52 6f 77 29 20 2a 2f 0a 20 20 64 6f 75 62 6c  eRow) */.  doubl
115f0 65 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 20 20  e costTempIdx;  
11600 20 20 20 20 20 20 20 2f 2a 20 70 65 72 2d 71 75         /* per-qu
11610 65 72 79 20 63 6f 73 74 20 6f 66 20 74 68 65 20  ery cost of the 
11620 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
11630 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
11640 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
11650 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
11660 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
11670 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
11680 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
11690 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
116a0 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54   pWC->a[] */.  T
116b0 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20  able *pTable;   
116c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
116d0 62 6c 65 20 74 68 74 20 6d 69 67 68 74 20 62 65  ble tht might be
116e0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 69   indexed */..  i
116f0 66 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  f( pParse->nQuer
11700 79 4c 6f 6f 70 3c 3d 28 64 6f 75 62 6c 65 29 31  yLoop<=(double)1
11710 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
11720 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
11730 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f  building an auto
11740 6d 61 74 69 63 20 69 6e 64 65 78 20 66 6f 72 20  matic index for 
11750 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 2a 2f  a single scan */
11760 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11770 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
11780 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
11790 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 3d 3d 30  TE_AutoIndex)==0
117a0 20 29 7b 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d   ){.    /* Autom
117b0 61 74 69 63 20 69 6e 64 69 63 65 73 20 61 72 65  atic indices are
117c0 20 64 69 73 61 62 6c 65 64 20 61 74 20 72 75 6e   disabled at run
117d0 2d 74 69 6d 65 20 2a 2f 0a 20 20 20 20 72 65 74  -time */.    ret
117e0 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  urn;.  }.  if( (
117f0 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46  p->cost.plan.wsF
11800 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
11810 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 0a 20 20  _FULLSCAN)!=0.  
11820 20 26 26 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61   && (p->cost.pla
11830 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
11840 45 5f 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30  E_COVER_SCAN)==0
11850 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  .  ){.    /* We 
11860 61 6c 72 65 61 64 79 20 68 61 76 65 20 73 6f 6d  already have som
11870 65 20 6b 69 6e 64 20 6f 66 20 69 6e 64 65 78 20  e kind of index 
11880 69 6e 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  in use for this 
11890 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 72 65  query. */.    re
118a0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
118b0 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69  pSrc->viaCorouti
118c0 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 6e  ne ){.    /* Can
118d0 6e 6f 74 20 69 6e 64 65 78 20 61 20 63 6f 2d 72  not index a co-r
118e0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 72 65  outine */.    re
118f0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
11900 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  pSrc->notIndexed
11910 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4e   ){.    /* The N
11920 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
11930 65 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  e appears in the
11940 20 53 51 4c 2e 20 2a 2f 0a 20 20 20 20 72 65 74   SQL. */.    ret
11950 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
11960 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  Src->isCorrelate
11970 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
11980 73 6f 75 72 63 65 20 69 73 20 61 20 63 6f 72 72  source is a corr
11990 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79  elated sub-query
119a0 2e 20 4e 6f 20 70 6f 69 6e 74 20 69 6e 20 69 6e  . No point in in
119b0 64 65 78 69 6e 67 20 69 74 2e 20 2a 2f 0a 20 20  dexing it. */.  
119c0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
119d0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
119e0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3e 3d 20 28  >nQueryLoop >= (
119f0 64 6f 75 62 6c 65 29 31 20 29 3b 0a 20 20 70 54  double)1 );.  pT
11a00 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
11a10 62 3b 0a 20 20 6e 54 61 62 6c 65 52 6f 77 20 3d  b;.  nTableRow =
11a20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74   pTable->nRowEst
11a30 3b 0a 20 20 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f  ;.  logN = estLo
11a40 67 28 6e 54 61 62 6c 65 52 6f 77 29 3b 0a 20 20  g(nTableRow);.  
11a50 63 6f 73 74 54 65 6d 70 49 64 78 20 3d 20 32 2a  costTempIdx = 2*
11a60 6c 6f 67 4e 2a 28 6e 54 61 62 6c 65 52 6f 77 2f  logN*(nTableRow/
11a70 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
11a80 6f 70 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 63  op + 1);.  if( c
11a90 6f 73 74 54 65 6d 70 49 64 78 3e 3d 70 2d 3e 63  ostTempIdx>=p->c
11aa0 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20  ost.rCost ){.   
11ab0 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
11ac0 63 72 65 61 74 69 6e 67 20 74 68 65 20 74 72 61  creating the tra
11ad0 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 77 6f 75  nsient table wou
11ae0 6c 64 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ld be greater th
11af0 61 6e 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  an.    ** doing 
11b00 74 68 65 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  the full table s
11b10 63 61 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  can */.    retur
11b20 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61  n;.  }..  /* Sea
11b30 72 63 68 20 66 6f 72 20 61 6e 79 20 65 71 75 61  rch for any equa
11b40 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
11b50 74 65 72 6d 20 2a 2f 0a 20 20 70 57 43 45 6e 64  term */.  pWCEnd
11b60 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
11b70 6e 54 65 72 6d 5d 3b 0a 20 20 66 6f 72 28 70 54  nTerm];.  for(pT
11b80 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
11b90 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
11ba0 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
11bb0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
11bc0 65 72 6d 2c 20 70 53 72 63 2c 20 70 2d 3e 6e 6f  erm, pSrc, p->no
11bd0 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
11be0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 61 75   WHERETRACE(("au
11bf0 74 6f 2d 69 6e 64 65 78 20 72 65 64 75 63 65 73  to-index reduces
11c00 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e 31 66 20   cost from %.1f 
11c10 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a 20 20 20 20  to %.1f\n",.    
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c30 70 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 2c 20 63  p->cost.rCost, c
11c40 6f 73 74 54 65 6d 70 49 64 78 29 29 3b 0a 20 20  ostTempIdx));.  
11c50 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f 73      p->cost.rCos
11c60 74 20 3d 20 63 6f 73 74 54 65 6d 70 49 64 78 3b  t = costTempIdx;
11c70 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70  .      p->cost.p
11c80 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20  lan.nRow = logN 
11c90 2b 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f  + 1;.      p->co
11ca0 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
11cb0 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  = WHERE_TEMP_IND
11cc0 45 58 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73  EX;.      p->cos
11cd0 74 2e 75 73 65 64 20 3d 20 70 54 65 72 6d 2d 3e  t.used = pTerm->
11ce0 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
11cf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11d00 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
11d10 66 69 6e 65 20 62 65 73 74 41 75 74 6f 6d 61 74  fine bestAutomat
11d20 69 63 49 6e 64 65 78 28 41 29 20 20 2f 2a 20 6e  icIndex(A)  /* n
11d30 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  o-op */.#endif /
11d40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
11d50 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
11d60 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
11d70 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
11d80 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e  _INDEX./*.** Gen
11d90 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f  erate code to co
11da0 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
11db0 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20  x object for an 
11dc0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
11dd0 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70  ** and to set up
11de0 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20   the WhereLevel 
11df0 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f  object pLevel so
11e00 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67   that the code g
11e10 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65  enerator.** make
11e20 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74  s use of the aut
11e30 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f  omatic index..*/
11e40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
11e50 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
11e60 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
11e70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
11e80 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
11e90 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11ea0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
11eb0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
11ec0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
11ed0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
11ee0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
11ef0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
11f00 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20  use term to get 
11f10 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a  the next index *
11f20 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
11f30 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
11f40 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
11f50 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
11f60 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
11f70 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
11f80 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
11f90 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65  ite new index he
11fa0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
11fb0 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
11fc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11fd0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
11fe0 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  he constructed i
11ff0 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
12000 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
12010 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
12020 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
12030 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
12040 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
12050 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  d;          /* E
12060 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
12070 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72  /* Byte of memor
120a0 79 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64  y needed for pId
120b0 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  x */.  Index *pI
120c0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
120d0 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
120e0 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
120f0 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
12100 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12120 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
12130 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
12140 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
12150 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
12160 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
12170 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
12180 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
12190 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
121a0 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
121b0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
121c0 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
121d0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
121e0 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyinfo;         
121f0 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
12200 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ion for the inde
12210 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64  x */   .  int ad
12220 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
12230 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
12240 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
12250 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
12260 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
12270 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
12280 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
12290 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
122a0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
122b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
122c0 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
122d0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
12300 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12320 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
12330 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
12340 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
12350 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
12360 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
12370 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
12380 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d  column */.  Bitm
12390 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20  ask idxCols;    
123a0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
123b0 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65  p of columns use
123c0 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a  d for indexing *
123d0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
123e0 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  aCols;          
123f0 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64  /* Bitmap of add
12400 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
12410 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  */..  /* Generat
12420 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f  e code to skip o
12430 76 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ver the creation
12440 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74   and initializat
12450 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
12460 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
12470 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  on 2nd and subse
12480 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73  quent iterations
12490 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f   of the loop. */
124a0 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
124b0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
124c0 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49 6e  v!=0 );.  addrIn
124d0 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  it = sqlite3Code
124e0 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 0a 20  Once(pParse);.. 
124f0 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
12500 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
12510 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64  that will be add
12520 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a  ed to the index.
12530 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f    ** and used to
12540 20 6d 61 74 63 68 20 57 48 45 52 45 20 63 6c 61   match WHERE cla
12550 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
12560 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30  */.  nColumn = 0
12570 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72  ;.  pTable = pSr
12580 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e  c->pTab;.  pWCEn
12590 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
125a0 3e 6e 54 65 72 6d 5d 3b 0a 20 20 69 64 78 43 6f  >nTerm];.  idxCo
125b0 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
125c0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
125d0 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
125e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
125f0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
12600 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
12610 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
12620 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
12630 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
12640 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
12650 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
12660 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42  ((Bitmask)1)<<(B
12670 4d 53 2d 31 29 20 3a 20 28 28 42 69 74 6d 61 73  MS-1) : ((Bitmas
12680 6b 29 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20  k)1)<<iCol;.    
12690 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
126a0 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
126b0 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
126c0 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
126d0 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
126e0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
126f0 20 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20    nColumn++;.   
12700 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
12710 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  cMask;.      }. 
12720 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
12730 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a  t( nColumn>0 );.
12740 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e    pLevel->plan.n
12750 45 71 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20  Eq = nColumn;.. 
12760 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
12770 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
12780 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
12790 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
127a0 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
127b0 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
127c0 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
127d0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
127e0 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
127f0 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
12800 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
12810 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
12820 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
12830 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
12840 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
12850 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
12860 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
12870 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
12880 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
12890 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
128a0 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
128b0 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
128c0 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
128d0 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
128e0 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
128f0 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
12900 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
12910 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
12920 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
12930 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
12940 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 28 28  & (~idxCols | ((
12950 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
12960 53 2d 31 29 29 29 3b 0a 20 20 6d 78 42 69 74 43  S-1)));.  mxBitC
12970 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43  ol = (pTable->nC
12980 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42  ol >= BMS-1) ? B
12990 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e  MS-1 : pTable->n
129a0 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28  Col;.  testcase(
129b0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
129c0 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
129d0 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
129e0 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
129f0 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
12a00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
12a10 65 78 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42  extraCols & (((B
12a20 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 20  itmask)1)<<i) ) 
12a30 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20  nColumn++;.  }. 
12a40 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
12a50 65 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ed & (((Bitmask)
12a60 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a  1)<<(BMS-1)) ){.
12a70 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70      nColumn += p
12a80 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
12a90 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 65  S + 1;.  }.  pLe
12aa0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
12ab0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
12ac0 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58  N_EQ | WHERE_IDX
12ad0 5f 4f 4e 4c 59 20 7c 20 57 4f 5f 45 51 3b 0a 0a  _ONLY | WO_EQ;..
12ae0 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
12af0 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
12b00 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69 73  to describe this
12b10 20 69 6e 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74   index */.  nByt
12b20 65 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65 78  e = sizeof(Index
12b30 29 3b 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43  );.  nByte += nC
12b40 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74  olumn*sizeof(int
12b50 29 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e  );     /* Index.
12b60 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42  aiColumn */.  nB
12b70 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73  yte += nColumn*s
12b80 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b 20 20 20  izeof(char*);   
12b90 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
12ba0 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43  */.  nByte += nC
12bb0 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
12bc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
12bd0 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
12be0 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 44 62  pIdx = sqlite3Db
12bf0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
12c00 65 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  e->db, nByte);. 
12c10 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
12c20 65 74 75 72 6e 3b 0a 20 20 70 4c 65 76 65 6c 2d  eturn;.  pLevel-
12c30 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70  >plan.u.pIdx = p
12c40 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43  Idx;.  pIdx->azC
12c50 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70  oll = (char**)&p
12c60 49 64 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e  Idx[1];.  pIdx->
12c70 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a  aiColumn = (int*
12c80 29 26 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e  )&pIdx->azColl[n
12c90 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d  Column];.  pIdx-
12ca0 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
12cb0 38 2a 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75  8*)&pIdx->aiColu
12cc0 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70  mn[nColumn];.  p
12cd0 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75  Idx->zName = "au
12ce0 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64  to-index";.  pId
12cf0 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f  x->nColumn = nCo
12d00 6c 75 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54  lumn;.  pIdx->pT
12d10 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  able = pTable;. 
12d20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c   n = 0;.  idxCol
12d30 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
12d40 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
12d50 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
12d60 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43  ){.    if( termC
12d70 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
12d80 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
12d90 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
12da0 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
12db0 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
12dc0 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
12dd0 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28   = iCol>=BMS ? (
12de0 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
12df0 53 2d 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b  S-1) : ((Bitmask
12e00 29 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20  )1)<<iCol;.     
12e10 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
12e20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
12e30 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20       Expr *pX = 
12e40 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
12e50 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
12e60 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20   cMask;.        
12e70 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
12e80 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ] = pTerm->u.lef
12e90 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
12ea0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
12eb0 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
12ec0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
12ed0 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
12ee0 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ht);.        pId
12ef0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41  x->azColl[n] = A
12f00 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70  LWAYS(pColl) ? p
12f10 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42  Coll->zName : "B
12f20 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20  INARY";.        
12f30 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
12f40 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
12f50 20 28 75 33 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d   (u32)n==pLevel-
12f60 3e 70 6c 61 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20  >plan.nEq );..  
12f70 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61  /* Add additiona
12f80 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
12f90 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74   to make the aut
12fa0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74  omatic index int
12fb0 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e  o.  ** a coverin
12fc0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72  g index */.  for
12fd0 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
12fe0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
12ff0 65 78 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42  extraCols & (((B
13000 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 7b  itmask)1)<<i) ){
13010 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
13020 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
13030 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
13040 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
13050 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
13060 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
13070 3e 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69  >colUsed & (((Bi
13080 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
13090 29 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  )) ){.    for(i=
130a0 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d  BMS-1; i<pTable-
130b0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
130c0 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
130d0 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
130e0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
130f0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
13100 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
13110 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43  .  assert( n==nC
13120 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43  olumn );..  /* C
13130 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
13140 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  tic index */.  p
13150 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65  Keyinfo = sqlite
13160 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
13170 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61  arse, pIdx);.  a
13180 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
13190 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 73  IdxCur>=0 );.  s
131a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
131b0 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
131c0 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
131d0 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31  dxCur, nColumn+1
131e0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
131f0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
13200 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyinfo, P4_KEY
13210 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
13220 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13230 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c   "for %s", pTabl
13240 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f  e->zName));..  /
13250 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d  * Fill the autom
13260 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68 20  atic index with 
13270 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64  content */.  add
13280 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
13290 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
132a0 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  ewind, pLevel->i
132b0 54 61 62 43 75 72 29 3b 0a 20 20 72 65 67 52 65  TabCur);.  regRe
132c0 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
132d0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
132e0 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ;.  sqlite3Gener
132f0 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
13300 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c  se, pIdx, pLevel
13310 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65  ->iTabCur, regRe
13320 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69  cord, 1);.  sqli
13330 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13340 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
13350 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
13360 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
13370 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
13380 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
13390 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
133a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
133b0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76  v, OP_Next, pLev
133c0 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64  el->iTabCur, add
133d0 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74  rTop+1);.  sqlit
133e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
133f0 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
13400 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a  TUS_AUTOINDEX);.
13410 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13420 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
13430 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
13440 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
13450 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
13460 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65   .  /* Jump here
13470 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74   when skipping t
13480 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
13490 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  n */.  sqlite3Vd
134a0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
134b0 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69  drInit);.}.#endi
134c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
134d0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
134e0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
134f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13500 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
13510 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
13520 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
13530 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
13540 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
13550 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
13560 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
13570 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
13580 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
13590 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
135a0 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
135b0 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
135c0 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
135d0 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
135e0 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
135f0 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
13600 6e 64 65 78 49 6e 66 6f 28 57 68 65 72 65 42 65  ndexInfo(WhereBe
13610 73 74 49 64 78 20 2a 70 29 7b 0a 20 20 50 61 72  stIdx *p){.  Par
13620 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
13630 70 50 61 72 73 65 3b 20 0a 20 20 57 68 65 72 65  pParse; .  Where
13640 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d  Clause *pWC = p-
13650 3e 70 57 43 3b 0a 20 20 73 74 72 75 63 74 20 53  >pWC;.  struct S
13660 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
13670 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 45  c = p->pSrc;.  E
13680 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
13690 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
136a0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
136b0 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75  nt nTerm;.  stru
136c0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
136d0 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
136e0 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
136f0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
13700 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
13710 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
13720 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
13730 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
13740 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
13750 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   *pTerm;.  int n
13760 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74  OrderBy;.  sqlit
13770 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
13780 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52  IdxInfo;..  WHER
13790 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75  ETRACE(("Recompu
137a0 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20  ting index info 
137b0 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53  for %s...\n", pS
137c0 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  rc->pTab->zName)
137d0 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
137e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
137f0 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
13800 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
13810 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
13820 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
13830 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
13840 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
13850 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
13860 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
13870 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
13880 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
13890 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
138a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
138b0 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
138c0 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
138d0 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
138e0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
138f0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13900 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
13910 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
13920 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
13930 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
13940 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
13950 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
13960 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
13970 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
13980 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
13990 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
139a0 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     nTerm++;.  }.
139b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
139c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
139d0 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
139e0 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
139f0 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  t .  ** virtual 
13a00 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
13a10 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
13a20 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
13a30 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
13a40 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
13a50 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
13a60 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
13a70 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
13a80 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72  .    int n = pOr
13a90 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
13aa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
13ab0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
13ac0 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
13ad0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
13ae0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
13af0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
13b00 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
13b10 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
13b20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13b30 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20    if( i==n){.   
13b40 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b     nOrderBy = n;
13b50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13b60 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
13b70 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13b80 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
13b90 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
13ba0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
13bb0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
13bc0 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
13bf0 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
13c00 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
13c10 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
13c40 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
13c50 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
13c60 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
13c70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13c80 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
13c90 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20  emory");.    /* 
13ca0 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73  (double)0 In cas
13cb0 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
13cc0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e  _FLOATING_POINT.
13cd0 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  .. */.    return
13ce0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   0;.  }..  /* In
13cf0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72  itialize the str
13d00 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c  ucture.  The sql
13d10 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13d20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
13d30 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65  ns.  ** many fie
13d40 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63  lds that are dec
13d50 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f  lared "const" to
13d60 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e   prevent xBestIn
13d70 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68  dex from.  ** ch
13d80 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65  anging them.  We
13d90 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
13da0 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69   funky casting i
13db0 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
13dc0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65  initialize those
13dd0 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20   fields..  */.  
13de0 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75  pIdxCons = (stru
13df0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13e00 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49  _constraint*)&pI
13e10 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64  dxInfo[1];.  pId
13e20 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75  xOrderBy = (stru
13e30 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13e40 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43  _orderby*)&pIdxC
13e50 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55  ons[nTerm];.  pU
13e60 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73  sage = (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 5f 75 73 61 67 65 2a 29 26  straint_usage*)&
13e90 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64  pIdxOrderBy[nOrd
13ea0 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29  erBy];.  *(int*)
13eb0 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  &pIdxInfo->nCons
13ec0 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a  traint = nTerm;.
13ed0 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
13ee0 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
13ef0 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
13f00 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
13f10 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
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 20 3d 20 70 49 64 78 43 6f 6e 73  raint = pIdxCons
13f40 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
13f50 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
13f60 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  by**)&pIdxInfo->
13f70 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f  aOrderBy = pIdxO
13f80 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
13f90 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13fa0 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
13fb0 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  e**)&pIdxInfo->a
13fc0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20  ConstraintUsage 
13fd0 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20       pUsage;..  
14020 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
14030 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
14040 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
14050 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b  m++){.    u8 op;
14060 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
14070 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
14080 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
14090 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
140a0 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
140b0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
140c0 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
140d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
140e0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
140f0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
14100 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
14110 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
14120 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66  ISNULL );.    if
14130 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
14140 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29  or & (WO_ISNULL)
14150 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14160 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
14170 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
14180 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14190 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
141a0 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
141b0 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
141c0 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
141d0 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
141e0 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d   op = (u8)pTerm-
141f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
14200 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  ALL;.    if( op=
14210 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f  =WO_IN ) op = WO
14220 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  _EQ;.    pIdxCon
14230 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20  s[j].op = op;.  
14240 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20    /* The direct 
14250 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68  assignment in th
14260 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20  e previous line 
14270 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79  is possible only
14280 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
14290 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49  the WO_ and SQLI
142a0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
142b0 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69  INT_ codes are i
142c0 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  dentical.  The. 
142d0 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
142e0 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74  asserts verify t
142f0 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20  his fact. */.   
14300 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d   assert( WO_EQ==
14310 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
14320 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20  STRAINT_EQ );.  
14330 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d    assert( WO_LT=
14340 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
14350 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20  NSTRAINT_LT );. 
14360 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45     assert( WO_LE
14370 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14380 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a  ONSTRAINT_LE );.
14390 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
143a0 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
143b0 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b  CONSTRAINT_GT );
143c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
143d0 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
143e0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
143f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
14400 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49  _MATCH==SQLITE_I
14410 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
14420 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73  MATCH );.    ass
14430 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
14440 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
14450 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
14460 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
14470 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b  MATCH) );.    j+
14480 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
14490 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
144a0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
144b0 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
144c0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
144d0 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
144e0 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
144f0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
14500 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
14510 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
14520 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
14530 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
14540 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
14550 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
14560 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
14570 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
14580 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
14590 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
145a0 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
145b0 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
145c0 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
145d0 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
145e0 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
145f0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
14600 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
14610 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69  3_index_info poi
14620 6e 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61  nter passed.** a
14630 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  s the argument..
14640 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
14650 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
14660 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
14670 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
14680 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
14690 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
146a0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
146b0 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
146c0 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
146d0 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
146e0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
146f0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
14700 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
14710 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
14720 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
14730 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
14740 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
14750 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
14760 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
14770 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
14780 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
14790 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
147a0 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
147b0 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
147c0 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
147d0 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
147e0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
147f0 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
14800 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
14810 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
14820 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
14830 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
14840 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
14850 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
14860 63 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45  c;..  WHERETRACE
14870 28 28 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f  (("xBestIndex fo
14880 72 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a  r %s\n", pTab->z
14890 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45 5f  Name));.  TRACE_
148a0 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20  IDX_INPUTS(p);. 
148b0 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
148c0 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78  dule->xBestIndex
148d0 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52  (pVtab, p);.  TR
148e0 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
148f0 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  p);..  if( rc!=S
14900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14910 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
14920 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50  OMEM ){.      pP
14930 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
14940 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
14950 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62  }else if( !pVtab
14960 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
14970 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14980 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
14990 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
149a0 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
149b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
149c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
149d0 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  s", pVtab->zErrM
149e0 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  sg);.    }.  }. 
149f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
14a00 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
14a10 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
14a20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
14a30 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
14a40 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
14a50 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74   !p->aConstraint
14a60 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d  [i].usable && p-
14a70 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
14a80 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
14a90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14aa0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14ab0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61  , .          "ta
14ac0 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64  ble %s: xBestInd
14ad0 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69  ex returned an i
14ae0 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54  nvalid plan", pT
14af0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14b00 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
14b10 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a  pParse->nErr;.}.
14b20 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
14b30 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66  the best index f
14b40 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  or a virtual tab
14b50 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65  le..**.** The be
14b60 73 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70  st index is comp
14b70 75 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73  uted by the xBes
14b80 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66  tIndex method of
14b90 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20   the virtual.** 
14ba0 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54  table module.  T
14bb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
14bc0 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61  eally just a wra
14bd0 70 70 65 72 20 74 68 61 74 20 73 65 74 73 20 75  pper that sets u
14be0 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  p.** the sqlite3
14bf0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
14c00 63 74 75 72 65 20 74 68 61 74 20 69 73 20 75 73  cture that is us
14c10 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74  ed to communicat
14c20 65 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49  e with.** xBestI
14c30 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  ndex..**.** In a
14c40 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74   join, this rout
14c50 69 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c  ine might be cal
14c60 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  led multiple tim
14c70 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61  es for the.** sa
14c80 6d 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  me virtual table
14c90 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
14ca0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
14cb0 75 72 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ure is created.*
14cc0 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
14cd0 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  d on the first i
14ce0 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65  nvocation and re
14cf0 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73  used on all subs
14d00 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61  equent.** invoca
14d10 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69  tions.  The sqli
14d20 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
14d30 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f  tructure is also
14d40 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f   used when.** co
14d50 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
14d60 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 69  to access the vi
14d70 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
14d80 65 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74  e whereInfoDelet
14d90 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  e() .** routine 
14da0 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72  takes care of fr
14db0 65 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  eeing the sqlite
14dc0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
14dd0 75 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20  ucture after.** 
14de0 65 76 65 72 79 62 6f 64 79 20 68 61 73 20 66 69  everybody has fi
14df0 6e 69 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a  nished with it..
14e00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
14e10 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
14e20 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29  WhereBestIdx *p)
14e30 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
14e40 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20 20  e = p->pParse;  
14e50 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
14e60 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14e70 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
14e80 20 3d 20 70 2d 3e 70 57 43 3b 20 20 20 20 20 20   = p->pWC;      
14e90 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
14ea0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
14eb0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
14ec0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 2f 2a  rc = p->pSrc; /*
14ed0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
14ee0 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
14ef0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
14f00 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
14f10 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14f20 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
14f30 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
14f40 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
14f50 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
14f60 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14f70 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
14f80 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
14f90 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
14fa0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
14fb0 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  nt nOrderBy;.  i
14fc0 6e 74 20 62 41 6c 6c 6f 77 49 4e 3b 20 20 20 20  nt bAllowIN;    
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14fe0 2a 20 41 6c 6c 6f 77 20 49 4e 20 6f 70 74 69 6d  * Allow IN optim
14ff0 69 7a 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 64 6f  izations */.  do
15000 75 62 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f  uble rCost;..  /
15010 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c  * Make sure wsFl
15020 61 67 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ags is initializ
15030 65 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20  ed to some sane 
15040 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65  value. Otherwise
15050 2c 20 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d  , if the .  ** m
15060 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74  alloc in allocat
15070 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69  eIndexInfo() fai
15080 6c 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ls and this func
15090 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61  tion returns lea
150a0 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67  ving.  ** wsFlag
150b0 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61  s in an uninitia
150c0 6c 69 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65  lized state, the
150d0 20 63 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61   caller may beha
150e0 76 65 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79  ve unpredictably
150f0 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
15100 26 70 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69 7a  &p->cost, 0, siz
15110 65 6f 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a 20  eof(p->cost));. 
15120 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73   p->cost.plan.ws
15130 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
15140 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f  RTUALTABLE;..  /
15150 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33  * If the sqlite3
15160 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
15170 63 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65  cture has not be
15180 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  en previously.  
15190 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
151a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68   initialized, th
151b0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  en allocate and 
151c0 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f  initialize it no
151d0 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  w..  */.  pIdxIn
151e0 66 6f 20 3d 20 2a 70 2d 3e 70 70 49 64 78 49 6e  fo = *p->ppIdxIn
151f0 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  fo;.  if( pIdxIn
15200 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 2d  fo==0 ){.    *p-
15210 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64  >ppIdxInfo = pId
15220 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
15230 49 6e 64 65 78 49 6e 66 6f 28 70 29 3b 0a 20 20  IndexInfo(p);.  
15240 7d 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  }.  if( pIdxInfo
15250 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
15260 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  n;.  }..  /* At 
15270 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
15280 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
15290 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
152a0 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74  t pIdxInfo point
152b0 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68  s.  ** to will h
152c0 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ave been initial
152d0 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75 72  ized, either dur
152e0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
152f0 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20  invocation or.  
15300 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70  ** during some p
15310 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  rior invocation.
15320 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61    Now we just ha
15330 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20  ve to customize 
15340 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73  the.  ** details
15350 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72   of pIdxInfo for
15360 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76   the current inv
15370 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73  ocation and pass
15380 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73   it to.  ** xBes
15390 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20  tIndex..  */..  
153a0 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61  /* The module na
153b0 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  me must be defin
153c0 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69  ed. Also, by thi
153d0 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75  s point there mu
153e0 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69  st.  ** be a poi
153f0 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
15400 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
15410 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a  e. Otherwise.  *
15420 2a 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  * sqlite3ViewGet
15430 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f  ColumnNames() wo
15440 75 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64 20  uld have picked 
15450 75 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20  up the error. . 
15460 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
15470 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20  ab->azModuleArg 
15480 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  && pTab->azModul
15490 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73  eArg[0] );.  ass
154a0 65 72 74 28 20 73 71 6c 69 74 65 33 47 65 74 56  ert( sqlite3GetV
154b0 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
154c0 2c 20 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a  , pTab) );..  /*
154d0 20 54 72 79 20 6f 6e 63 65 20 6f 72 20 74 77 69   Try once or twi
154e0 63 65 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  ce.  On the firs
154f0 74 20 61 74 74 65 6d 70 74 2c 20 61 6c 6c 6f 77  t attempt, allow
15500 20 49 4e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   IN optimization
15510 73 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 20 49 4e  s..  ** If an IN
15520 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
15530 20 61 63 63 65 70 74 65 64 20 62 79 20 74 68 65   accepted by the
15540 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78   virtual table x
15550 42 65 73 74 49 6e 64 65 78 0a 20 20 2a 2a 20 6d  BestIndex.  ** m
15560 65 74 68 6f 64 2c 20 62 75 74 20 74 68 65 20 20  ethod, but the  
15570 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  pInfo->aConstrai
15580 6e 55 73 61 67 65 2e 6f 6d 69 74 20 66 6c 61 67  nUsage.omit flag
15590 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
155a0 6e 0a 20 20 2a 2a 20 74 68 65 20 71 75 65 72 79  n.  ** the query
155b0 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 62   will not work b
155c0 65 63 61 75 73 65 20 69 74 20 6d 69 67 68 74 20  ecause it might 
155d0 61 6c 6c 6f 77 20 64 75 70 6c 69 63 61 74 65 20  allow duplicate 
155e0 72 6f 77 73 20 69 6e 0a 20 20 2a 2a 20 6f 75 74  rows in.  ** out
155f0 70 75 74 2e 20 20 49 6e 20 74 68 61 74 20 63 61  put.  In that ca
15600 73 65 2c 20 72 75 6e 20 74 68 65 20 78 42 65 73  se, run the xBes
15610 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 20  tIndex method a 
15620 73 65 63 6f 6e 64 20 74 69 6d 65 0a 20 20 2a 2a  second time.  **
15630 20 77 69 74 68 6f 75 74 20 74 68 65 20 49 4e 20   without the IN 
15640 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 55 73  constraints.  Us
15650 75 61 6c 6c 79 20 74 68 69 73 20 6c 6f 6f 70 20  ually this loop 
15660 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
15670 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 77 69    ** The loop wi
15680 6c 6c 20 65 78 69 74 20 75 73 69 6e 67 20 61 20  ll exit using a 
15690 22 62 72 65 61 6b 22 20 73 74 61 74 65 6d 65 6e  "break" statemen
156a0 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 62 41  t..  */.  for(bA
156b0 6c 6c 6f 77 49 4e 3d 31 3b 20 31 3b 20 62 41 6c  llowIN=1; 1; bAl
156c0 6c 6f 77 49 4e 2d 2d 29 7b 0a 20 20 20 20 61 73  lowIN--){.    as
156d0 73 65 72 74 28 20 62 41 6c 6c 6f 77 49 4e 3d 3d  sert( bAllowIN==
156e0 30 20 7c 7c 20 62 41 6c 6c 6f 77 49 4e 3d 3d 31  0 || bAllowIN==1
156f0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   );..    /* Set 
15700 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  the aConstraint[
15710 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20  ].usable fields 
15720 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
15730 6c 6c 20 0a 20 20 20 20 2a 2a 20 6f 75 74 70 75  ll .    ** outpu
15740 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a  t variables to z
15750 65 72 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ero..    **.    
15760 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  ** aConstraint[]
15770 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75 65 20  .usable is true 
15780 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
15790 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
157a0 68 61 6e 64 0a 20 20 20 20 2a 2a 20 73 69 64 65  hand.    ** side
157b0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72   contains only r
157c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
157d0 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
157e0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
157f0 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e     ** table.  In
15800 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
15810 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
15820 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
15830 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
15840 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d          column =
15850 20 65 78 70 72 0a 20 20 20 20 2a 2a 0a 20 20 20   expr.    **.   
15860 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65   ** and we are e
15870 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e  valuating a join
15880 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
15890 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20  raint on column 
158a0 69 73 20 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20  is .    ** only 
158b0 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62  valid if all tab
158c0 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 69  les referenced i
158d0 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20  n expr occur to 
158e0 74 68 65 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  the left.    ** 
158f0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e  of the table con
15900 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a  taining column..
15910 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
15920 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d  e aConstraints[]
15930 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
15940 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
15950 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
15960 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
15970 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77  t table.  That w
15980 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20  ay we only have 
15990 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e  to compute it on
159a0 63 65 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 74  ce.    ** even t
159b0 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74  hough we might t
159c0 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62  ry to pick the b
159d0 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70  est index multip
159e0 6c 65 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2a  le times..    **
159f0 20 46 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70   For each attemp
15a00 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20  t at picking an 
15a10 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72  index, the order
15a20 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
15a30 65 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69  e.    ** join mi
15a40 67 68 74 20 62 65 20 64 69 66 66 65 72 65 6e 74  ght be different
15a50 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72   so we have to r
15a60 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61  ecompute the usa
15a70 62 6c 65 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ble flag.    ** 
15a80 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 2a  each time..    *
15a90 2f 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  /.    pIdxCons =
15aa0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
15ab0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
15ac0 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
15ad0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
15ae0 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
15af0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
15b00 73 61 67 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  sage;.    for(i=
15b10 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
15b20 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
15b30 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
15b40 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
15b50 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
15b60 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
15b70 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  C->a[j];.      i
15b80 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
15b90 71 52 69 67 68 74 26 70 2d 3e 6e 6f 74 52 65 61  qRight&p->notRea
15ba0 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  dy)==0.       &&
15bb0 20 28 62 41 6c 6c 6f 77 49 4e 20 7c 7c 20 28 70   (bAllowIN || (p
15bc0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
15bd0 26 20 57 4f 5f 49 4e 29 3d 3d 30 29 0a 20 20 20  & WO_IN)==0).   
15be0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49     ){.        pI
15bf0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
15c00 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
15c10 0a 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e  .        pIdxCon
15c20 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
15c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15c40 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
15c50 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
15c60 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e  [0])*pIdxInfo->n
15c70 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
15c80 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
15c90 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
15ca0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15cb0 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
15cc0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20  idxStr);.    }. 
15cd0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
15ce0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
15cf0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
15d00 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
15d10 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
15d20 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
15d30 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
15d40 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  umed = 0;.    /*
15d50 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49 6e 20   ((double)2) In 
15d60 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  case of SQLITE_O
15d70 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
15d80 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 70 49 64  NT... */.    pId
15d90 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
15da0 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
15db0 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65  G_DBL / ((double
15dc0 29 32 29 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42  )2);.    nOrderB
15dd0 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  y = pIdxInfo->nO
15de0 72 64 65 72 42 79 3b 0a 20 20 20 20 69 66 28 20  rderBy;.    if( 
15df0 21 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  !p->pOrderBy ){.
15e00 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
15e10 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
15e20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 76    }.  .    if( v
15e30 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61  tabBestIndex(pPa
15e40 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49  rse, pTab, pIdxI
15e50 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65  nfo) ){.      re
15e60 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  turn;.    }.  . 
15e70 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28     pIdxCons = *(
15e80 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
15e90 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
15ea0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
15eb0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f  nstraint;.    fo
15ec0 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
15ed0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
15ee0 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
15ef0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 55 73 61  {.      if( pUsa
15f00 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
15f10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
15f20 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
15f30 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
15f40 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
15f50 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63  j];.        p->c
15f60 6f 73 74 2e 75 73 65 64 20 7c 3d 20 70 54 65 72  ost.used |= pTer
15f70 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
15f80 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
15f90 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15fa0 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
15fb0 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67         if( pUsag
15fc0 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a  e[i].omit==0 ){.
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
15fe0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
15ff0 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74   use an IN const
16000 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72  raint if the vir
16010 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20  tual table.     
16020 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74         ** says t
16030 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65  hat the equivale
16040 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74  nt EQ constraint
16050 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c   cannot be safel
16060 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20  y omitted..     
16070 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20         ** If we 
16080 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  do attempt to us
16090 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61  e such a constra
160a0 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d  int, some rows m
160b0 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20  ight be.        
160c0 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20      ** repeated 
160d0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a  in the output. *
160e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  /.            br
160f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
16100 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
16110 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
16120 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
16130 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73  d by an IN claus
16140 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20  e may not.      
16150 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74      ** consume t
16160 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
16170 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74  se because (1) t
16180 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74  he order of IN t
16190 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a  erms.          *
161a0 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  * is not necessa
161b0 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
161c0 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74  the order of out
161d0 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20  put terms and.  
161e0 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d          ** (2) M
161f0 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20  ultiple outputs 
16200 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e  from a single IN
16210 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
16220 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20  merge.          
16230 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f  ** together.  */
16240 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49  .          pIdxI
16250 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
16260 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  umed = 0;.      
16270 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16280 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64  }.    if( i>=pId
16290 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
162a0 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  nt ) break;.  }.
162b0 0a 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 42  .  /* The orderB
162c0 79 43 6f 6e 73 75 6d 65 64 20 73 69 67 6e 61 6c  yConsumed signal
162d0 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69   is only valid i
162e0 66 20 61 6c 6c 20 6f 75 74 65 72 20 6c 6f 6f 70  f all outer loop
162f0 73 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 0a 20  s collectively. 
16300 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 6a 75 73   ** generate jus
16310 74 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  t a single row o
16320 66 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  f output..  */. 
16330 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6f   if( pIdxInfo->o
16340 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 29  rderByConsumed )
16350 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
16360 3c 70 2d 3e 69 3b 20 69 2b 2b 29 7b 0a 20 20 20  <p->i; i++){.   
16370 20 20 20 69 66 28 20 28 70 2d 3e 61 4c 65 76 65     if( (p->aLeve
16380 6c 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  l[i].plan.wsFlag
16390 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
163a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
163b0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
163c0 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
163d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
163e0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  .  .  /* If ther
163f0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
16400 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65   clause, and the
16410 20 73 65 6c 65 63 74 65 64 20 76 69 72 74 75 61   selected virtua
16420 6c 20 74 61 62 6c 65 20 69 6e 64 65 78 0a 20 20  l table index.  
16430 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69  ** does not sati
16440 73 66 79 20 69 74 2c 20 69 6e 63 72 65 61 73 65  sfy it, increase
16450 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
16460 20 73 63 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c   scan accordingl
16470 79 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74  y. This.  ** mat
16480 63 68 65 73 20 74 68 65 20 70 72 6f 63 65 73 73  ches the process
16490 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74  ing for non-virt
164a0 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20 62 65  ual tables in be
164b0 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 2e 0a  stBtreeIndex()..
164c0 20 20 2a 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70    */.  rCost = p
164d0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
164e0 65 64 43 6f 73 74 3b 0a 20 20 69 66 28 20 70 2d  edCost;.  if( p-
164f0 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 49 64  >pOrderBy && pId
16500 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
16510 6e 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nsumed==0 ){.   
16520 20 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67   rCost += estLog
16530 28 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20  (rCost)*rCost;. 
16540 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73   }..  /* The cos
16550 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  t is not allowed
16560 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68   to be larger th
16570 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  an SQLITE_BIG_DB
16580 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74  L (the.  ** init
16590 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65  al value of lowe
165a0 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20 6c  stCost in this l
165b0 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20 74  oop. If it is, t
165c0 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f  hen the.  ** (co
165d0 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74  st<lowestCost) t
165e0 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  est below will n
165f0 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20 20  ever be true..  
16600 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22 28 64  ** .  ** Use "(d
16610 6f 75 62 6c 65 29 32 22 20 69 6e 73 74 65 61 64  ouble)2" instead
16620 20 6f 66 20 22 32 2e 30 22 20 69 6e 20 63 61 73   of "2.0" in cas
16630 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  e OMIT_FLOATING_
16640 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64  POINT .  ** is d
16650 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  efined..  */.  i
16660 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44  f( (SQLITE_BIG_D
16670 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3c  BL/((double)2))<
16680 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  rCost ){.    p->
16690 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 28 53 51  cost.rCost = (SQ
166a0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64  LITE_BIG_DBL/((d
166b0 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c  ouble)2));.  }el
166c0 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e  se{.    p->cost.
166d0 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20  rCost = rCost;. 
166e0 20 7d 0a 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61   }.  p->cost.pla
166f0 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d 20 70  n.u.pVtabIdx = p
16700 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  IdxInfo;.  if( p
16710 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
16720 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20  Consumed ){.    
16730 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46  p->cost.plan.wsF
16740 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
16750 44 45 52 45 44 3b 0a 20 20 20 20 70 2d 3e 63 6f  DERED;.    p->co
16760 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d  st.plan.nOBSat =
16770 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   nOrderBy;.  }el
16780 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e  se{.    p->cost.
16790 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 70 2d  plan.nOBSat = p-
167a0 3e 69 20 3f 20 70 2d 3e 61 4c 65 76 65 6c 5b 70  >i ? p->aLevel[p
167b0 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53  ->i-1].plan.nOBS
167c0 61 74 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 70 2d  at : 0;.  }.  p-
167d0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 45 71 20 3d  >cost.plan.nEq =
167e0 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
167f0 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
16800 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  rBy;..  /* Try t
16810 6f 20 66 69 6e 64 20 61 20 6d 6f 72 65 20 65 66  o find a more ef
16820 66 69 63 69 65 6e 74 20 61 63 63 65 73 73 20 70  ficient access p
16830 61 74 74 65 72 6e 20 62 79 20 75 73 69 6e 67 20  attern by using 
16840 6d 75 6c 74 69 70 6c 65 20 69 6e 64 65 78 65 73  multiple indexes
16850 0a 20 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a  .  ** to optimiz
16860 65 20 61 6e 20 4f 52 20 65 78 70 72 65 73 73 69  e an OR expressi
16870 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 57 48  on within the WH
16880 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 20 20 2a  ERE clause. .  *
16890 2f 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65  /.  bestOrClause
168a0 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 23 65 6e 64  Index(p);.}.#end
168b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
168c0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
168d0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
168e0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a  _ENABLE_STAT3./*
168f0 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
16900 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70   location of a p
16910 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d  articular key am
16920 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20  ong all keys in 
16930 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74  an.** index.  St
16940 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
16950 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c  in aStat as foll
16960 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53  ows:.**.**    aS
16970 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e  tat[0]      Est.
16980 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16990 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a  less than pVal.*
169a0 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20  *    aStat[1]   
169b0 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
169c0 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20  f rows equal to 
169d0 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  pVal.**.** Retur
169e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
169f0 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  uccess..*/.stati
16a00 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74  c int whereKeySt
16a10 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
16a20 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
16a30 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
16a40 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
16a50 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
16a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
16a70 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
16a80 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73  domain of */.  s
16a90 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
16aa0 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61  al,        /* Va
16ab0 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  lue to consider 
16ac0 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  */.  int roundUp
16ad0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16ae0 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20   /* Round up if 
16af0 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77  true.  Round dow
16b00 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20  n if false */.  
16b10 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20  tRowcnt *aStat  
16b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16b30 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65  UT: stats writte
16b40 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74  n here */.){.  t
16b50 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65  Rowcnt n;.  Inde
16b60 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
16b70 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79 70 65  ;.  int i, eType
16b80 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d 20 30  ;.  int isEq = 0
16b90 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64 6f 75  ;.  i64 v;.  dou
16ba0 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73  ble r, rS;..  as
16bb0 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30  sert( roundUp==0
16bc0 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29   || roundUp==1 )
16bd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
16be0 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
16bf0 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 72   if( pVal==0 ) r
16c00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16c10 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e  OR;.  n = pIdx->
16c20 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61  aiRowEst[0];.  a
16c30 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
16c40 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65 20  Sample;.  eType 
16c50 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
16c60 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69  type(pVal);..  i
16c70 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
16c80 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
16c90 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
16ca0 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20  e_int64(pVal);. 
16cb0 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b 0a 20     r = (i64)v;. 
16cc0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
16cd0 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  dx->nSample; i++
16ce0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  ){.      if( aSa
16cf0 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
16d00 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e  QLITE_NULL ) con
16d10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
16d20 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
16d30 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  e>=SQLITE_TEXT )
16d40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
16d50 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
16d60 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  pe==SQLITE_INTEG
16d70 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ER ){.        if
16d80 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69  ( aSample[i].u.i
16d90 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=v ){.         
16da0 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b   isEq = aSample[
16db0 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20  i].u.i==v;.     
16dc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
16de0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
16df0 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  t( aSample[i].eT
16e00 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
16e10 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
16e20 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e   aSample[i].u.r>
16e30 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =r ){.          
16e40 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69  isEq = aSample[i
16e50 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20  ].u.r==r;.      
16e60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16e70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16e80 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
16e90 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
16ea0 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20 73 71  AT ){.    r = sq
16eb0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
16ec0 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f  le(pVal);.    fo
16ed0 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
16ee0 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
16ef0 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
16f00 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  i].eType==SQLITE
16f10 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  _NULL ) continue
16f20 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d  ;.      if( aSam
16f30 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51  ple[i].eType>=SQ
16f40 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65 61  LITE_TEXT ) brea
16f50 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  k;.      if( aSa
16f60 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
16f70 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
16f80 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d         rS = aSam
16f90 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20  ple[i].u.r;.    
16fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16fb0 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d   rS = aSample[i]
16fc0 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  .u.i;.      }.  
16fd0 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20 29 7b      if( rS>=r ){
16fe0 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20  .        isEq = 
16ff0 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 62  rS==r;.        b
17000 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
17010 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17020 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  eType==SQLITE_NU
17030 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b  LL ){.    i = 0;
17040 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65  .    if( aSample
17050 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [0].eType==SQLIT
17060 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d 20  E_NULL ) isEq = 
17070 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
17080 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
17090 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54  QLITE_TEXT || eT
170a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
170b0 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
170c0 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
170d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
170e0 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
170f0 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe==SQLITE_TEXT 
17100 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  || aSample[i].eT
17110 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
17120 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
17130 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
17140 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d  .    if( i<pIdx-
17150 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20 20 20  >nSample ){     
17160 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20   .      sqlite3 
17170 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
17180 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
17190 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f  *pColl;.      co
171a0 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20  nst u8 *z;.     
171b0 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
171c0 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20  TE_BLOB ){.     
171d0 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38     z = (const u8
171e0 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
171f0 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20  _blob(pVal);.   
17200 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
17210 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
17220 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
17230 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  l->enc==SQLITE_U
17240 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  TF8 );.      }el
17250 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
17260 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
17270 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 53 51  llSeq(pParse, SQ
17280 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70  LITE_UTF8, 0, *p
17290 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20  Idx->azColl);.  
172a0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
172b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
172c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
172d0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
172e0 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73         z = (cons
172f0 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 56 61  t u8 *)sqlite3Va
17300 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 70 43  lueText(pVal, pC
17310 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20  oll->enc);.     
17320 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20     if( !z ){.   
17330 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
17340 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
17350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
17360 73 65 72 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c  sert( z && pColl
17370 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
17380 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17390 20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75   n = sqlite3Valu
173a0 65 42 79 74 65 73 28 70 56 61 6c 2c 20 70 43 6f  eBytes(pVal, pCo
173b0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 0a 20 20 20  ll->enc);.  .   
173c0 20 20 20 66 6f 72 28 3b 20 69 3c 70 49 64 78 2d     for(; i<pIdx-
173d0 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
173e0 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20          int c;. 
173f0 20 20 20 20 20 20 20 69 6e 74 20 65 53 61 6d 70         int eSamp
17400 6c 65 74 79 70 65 20 3d 20 61 53 61 6d 70 6c 65  letype = aSample
17410 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20  [i].eType;.     
17420 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79     if( eSamplety
17430 70 65 3c 65 54 79 70 65 20 29 20 63 6f 6e 74 69  pe<eType ) conti
17440 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
17450 20 65 53 61 6d 70 6c 65 74 79 70 65 21 3d 65 54   eSampletype!=eT
17460 79 70 65 20 29 20 62 72 65 61 6b 3b 0a 23 69 66  ype ) break;.#if
17470 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17480 5f 55 54 46 31 36 0a 20 20 20 20 20 20 20 20 69  _UTF16.        i
17490 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53  f( pColl->enc!=S
174a0 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20  QLITE_UTF8 ){.  
174b0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 61 6d          int nSam
174c0 70 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ple;.          c
174d0 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73  har *zSample = s
174e0 71 6c 69 74 65 33 55 74 66 38 74 6f 31 36 28 0a  qlite3Utf8to16(.
174f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
17500 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53  , pColl->enc, aS
17510 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53  ample[i].u.z, aS
17520 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20  ample[i].nByte, 
17530 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 20  &nSample.       
17540 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
17550 69 66 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a  if( !zSample ){.
17560 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
17570 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
17580 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
17590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
175a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
175b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
175c0 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
175d0 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61  Coll->pUser, nSa
175e0 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e  mple, zSample, n
175f0 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
17600 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
17610 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20  , zSample);.    
17620 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
17630 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
17640 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e       c = pColl->
17650 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
17660 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42  r, aSample[i].nB
17670 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  yte, aSample[i].
17680 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20  u.z, n, z);.    
17690 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
176a0 28 20 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c>=0 ){.      
176b0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 69      if( c==0 ) i
176c0 73 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sEq = 1;.       
176d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
176e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
176f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  }.  }..  /* At t
17700 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70  his point, aSamp
17710 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72  le[i] is the fir
17720 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69  st sample that i
17730 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20  s greater than. 
17740 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20   ** or equal to 
17750 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d  pVal.  Or if i==
17760 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74  pIdx->nSample, t
17770 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20  hen all samples 
17780 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68  are less.  ** th
17790 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61 53 61  an pVal.  If aSa
177a0 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74  mple[i]==pVal, t
177b0 68 65 6e 20 69 73 45 71 3d 3d 31 2e 0a 20 20 2a  hen isEq==1..  *
177c0 2f 0a 20 20 69 66 28 20 69 73 45 71 20 29 7b 0a  /.  if( isEq ){.
177d0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49      assert( i<pI
177e0 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20  dx->nSample );. 
177f0 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53     aStat[0] = aS
17800 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20  ample[i].nLt;.  
17810 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61    aStat[1] = aSa
17820 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b 0a 20 20 7d  mple[i].nEq;.  }
17830 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e  else{.    tRowcn
17840 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72  t iLower, iUpper
17850 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20  , iGap;.    if( 
17860 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  i==0 ){.      iL
17870 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
17880 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65  iUpper = aSample
17890 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 65 6c  [0].nLt;.    }el
178a0 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72  se{.      iUpper
178b0 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d   = i>=pIdx->nSam
178c0 70 6c 65 20 3f 20 6e 20 3a 20 61 53 61 6d 70 6c  ple ? n : aSampl
178d0 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 20 20  e[i].nLt;.      
178e0 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65  iLower = aSample
178f0 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20 61 53 61 6d  [i-1].nEq + aSam
17900 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a 20 20  ple[i-1].nLt;.  
17910 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d    }.    aStat[1]
17920 20 3d 20 70 49 64 78 2d 3e 61 76 67 45 71 3b 0a   = pIdx->avgEq;.
17930 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
17940 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
17950 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
17960 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
17970 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
17980 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
17990 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
179a0 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
179b0 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
179c0 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
179d0 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
179e0 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
179f0 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72   + iGap;.  }.  r
17a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17a10 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
17a20 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
17a30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78   */../*.** If ex
17a40 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 72  pression pExpr r
17a50 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69 74 65  epresents a lite
17a60 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74 20 2a  ral value, set *
17a70 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  pp to point to.*
17a80 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  * an sqlite3_val
17a90 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
17aa0 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61 6d 65  taining the same
17ab0 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61 66 66   value, with aff
17ac0 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61 70 70  inity.** aff app
17ad0 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65 66 6f  lied to it, befo
17ae0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74  re returning. It
17af0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
17b00 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a  bility of the .*
17b10 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
17b20 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
17b30 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 79  his structure by
17b40 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 0a   passing it to .
17b50 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ** sqlite3ValueF
17b60 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
17b70 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 73  the current pars
17b80 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69 6c 65  e is a recompile
17b90 20 28 73 71 6c 69 74 65 33 52 65 70 72 65 70 61   (sqlite3Reprepa
17ba0 72 65 28 29 29 20 61 6e 64 20 70 45 78 70 72 0a  re()) and pExpr.
17bb0 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76 61 72  ** is an SQL var
17bc0 69 61 62 6c 65 20 74 68 61 74 20 63 75 72 72 65  iable that curre
17bd0 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e  ntly has a non-N
17be0 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64 20  ULL value bound 
17bf0 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65  to it,.** create
17c00 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
17c10 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
17c20 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61 6c 75  aining this valu
17c30 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a  e, again with.**
17c40 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 61 70   affinity aff ap
17c50 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69 6e 73  plied to it, ins
17c60 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
17c70 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 61 62  either of the ab
17c80 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74 20 2a  ove apply, set *
17c90 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  pp to NULL..**.*
17ca0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
17cb0 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
17cc0 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
17cd0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
17ce0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
17cf0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
17d00 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65  static int value
17d10 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73  FromExpr(.  Pars
17d20 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
17d30 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38  pr *pExpr, .  u8
17d40 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74 65 33   aff, .  sqlite3
17d50 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20  _value **pp.){. 
17d60 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
17d70 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20 20 7c  TK_VARIABLE.   |
17d80 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
17d90 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78  _REGISTER && pEx
17da0 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49  pr->op2==TK_VARI
17db0 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20 20 69  ABLE).  ){.    i
17dc0 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70 72 2d  nt iVar = pExpr-
17dd0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  >iColumn;.    sq
17de0 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
17df0 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
17e00 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 2a 70  e, iVar);.    *p
17e10 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
17e20 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e  etValue(pParse->
17e30 70 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72  pReprepare, iVar
17e40 2c 20 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75  , aff);.    retu
17e50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17e60 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
17e70 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
17e80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
17e90 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  r, SQLITE_UTF8, 
17ea0 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64  aff, pp);.}.#end
17eb0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
17ec0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
17ed0 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
17ee0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
17ef0 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
17f00 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
17f10 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
17f20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
17f30 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
17f40 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
17f50 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
17f60 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
17f70 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
17f80 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
17f90 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
17fa0 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
17fb0 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
17fc0 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
17fd0 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
17fe0 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
17ff0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
18000 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
18010 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
18020 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
18030 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
18040 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
18050 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
18060 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18080 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
18090 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
180a0 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
180b0 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
180c0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
180d0 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
180e0 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
180f0 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
18100 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
18110 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
18120 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
18130 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  rm..**.** The nE
18140 71 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  q parameter is p
18150 61 73 73 65 64 20 74 68 65 20 69 6e 64 65 78 20  assed the index 
18160 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  of the index col
18170 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74  umn subject to t
18180 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73  he.** range cons
18190 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69  traint. Or, equi
181a0 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75  valently, the nu
181b0 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
181c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
181d0 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65  optimized by the
181e0 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20   proposed index 
181f0 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  scan. For exampl
18200 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65  e, assuming inde
18210 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28  x p is.** on t1(
18220 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53  a, b), and the S
18230 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  QL query is:.**.
18240 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
18250 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
18260 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f   b > ? AND b < ?
18270 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
18280 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61  nEq should be pa
18290 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 31  ssed the value 1
182a0 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72   (as the range r
182b0 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e  estricted column
182c0 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73  ,.** b, is the s
182d0 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20  econd left-most 
182e0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
182f0 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  dex). Or, if the
18300 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
18310 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
18320 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
18330 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
18340 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62  hen nEq should b
18350 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a  e passed 0..**.*
18360 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
18370 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67  alue is an integ
18380 65 72 20 64 69 76 69 73 6f 72 20 74 6f 20 72 65  er divisor to re
18390 64 75 63 65 20 74 68 65 20 65 73 74 69 6d 61 74  duce the estimat
183a0 65 64 0a 2a 2a 20 73 65 61 72 63 68 20 73 70 61  ed.** search spa
183b0 63 65 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61  ce.  A return va
183c0 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e 73 20 74  lue of 1 means t
183d0 68 61 74 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  hat range constr
183e0 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20  aints are.** no 
183f0 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20 20 41 20  help at all.  A 
18400 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
18410 32 20 6d 65 61 6e 73 20 72 61 6e 67 65 20 63 6f  2 means range co
18420 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a  nstraints are.**
18430 20 65 78 70 65 63 74 65 64 20 74 6f 20 72 65 64   expected to red
18440 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
18450 70 61 63 65 20 62 79 20 68 61 6c 66 2e 20 20 41  pace by half.  A
18460 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a  nd so forth....*
18470 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65  *.** In the abse
18480 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
18490 61 74 33 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at3 ANALYZE data
184a0 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65  , each range ine
184b0 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63  quality.** reduc
184c0 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
184d0 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20  ace by a factor 
184e0 6f 66 20 34 2e 20 20 48 65 6e 63 65 20 61 20 73  of 4.  Hence a s
184f0 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
18500 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74   (x>?).** result
18510 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66  s in a return of
18520 20 34 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63   4 and a range c
18530 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41  onstraint (x>? A
18540 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a  ND x<?) results.
18550 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f  ** in a return o
18560 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  f 16..*/.static 
18570 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63  int whereRangeSc
18580 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
18590 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
185a0 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
185b0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
185c0 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
185d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
185e0 54 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  The index contai
185f0 6e 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2d 63  ning the range-c
18600 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20  ompared column; 
18610 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  "x" */.  int nEq
18620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18630 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61   index into p->a
18640 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e  Col[] of the ran
18650 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75  ge-compared colu
18660 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  mn */.  WhereTer
18670 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
18680 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
18690 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
186a0 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
186b0 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
186c0 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
186d0 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
186e0 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
186f0 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
18700 4e 55 4c 4c 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  NULL */.  double
18710 20 2a 70 52 61 6e 67 65 44 69 76 20 20 20 2f 2a   *pRangeDiv   /*
18720 20 4f 55 54 3a 20 52 65 64 75 63 65 20 73 65 61   OUT: Reduce sea
18730 72 63 68 20 73 70 61 63 65 20 62 79 20 74 68 69  rch space by thi
18740 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a  s divisor */.){.
18750 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18760 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51  E_OK;..#ifdef SQ
18770 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
18780 33 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20  3..  if( nEq==0 
18790 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b  && p->nSample ){
187a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
187b0 75 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b 0a 20  ue *pRangeVal;. 
187c0 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
187d0 72 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77 63  r = 0;.    tRowc
187e0 6e 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61  nt iUpper = p->a
187f0 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
18800 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
18810 20 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54    u8 aff = p->pT
18820 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
18830 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e  Column[0]].affin
18840 69 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c  ity;..    if( pL
18850 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78  ower ){.      Ex
18860 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77  pr *pExpr = pLow
18870 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
18880 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61  t;.      rc = va
18890 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
188a0 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  se, pExpr, aff, 
188b0 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20  &pRangeVal);.   
188c0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77     assert( (pLow
188d0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
188e0 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d  (WO_GT|WO_GE))!=
188f0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  0 );.      if( r
18900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
18910 20 20 20 20 26 26 20 77 68 65 72 65 4b 65 79 53      && whereKeyS
18920 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
18930 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20 61 29  pRangeVal, 0, a)
18940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
18950 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f    ){.        iLo
18960 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  wer = a[0];.    
18970 20 20 20 20 69 66 28 20 28 70 4c 6f 77 65 72 2d      if( (pLower-
18980 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
18990 47 54 29 21 3d 30 20 29 20 69 4c 6f 77 65 72 20  GT)!=0 ) iLower 
189a0 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d  += a[1];.      }
189b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
189c0 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65 56 61  lueFree(pRangeVa
189d0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
189e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
189f0 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  && pUpper ){.   
18a00 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
18a10 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
18a20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63  pRight;.      rc
18a30 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72   = valueFromExpr
18a40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
18a50 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29  aff, &pRangeVal)
18a60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18a70 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
18a80 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
18a90 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
18aa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18ab0 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72  K.       && wher
18ac0 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
18ad0 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20  , p, pRangeVal, 
18ae0 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, a)==SQLITE_OK
18af0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
18b00 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b    iUpper = a[0];
18b10 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 55  .        if( (pU
18b20 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
18b30 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 20 69 55  & WO_LE)!=0 ) iU
18b40 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20  pper += a[1];.  
18b50 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
18b60 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61  te3ValueFree(pRa
18b70 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ngeVal);.    }. 
18b80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18b90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
18ba0 28 20 69 55 70 70 65 72 3c 3d 69 4c 6f 77 65 72  ( iUpper<=iLower
18bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 61   ){.        *pRa
18bc0 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65  ngeDiv = (double
18bd0 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b  )p->aiRowEst[0];
18be0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18bf0 20 20 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76        *pRangeDiv
18c00 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69   = (double)p->ai
18c10 52 6f 77 45 73 74 5b 30 5d 2f 28 64 6f 75 62 6c  RowEst[0]/(doubl
18c20 65 29 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  e)(iUpper - iLow
18c30 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
18c40 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
18c50 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f  range scan regio
18c60 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64 69 76 3d  ns: %u..%u  div=
18c70 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %g\n",.         
18c80 20 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c           (u32)iL
18c90 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65  ower, (u32)iUppe
18ca0 72 2c 20 2a 70 52 61 6e 67 65 44 69 76 29 29 3b  r, *pRangeDiv));
18cb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18cc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18cd0 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45   }.#else.  UNUSE
18ce0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72  D_PARAMETER(pPar
18cf0 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  se);.  UNUSED_PA
18d00 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e  RAMETER(p);.  UN
18d10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
18d20 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  Eq);.#endif.  as
18d30 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20  sert( pLower || 
18d40 70 55 70 70 65 72 20 29 3b 0a 20 20 2a 70 52 61  pUpper );.  *pRa
18d50 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65  ngeDiv = (double
18d60 29 31 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72  )1;.  if( pLower
18d70 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46   && (pLower->wtF
18d80 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
18d90 4c 29 3d 3d 30 20 29 20 2a 70 52 61 6e 67 65 44  L)==0 ) *pRangeD
18da0 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b  iv *= (double)4;
18db0 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 29 20  .  if( pUpper ) 
18dc0 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d 20 28 64  *pRangeDiv *= (d
18dd0 6f 75 62 6c 65 29 34 3b 0a 20 20 72 65 74 75 72  ouble)4;.  retur
18de0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
18df0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
18e00 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT3./*.** Estima
18e10 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
18e20 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
18e30 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
18e40 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c  d on.** an equal
18e50 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78  ity constraint x
18e60 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65  =VALUE and where
18e70 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75   that VALUE occu
18e80 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73  rs in.** the his
18e90 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68  togram data.  Th
18ea0 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68  is only works wh
18eb0 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74  en x is the left
18ec0 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  -most.** column 
18ed0 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  of an index and 
18ee0 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73  sqlite_stat3 his
18ef0 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61  togram data is a
18f00 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20  vailable.** for 
18f10 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65  that index.  Whe
18f20 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68  n pExpr==NULL th
18f30 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e  at means the con
18f40 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78  straint is.** "x
18f50 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61   IS NULL" instea
18f60 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a  d of "x=VALUE"..
18f70 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
18f80 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
18f90 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
18fa0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
18fb0 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
18fc0 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
18fd0 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
18fe0 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
18ff0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
19000 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
19010 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
19020 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
19030 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
19040 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
19050 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
19060 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
19070 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
19080 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
19090 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
190a0 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
190b0 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
190c0 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
190d0 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
190e0 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
190f0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
19100 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63  int whereEqualSc
19110 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
19120 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
19130 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
19140 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
19150 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
19160 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
19170 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
19180 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
19190 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45   is pTerm */.  E
191a0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
191b0 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
191c0 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74  n for VALUE in t
191d0 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74  he x=VALUE const
191e0 72 61 69 6e 74 20 2a 2f 0a 20 20 64 6f 75 62 6c  raint */.  doubl
191f0 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20  e *pnRow        
19200 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
19210 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
19220 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  e here */.){.  s
19230 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
19240 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55  hs = 0;  /* VALU
19250 45 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  E on right-hand 
19260 73 69 64 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f  side of pTerm */
19270 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20  .  u8 aff;      
19280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19290 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  Column affinity 
192a0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
192c0 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
192d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
192e0 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20  Rowcnt a[2];    
192f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
19300 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73  istics */..  ass
19310 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
19320 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19330 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
19340 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c    aff = p->pTabl
19350 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
19360 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79  umn[0]].affinity
19370 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b  ;.  if( pExpr ){
19380 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46  .    rc = valueF
19390 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
193a0 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52 68  pExpr, aff, &pRh
193b0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  s);.    if( rc )
193c0 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61 6c   goto whereEqual
193d0 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a  ScanEst_cancel;.
193e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 68    }else{.    pRh
193f0 73 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  s = sqlite3Value
19400 4e 65 77 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  New(pParse->db);
19410 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 68 73 3d  .  }.  if( pRhs=
19420 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
19430 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72  TE_NOTFOUND;.  r
19440 63 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  c = whereKeyStat
19450 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 68  s(pParse, p, pRh
19460 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69 66 28 20  s, 0, a);.  if( 
19470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19480 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
19490 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
194a0 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20  regions: %d\n", 
194b0 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 20  (int)a[1]));.   
194c0 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
194d0 20 20 7d 0a 77 68 65 72 65 45 71 75 61 6c 53 63    }.whereEqualSc
194e0 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a 0a 20 20  anEst_cancel:.  
194f0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
19500 28 70 52 68 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pRhs);.  return
19510 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
19520 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19530 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 2a 2f  ENABLE_STAT3) */
19540 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19550 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a  ENABLE_STAT3./*.
19560 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
19570 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
19580 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
19590 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
195a0 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
195b0 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  t where the righ
195c0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
195d0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
195e0 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76  * is a list of v
195f0 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a  alues.  Example:
19600 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48  .**.**        WH
19610 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c  ERE x IN (1,2,3,
19620 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  4).**.** Write t
19630 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
19640 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
19650 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
19660 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
19670 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
19680 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
19690 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
196a0 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
196b0 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
196c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
196d0 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
196e0 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
196f0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
19700 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
19710 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
19720 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
19730 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
19740 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
19750 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
19760 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
19770 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
19780 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
19790 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
197a0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
197b0 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63  ic int whereInSc
197c0 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
197d0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
197e0 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
197f0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
19800 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
19810 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
19820 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
19830 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
19840 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45   is pTerm */.  E
19850 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
19860 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
19870 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53   list on the RHS
19880 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32   of "x IN (v1,v2
19890 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 64  ,v3,...)" */.  d
198a0 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20  ouble *pnRow    
198b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
198c0 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
198d0 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
198e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
198f0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  TE_OK;         /
19900 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
19910 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 64  turn code */.  d
19920 6f 75 62 6c 65 20 6e 45 73 74 3b 20 20 20 20 20  ouble nEst;     
19930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19940 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72  mber of rows for
19950 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a   a single term *
19960 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 45  /.  double nRowE
19970 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b 20  st = (double)0; 
19980 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
19990 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
199a0 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
199b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
199c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
199d0 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
199e0 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
199f0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
19a00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
19a10 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & i<pList->nExpr
19a20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74  ; i++){.    nEst
19a30 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30   = p->aiRowEst[0
19a40 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  ];.    rc = wher
19a50 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
19a60 61 72 73 65 2c 20 70 2c 20 70 4c 69 73 74 2d 3e  arse, p, pList->
19a70 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
19a80 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
19a90 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a 20 20 69  += nEst;.  }.  i
19aa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19ab0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77   ){.    if( nRow
19ac0 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f 77 45 73  Est > p->aiRowEs
19ad0 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73 74 20 3d  t[0] ) nRowEst =
19ae0 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b   p->aiRowEst[0];
19af0 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52  .    *pnRow = nR
19b00 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45  owEst;.    WHERE
19b10 54 52 41 43 45 28 28 22 49 4e 20 72 6f 77 20 65  TRACE(("IN row e
19b20 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c  stimate: est=%g\
19b30 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20  n", nRowEst));. 
19b40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19b50 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
19b60 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
19b70 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 2f 2a 0a  E_STAT3) */../*.
19b80 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
19b90 69 66 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f  if column iCol o
19ba0 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
19bb0 20 63 75 72 73 6f 72 20 69 54 61 62 20 77 69 6c   cursor iTab wil
19bc0 6c 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 73  l appear.** in s
19bd0 6f 72 74 65 64 20 6f 72 64 65 72 20 61 63 63 6f  orted order acco
19be0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  rding to the cur
19bf0 72 65 6e 74 20 71 75 65 72 79 20 70 6c 61 6e 2e  rent query plan.
19c00 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61  .**.** Return va
19c10 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30  lues:.**.**    0
19c20 20 20 20 69 43 6f 6c 20 69 73 20 6e 6f 74 20 6f     iCol is not o
19c30 72 64 65 72 65 64 0a 2a 2a 20 20 20 20 31 20 20  rdered.**    1  
19c40 20 69 43 6f 6c 20 68 61 73 20 6f 6e 6c 79 20 61   iCol has only a
19c50 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 0a 2a 2a   single value.**
19c60 20 20 20 20 32 20 20 20 69 43 6f 6c 20 69 73 20      2   iCol is 
19c70 69 6e 20 41 53 43 20 6f 72 64 65 72 0a 2a 2a 20  in ASC order.** 
19c80 20 20 20 33 20 20 20 69 43 6f 6c 20 69 73 20 69     3   iCol is i
19c90 6e 20 44 45 53 43 20 6f 72 64 65 72 0a 2a 2f 0a  n DESC order.*/.
19ca0 73 74 61 74 69 63 20 69 6e 74 20 69 73 4f 72 64  static int isOrd
19cb0 65 72 65 64 43 6f 6c 75 6d 6e 28 0a 20 20 57 68  eredColumn(.  Wh
19cc0 65 72 65 42 65 73 74 49 64 78 20 2a 70 2c 0a 20  ereBestIdx *p,. 
19cd0 20 69 6e 74 20 69 54 61 62 2c 0a 20 20 69 6e 74   int iTab,.  int
19ce0 20 69 43 6f 6c 0a 29 7b 0a 20 20 69 6e 74 20 69   iCol.){.  int i
19cf0 2c 20 6a 3b 0a 20 20 57 68 65 72 65 4c 65 76 65  , j;.  WhereLeve
19d00 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 2d 3e  l *pLevel = &p->
19d10 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 3b 0a  aLevel[p->i-1];.
19d20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
19d30 20 75 38 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20   u8 sortOrder;. 
19d40 20 66 6f 72 28 69 3d 70 2d 3e 69 2d 31 3b 20 69   for(i=p->i-1; i
19d50 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4c 65 76 65 6c  >=0; i--, pLevel
19d60 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 65  --){.    if( pLe
19d70 76 65 6c 2d 3e 69 54 61 62 43 75 72 21 3d 69 54  vel->iTabCur!=iT
19d80 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
19d90 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
19da0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
19db0 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29  HERE_ALL_UNIQUE)
19dc0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
19dd0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
19de0 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c   assert( (pLevel
19df0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
19e00 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 21   WHERE_ORDERED)!
19e10 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
19e20 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
19e30 61 6e 2e 75 2e 70 49 64 78 29 21 3d 30 20 29 7b  an.u.pIdx)!=0 ){
19e40 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
19e50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 72  0 ){.        sor
19e60 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  tOrder = 0;.    
19e70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
19e80 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
19e90 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45  ags & WHERE_REVE
19ea0 52 53 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  RSE)!=0 );.     
19eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19ec0 69 6e 74 20 6e 20 3d 20 70 49 64 78 2d 3e 6e 43  int n = pIdx->nC
19ed0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 66  olumn;.        f
19ee0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
19ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
19f00 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43   iCol==pIdx->aiC
19f10 6f 6c 75 6d 6e 5b 6a 5d 20 29 20 62 72 65 61 6b  olumn[j] ) break
19f20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19f30 20 20 20 20 69 66 28 20 6a 3e 3d 6e 20 29 20 72      if( j>=n ) r
19f40 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
19f50 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64   sortOrder = pId
19f60 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  x->aSortOrder[j]
19f70 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
19f80 73 65 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  se( (pLevel->pla
19f90 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
19fa0 45 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29 3b  E_REVERSE)!=0 );
19fb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
19fc0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43  se{.      if( iC
19fd0 6f 6c 21 3d 28 2d 31 29 20 29 20 72 65 74 75 72  ol!=(-1) ) retur
19fe0 6e 20 30 3b 0a 20 20 20 20 20 20 73 6f 72 74 4f  n 0;.      sortO
19ff0 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rder = 0;.      
1a000 74 65 73 74 63 61 73 65 28 20 28 70 4c 65 76 65  testcase( (pLeve
1a010 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1a020 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
1a030 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  !=0 );.    }.   
1a040 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
1a050 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1a060 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 20 29  RE_REVERSE)!=0 )
1a070 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1a080 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20  sortOrder==0 || 
1a090 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  sortOrder==1 );.
1a0a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a0b0 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  sortOrder==1 );.
1a0c0 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
1a0d0 3d 20 31 20 2d 20 73 6f 72 74 4f 72 64 65 72 3b  = 1 - sortOrder;
1a0e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1a0f0 6e 20 73 6f 72 74 4f 72 64 65 72 2b 32 3b 0a 20  n sortOrder+2;. 
1a100 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1a110 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1a120 74 69 6e 65 20 64 65 63 69 64 65 73 20 69 66 20  tine decides if 
1a130 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65 64  pIdx can be used
1a140 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
1a150 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75  ORDER BY.** clau
1a160 73 65 2c 20 65 69 74 68 65 72 20 69 6e 20 77 68  se, either in wh
1a170 6f 6c 65 20 6f 72 20 69 6e 20 70 61 72 74 2e 20  ole or in part. 
1a180 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1a190 65 20 69 73 20 74 68 65 20 0a 2a 2a 20 63 75 6d  e is the .** cum
1a1a0 75 6c 61 74 69 76 65 20 6e 75 6d 62 65 72 20 6f  ulative number o
1a1b0 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
1a1c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
1a1d0 68 61 74 20 61 72 65 20 73 61 74 69 73 66 69 65  hat are satisfie
1a1e0 64 0a 2a 2a 20 62 79 20 74 68 65 20 69 6e 64 65  d.** by the inde
1a1f0 78 20 70 49 64 78 20 61 6e 64 20 6f 74 68 65 72  x pIdx and other
1a200 20 69 6e 64 69 63 65 73 20 69 6e 20 6f 75 74 65   indices in oute
1a210 72 20 6c 6f 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 54  r loops..**.** T
1a220 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71  he table being q
1a230 75 65 72 69 65 64 20 68 61 73 20 61 20 63 75 72  ueried has a cur
1a240 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62  sor number of "b
1a250 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20 74  ase".  pIdx is t
1a260 68 65 0a 2a 2a 20 69 6e 64 65 78 20 74 68 61 74  he.** index that
1a270 20 69 73 20 70 6f 73 74 75 6c 61 74 65 64 20 66   is postulated f
1a280 6f 72 20 75 73 65 20 74 6f 20 61 63 63 65 73 73  or use to access
1a290 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
1a2a0 2a 20 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c  * The *pbRev val
1a2b0 75 65 20 69 73 20 73 65 74 20 74 6f 20 30 20 6f  ue is set to 0 o
1a2c0 72 64 65 72 20 31 20 64 65 70 65 6e 64 69 6e 67  rder 1 depending
1a2d0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
1a2e0 6f 74 0a 2a 2a 20 70 49 64 78 20 73 68 6f 75 6c  ot.** pIdx shoul
1a2f0 64 20 62 65 20 72 75 6e 20 69 6e 20 74 68 65 20  d be run in the 
1a300 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 6f 72  forward order or
1a310 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
1a320 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a330 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
1a340 0a 20 20 57 68 65 72 65 42 65 73 74 49 64 78 20  .  WhereBestIdx 
1a350 2a 70 2c 20 20 20 20 2f 2a 20 42 65 73 74 20 69  *p,    /* Best i
1a360 6e 64 65 78 20 73 65 61 72 63 68 20 63 6f 6e 74  ndex search cont
1a370 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
1a380 70 49 64 78 2c 20 20 20 20 20 20 20 20 2f 2a 20  pIdx,        /* 
1a390 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65  The index we are
1a3a0 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   testing */.  in
1a3b0 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
1a3c0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
1a3d0 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
1a3e0 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
1a3f0 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 2c 20 20  .  int *pbRev,  
1a400 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
1a410 20 31 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f   1 for reverse-o
1a420 72 64 65 72 20 73 63 61 6e 20 6f 66 20 70 49 64  rder scan of pId
1a430 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4f 62  x */.  int *pbOb
1a440 55 6e 69 71 75 65 20 20 20 20 20 2f 2a 20 4f 52  Unique     /* OR
1a450 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 76 61  DER BY column va
1a460 6c 75 65 73 20 77 69 6c 6c 20 64 69 66 66 65 72  lues will differ
1a470 65 6e 74 20 69 6e 20 65 76 65 72 79 20 72 6f 77  ent in every row
1a480 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a4b0 20 6f 66 20 70 49 64 78 20 74 65 72 6d 73 20 75   of pIdx terms u
1a4c0 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  sed */.  int j; 
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a4f0 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
1a500 6d 73 20 73 61 74 69 73 66 69 65 64 20 2a 2f 0a  ms satisfied */.
1a510 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
1a520 3d 20 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 2;            
1a530 2f 2a 20 30 3a 20 66 6f 72 77 61 72 64 2e 20 20  /* 0: forward.  
1a540 31 3a 20 62 61 63 6b 77 61 72 64 2e 20 20 32 3a  1: backward.  2:
1a550 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 69 6e   unknown */.  in
1a560 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
1a570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a580 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42  umber of ORDER B
1a590 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72  Y terms */.  str
1a5a0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1a5b0 6d 20 2a 70 4f 42 49 74 65 6d 3b 2f 2a 20 41 20  m *pOBItem;/* A 
1a5c0 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
1a5d0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
1a5e0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1a5f0 49 64 78 2d 3e 70 54 61 62 6c 65 3b 20 20 20 2f  Idx->pTable;   /
1a600 2a 20 54 61 62 6c 65 20 74 68 61 74 20 6f 77 6e  * Table that own
1a610 73 20 69 6e 64 65 78 20 70 49 64 78 20 2a 2f 0a  s index pIdx */.
1a620 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1a630 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
1a640 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
1a650 63 6c 61 75 73 65 20 2a 2f 0a 20 20 50 61 72 73  clause */.  Pars
1a660 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
1a670 50 61 72 73 65 3b 20 20 20 20 2f 2a 20 50 61 72  Parse;    /* Par
1a680 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
1a690 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1a6a0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
1a6b0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1a6c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
1a6d0 50 72 69 6f 72 53 61 74 3b 20 20 20 20 20 20 20  PriorSat;       
1a6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
1a6f0 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
1a700 66 69 65 64 20 62 79 20 6f 75 74 65 72 20 6c 6f  fied by outer lo
1a710 6f 70 73 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  ops */.  int see
1a720 6e 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20  nRowid = 0;     
1a730 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1a740 66 20 61 6e 20 4f 52 44 45 52 20 42 59 20 72 6f  f an ORDER BY ro
1a750 77 69 64 20 74 65 72 6d 20 69 73 20 73 65 65 6e  wid term is seen
1a760 20 2a 2f 0a 20 20 69 6e 74 20 75 6e 69 71 75 65   */.  int unique
1a770 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  NotNull;        
1a780 20 20 20 20 2f 2a 20 70 49 64 78 20 69 73 20 55      /* pIdx is U
1a790 4e 49 51 55 45 20 77 69 74 68 20 61 6c 6c 20 74  NIQUE with all t
1a7a0 65 72 6d 73 20 61 72 65 20 4e 4f 54 20 4e 55 4c  erms are NOT NUL
1a7b0 4c 20 2a 2f 0a 20 20 69 6e 74 20 6f 75 74 65 72  L */.  int outer
1a7c0 4f 62 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20  ObUnique;       
1a7d0 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 6c 6f       /* Outer lo
1a7e0 6f 70 73 20 67 65 6e 65 72 61 74 65 20 64 69 66  ops generate dif
1a7f0 66 65 72 65 6e 74 20 76 61 6c 75 65 73 20 69 6e  ferent values in
1a800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 66 6f   ** every row fo
1a830 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
1a840 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 69 66 28  olumns */..  if(
1a850 20 70 2d 3e 69 3d 3d 30 20 29 7b 0a 20 20 20 20   p->i==0 ){.    
1a860 6e 50 72 69 6f 72 53 61 74 20 3d 20 30 3b 0a 20  nPriorSat = 0;. 
1a870 20 20 20 6f 75 74 65 72 4f 62 55 6e 69 71 75 65     outerObUnique
1a880 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
1a890 20 20 20 75 33 32 20 77 73 46 6c 61 67 73 20 3d     u32 wsFlags =
1a8a0 20 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d   p->aLevel[p->i-
1a8b0 31 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b  1].plan.wsFlags;
1a8c0 0a 20 20 20 20 6e 50 72 69 6f 72 53 61 74 20 3d  .    nPriorSat =
1a8d0 20 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d   p->aLevel[p->i-
1a8e0 31 5d 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a  1].plan.nOBSat;.
1a8f0 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73      if( (wsFlags
1a900 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44   & WHERE_ORDERED
1a910 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
1a920 20 54 68 69 73 20 6c 6f 6f 70 20 63 61 6e 6e 6f   This loop canno
1a930 74 20 62 65 20 6f 72 64 65 72 65 64 20 75 6e 6c  t be ordered unl
1a940 65 73 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74  ess the next out
1a950 65 72 20 6c 6f 6f 70 20 69 73 0a 20 20 20 20 20  er loop is.     
1a960 20 2a 2a 20 61 6c 73 6f 20 6f 72 64 65 72 65 64   ** also ordered
1a970 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1a980 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20 20 20 20   nPriorSat;.    
1a990 7d 0a 20 20 20 20 69 66 28 20 4f 70 74 69 6d 69  }.    if( Optimi
1a9a0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
1a9b0 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42  b, SQLITE_OrderB
1a9c0 79 49 64 78 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  yIdxJoin) ){.   
1a9d0 20 20 20 2f 2a 20 4f 6e 6c 79 20 6c 6f 6f 6b 20     /* Only look 
1a9e0 61 74 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73  at the outer-mos
1a9f0 74 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4f 72  t loop if the Or
1aa00 64 65 72 42 79 49 64 78 4a 6f 69 6e 0a 20 20 20  derByIdxJoin.   
1aa10 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69     ** optimizati
1aa20 6f 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  on is disabled *
1aa30 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  /.      return n
1aa40 50 72 69 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a  PriorSat;.    }.
1aa50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73      testcase( ws
1aa60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 42  Flags & WHERE_OB
1aa70 5f 55 4e 49 51 55 45 20 29 3b 0a 20 20 20 20 74  _UNIQUE );.    t
1aa80 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73  estcase( wsFlags
1aa90 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49   & WHERE_ALL_UNI
1aaa0 51 55 45 20 29 3b 0a 20 20 20 20 6f 75 74 65 72  QUE );.    outer
1aab0 4f 62 55 6e 69 71 75 65 20 3d 20 28 77 73 46 6c  ObUnique = (wsFl
1aac0 61 67 73 20 26 20 28 57 48 45 52 45 5f 4f 42 5f  ags & (WHERE_OB_
1aad0 55 4e 49 51 55 45 7c 57 48 45 52 45 5f 41 4c 4c  UNIQUE|WHERE_ALL
1aae0 5f 55 4e 49 51 55 45 29 29 21 3d 30 3b 0a 20 20  _UNIQUE))!=0;.  
1aaf0 7d 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  }.  pOrderBy = p
1ab00 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
1ab10 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
1ab20 30 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  0 );.  if( pIdx-
1ab30 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20  >bUnordered ){. 
1ab40 20 20 20 2f 2a 20 48 61 73 68 20 69 6e 64 69 63     /* Hash indic
1ab50 65 73 20 28 69 6e 64 69 63 61 74 65 64 20 62 79  es (indicated by
1ab60 20 74 68 65 20 22 75 6e 6f 72 64 65 72 65 64 22   the "unordered"
1ab70 20 74 61 67 20 6f 6e 20 73 71 6c 69 74 65 5f 73   tag on sqlite_s
1ab80 74 61 74 31 29 20 63 61 6e 6e 6f 74 0a 20 20 20  tat1) cannot.   
1ab90 20 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20   ** be used for 
1aba0 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 20 20 72  sorting */.    r
1abb0 65 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b  eturn nPriorSat;
1abc0 0a 20 20 7d 0a 20 20 6e 54 65 72 6d 20 3d 20 70  .  }.  nTerm = p
1abd0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
1abe0 20 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20    uniqueNotNull 
1abf0 3d 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  = pIdx->onError!
1ac00 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 61 73 73 65  =OE_None;.  asse
1ac10 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a  rt( nTerm>0 );..
1ac20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70 49    /* Argument pI
1ac30 64 78 20 6d 75 73 74 20 65 69 74 68 65 72 20 70  dx must either p
1ac40 6f 69 6e 74 20 74 6f 20 61 20 27 72 65 61 6c 27  oint to a 'real'
1ac50 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 73 74 72   named index str
1ac60 75 63 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72  ucture, .  ** or
1ac70 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74   an index struct
1ac80 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e  ure allocated on
1ac90 20 74 68 65 20 73 74 61 63 6b 20 62 79 20 62 65   the stack by be
1aca0 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 20 74  stBtreeIndex() t
1acb0 6f 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74  o.  ** represent
1acc0 20 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78   the rowid index
1acd0 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
1ace0 20 65 76 65 72 79 20 74 61 62 6c 65 2e 20 20 2a   every table.  *
1acf0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  /.  assert( pIdx
1ad00 2d 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78  ->zName || (pIdx
1ad10 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20  ->nColumn==1 && 
1ad20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
1ad30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20  ]==-1) );..  /* 
1ad40 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74  Match terms of t
1ad50 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1ad60 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d  se against colum
1ad70 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69  ns of.  ** the i
1ad80 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
1ad90 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65  Note that indice
1ada0 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f  s have pIdx->nCo
1adb0 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c  lumn regular col
1adc0 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f  umns plus.  ** o
1add0 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  ne additional co
1ade0 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20  lumn containing 
1adf0 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20  the rowid.  The 
1ae00 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a  rowid column.  *
1ae10 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  * of the index i
1ae20 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74  s also allowed t
1ae30 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
1ae40 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
1ae50 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
1ae60 20 6a 20 3d 20 6e 50 72 69 6f 72 53 61 74 3b 0a   j = nPriorSat;.
1ae70 20 20 66 6f 72 28 69 3d 30 2c 70 4f 42 49 74 65    for(i=0,pOBIte
1ae80 6d 3d 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a  m=&pOrderBy->a[j
1ae90 5d 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c  ]; j<nTerm && i<
1aea0 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  =pIdx->nColumn; 
1aeb0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
1aec0 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20  pOBExpr;        
1aed0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1aee0 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52  ion of the ORDER
1aef0 20 42 59 20 70 4f 42 49 74 65 6d 20 2a 2f 0a 20   BY pOBItem */. 
1af00 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1af10 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  l;         /* Th
1af20 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
1af30 65 6e 63 65 20 6f 66 20 70 4f 42 45 78 70 72 20  ence of pOBExpr 
1af40 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53  */.    int termS
1af50 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 2f  ortOrder;      /
1af60 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72  * Sort order for
1af70 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
1af80 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
1af90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1afa0 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   i-th column of 
1afb0 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31 20 66  the index.  -1 f
1afc0 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20  or rowid */.    
1afd0 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 3b 20  int iSortOrder; 
1afe0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72          /* 1 for
1aff0 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43   DESC, 0 for ASC
1b000 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64   on the i-th ind
1b010 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69  ex term */.    i
1b020 6e 74 20 69 73 45 71 3b 20 20 20 20 20 20 20 20  nt isEq;        
1b030 20 20 20 20 20 20 20 2f 2a 20 53 75 62 6a 65 63         /* Subjec
1b040 74 20 74 6f 20 61 6e 20 3d 3d 20 6f 72 20 49 53  t to an == or IS
1b050 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
1b060 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 61   */.    int isMa
1b070 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
1b080 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  /* ORDER BY term
1b090 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 6e 64   matches the ind
1b0a0 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63  ex term */.    c
1b0b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1b0c0 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ;      /* Name o
1b0d0 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  f collating sequ
1b0e0 65 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e  ence for i-th in
1b0f0 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  dex term */.    
1b100 57 68 65 72 65 54 65 72 6d 20 2a 70 43 6f 6e 73  WhereTerm *pCons
1b110 74 72 61 69 6e 74 3b 20 2f 2a 20 41 20 63 6f 6e  traint; /* A con
1b120 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 57  straint in the W
1b130 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a  HERE clause */..
1b140 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65      /* If the ne
1b150 78 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  xt term of the O
1b160 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 72  RDER BY clause r
1b170 65 66 65 72 73 20 74 6f 20 61 6e 79 74 68 69 6e  efers to anythin
1b180 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 20  g other than.   
1b190 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   ** a column in 
1b1a0 74 68 65 20 22 62 61 73 65 22 20 74 61 62 6c 65  the "base" table
1b1b0 2c 20 74 68 65 6e 20 74 68 69 73 20 69 6e 64 65  , then this inde
1b1c0 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6f 66  x will not be of
1b1d0 20 61 6e 79 0a 20 20 20 20 2a 2a 20 66 75 72 74   any.    ** furt
1b1e0 68 65 72 20 75 73 65 20 69 6e 20 68 61 6e 64 6c  her use in handl
1b1f0 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
1b200 2e 20 2a 2f 0a 20 20 20 20 70 4f 42 45 78 70 72  . */.    pOBExpr
1b210 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1b220 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 49 74 65  ipCollate(pOBIte
1b230 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
1b240 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d  f( pOBExpr->op!=
1b250 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 4f 42  TK_COLUMN || pOB
1b260 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61  Expr->iTable!=ba
1b270 73 65 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  se ){.      brea
1b280 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1b290 20 46 69 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d   Find column num
1b2a0 62 65 72 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ber and collatin
1b2b0 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
1b2c0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 0a 20 20  he next entry.  
1b2d0 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
1b2e0 78 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64  x */.    if( pId
1b2f0 78 2d 3e 7a 4e 61 6d 65 20 26 26 20 69 3c 70 49  x->zName && i<pI
1b300 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
1b310 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
1b320 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
1b330 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
1b340 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c  umn==pIdx->pTabl
1b350 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  e->iPKey ){.    
1b360 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
1b370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b380 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64  iSortOrder = pId
1b390 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
1b3a0 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
1b3b0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
1b3c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1b3d0 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 7d  Coll!=0 );.    }
1b3e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c  else{.      iCol
1b3f0 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
1b400 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  iSortOrder = 0;.
1b410 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b        zColl = 0;
1b420 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1b430 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1b440 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
1b450 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
1b460 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 0a 20  equence of the. 
1b470 20 20 20 2a 2a 20 69 6e 64 65 78 20 6d 61 74 63     ** index matc
1b480 68 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  h the column num
1b490 62 65 72 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ber and collatin
1b4a0 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  g sequence of th
1b4b0 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a  e ORDER BY.    *
1b4c0 2a 20 63 6c 61 75 73 65 20 65 6e 74 72 79 2e 20  * clause entry. 
1b4d0 20 53 65 74 20 69 73 4d 61 74 63 68 20 74 6f 20   Set isMatch to 
1b4e0 31 20 69 66 20 74 68 65 79 20 62 6f 74 68 20 6d  1 if they both m
1b4f0 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 69 66 28  atch. */.    if(
1b500 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
1b510 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n==iColumn ){.  
1b520 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b      if( zColl ){
1b530 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
1b540 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1b550 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 42 49  Seq(pParse, pOBI
1b560 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
1b570 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
1b580 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
1b590 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
1b5a0 20 69 73 4d 61 74 63 68 20 3d 20 73 71 6c 69 74   isMatch = sqlit
1b5b0 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
1b5c0 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 3d 3d  >zName, zColl)==
1b5d0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1b5e0 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
1b5f0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1b600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 73   }else{.      is
1b610 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 7d  Match = 0;.    }
1b620 0a 0a 20 20 20 20 2f 2a 20 74 65 72 6d 53 6f 72  ..    /* termSor
1b630 74 4f 72 64 65 72 20 69 73 20 30 20 6f 72 20 31  tOrder is 0 or 1
1b640 20 66 6f 72 20 77 68 65 74 68 65 72 20 6f 72 20   for whether or 
1b650 6e 6f 74 20 74 68 65 20 61 63 63 65 73 73 20 6c  not the access l
1b660 6f 6f 70 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a  oop should.    *
1b670 2a 20 72 75 6e 20 66 6f 72 77 61 72 64 20 6f 72  * run forward or
1b680 20 62 61 63 6b 77 61 72 64 73 20 28 72 65 73 70   backwards (resp
1b690 65 63 74 69 76 65 6c 79 29 20 69 6e 20 6f 72 64  ectively) in ord
1b6a0 65 72 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  er to satisfy th
1b6b0 69 73 20 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20  is .    ** term 
1b6c0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1b6d0 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 61  clause. */.    a
1b6e0 73 73 65 72 74 28 20 70 4f 42 49 74 65 6d 2d 3e  ssert( pOBItem->
1b6f0 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20  sortOrder==0 || 
1b700 70 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  pOBItem->sortOrd
1b710 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  er==1 );.    ass
1b720 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d  ert( iSortOrder=
1b730 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72  =0 || iSortOrder
1b740 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53  ==1 );.    termS
1b750 6f 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74  ortOrder = iSort
1b760 4f 72 64 65 72 20 5e 20 70 4f 42 49 74 65 6d 2d  Order ^ pOBItem-
1b770 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20  >sortOrder;..   
1b780 20 2f 2a 20 49 66 20 58 20 69 73 20 74 68 65 20   /* If X is the 
1b790 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e  column in the in
1b7a0 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59  dex and ORDER BY
1b7b0 20 63 6c 61 75 73 65 2c 20 63 68 65 63 6b 20 74   clause, check t
1b7c0 6f 20 73 65 65 0a 20 20 20 20 2a 2a 20 69 66 20  o see.    ** if 
1b7d0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 58 3d  there are any X=
1b7e0 20 6f 72 20 58 20 49 53 20 4e 55 4c 4c 20 63 6f   or X IS NULL co
1b7f0 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65  nstraints in the
1b800 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 2a   WHERE clause. *
1b810 2f 0a 20 20 20 20 70 43 6f 6e 73 74 72 61 69 6e  /.    pConstrain
1b820 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 2d 3e  t = findTerm(p->
1b830 70 57 43 2c 20 62 61 73 65 2c 20 69 43 6f 6c 75  pWC, base, iColu
1b840 6d 6e 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c  mn, p->notReady,
1b850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b860 20 20 20 20 20 20 20 20 20 20 20 20 57 4f 5f 45              WO_E
1b870 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  Q|WO_ISNULL|WO_I
1b880 4e 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66  N, pIdx);.    if
1b890 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30  ( pConstraint==0
1b8a0 20 29 7b 0a 20 20 20 20 20 20 69 73 45 71 20 3d   ){.      isEq =
1b8b0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1b8c0 28 20 28 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  ( (pConstraint->
1b8d0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1b8e0 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  N)!=0 ){.      i
1b8f0 73 45 71 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  sEq = 0;.    }el
1b900 73 65 20 69 66 28 20 28 70 43 6f 6e 73 74 72 61  se if( (pConstra
1b910 69 6e 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  int->eOperator &
1b920 20 57 4f 5f 49 53 4e 55 4c 4c 29 21 3d 30 20 29   WO_ISNULL)!=0 )
1b930 7b 0a 20 20 20 20 20 20 75 6e 69 71 75 65 4e 6f  {.      uniqueNo
1b940 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  tNull = 0;.     
1b950 20 69 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 22   isEq = 1;  /* "
1b960 58 20 49 53 20 4e 55 4c 4c 22 20 6d 65 61 6e 73  X IS NULL" means
1b970 20 58 20 68 61 73 20 6f 6e 6c 79 20 61 20 73 69   X has only a si
1b980 6e 67 6c 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ngle value */.  
1b990 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e    }else if( pCon
1b9a0 73 74 72 61 69 6e 74 2d 3e 70 72 65 72 65 71 52  straint->prereqR
1b9b0 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
1b9c0 20 69 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 43   isEq = 1;  /* C
1b9d0 6f 6e 73 74 72 61 69 6e 74 20 22 58 3d 63 6f 6e  onstraint "X=con
1b9e0 73 74 61 6e 74 22 20 6d 65 61 6e 73 20 58 20 68  stant" means X h
1b9f0 61 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  as only a single
1ba00 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 7d 65   value */.    }e
1ba10 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
1ba20 2a 70 52 69 67 68 74 20 3d 20 70 43 6f 6e 73 74  *pRight = pConst
1ba30 72 61 69 6e 74 2d 3e 70 45 78 70 72 2d 3e 70 52  raint->pExpr->pR
1ba40 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
1ba50 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  pRight->op==TK_C
1ba60 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
1ba70 20 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20   WHERETRACE(("  
1ba80 20 20 20 20 20 2e 2e 20 69 73 4f 72 64 65 72 65       .. isOrdere
1ba90 64 43 6f 6c 75 6d 6e 28 74 61 62 3d 25 64 2c 63  dColumn(tab=%d,c
1baa0 6f 6c 3d 25 64 29 22 2c 0a 20 20 20 20 20 20 20  ol=%d)",.       
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
1bac0 67 68 74 2d 3e 69 54 61 62 6c 65 2c 20 70 52 69  ght->iTable, pRi
1bad0 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 29 3b 0a  ght->iColumn));.
1bae0 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 69          isEq = i
1baf0 73 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28 70  sOrderedColumn(p
1bb00 2c 20 70 52 69 67 68 74 2d 3e 69 54 61 62 6c 65  , pRight->iTable
1bb10 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  , pRight->iColum
1bb20 6e 29 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52  n);.        WHER
1bb30 45 54 52 41 43 45 28 28 22 20 2d 3e 20 69 73 45  ETRACE((" -> isE
1bb40 71 3d 25 64 5c 6e 22 2c 20 69 73 45 71 29 29 3b  q=%d\n", isEq));
1bb50 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
1bb60 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
1bb70 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  s of the form X=
1bb80 59 20 77 68 65 72 65 20 59 20 69 73 20 61 6e 20  Y where Y is an 
1bb90 6f 72 64 65 72 65 64 20 76 61 6c 75 65 0a 20 20  ordered value.  
1bba0 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 6e 20 6f        ** in an o
1bbb0 75 74 65 72 20 6c 6f 6f 70 2c 20 74 68 65 6e 20  uter loop, then 
1bbc0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f  make sure the so
1bbd0 72 74 20 6f 72 64 65 72 20 6f 66 20 59 20 6d 61  rt order of Y ma
1bbe0 74 63 68 65 73 20 74 68 65 0a 20 20 20 20 20 20  tches the.      
1bbf0 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 20    ** sort order 
1bc00 72 65 71 75 69 72 65 64 20 66 6f 72 20 58 2e 20  required for X. 
1bc10 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
1bc20 73 4d 61 74 63 68 20 26 26 20 69 73 45 71 3e 3d  sMatch && isEq>=
1bc30 32 20 26 26 20 69 73 45 71 21 3d 70 4f 42 49 74  2 && isEq!=pOBIt
1bc40 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 2b 32 20  em->sortOrder+2 
1bc50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
1bc60 74 63 61 73 65 28 20 69 73 45 71 3d 3d 32 20 29  tcase( isEq==2 )
1bc70 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
1bc80 63 61 73 65 28 20 69 73 45 71 3d 3d 33 20 29 3b  case( isEq==3 );
1bc90 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1bca0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bcb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bcc0 20 69 73 45 71 20 3d 20 30 3b 20 20 2f 2a 20 22   isEq = 0;  /* "
1bcd0 58 3d 65 78 70 72 22 20 70 6c 61 63 65 73 20 6e  X=expr" places n
1bce0 6f 20 6f 72 64 65 72 69 6e 67 20 63 6f 6e 73 74  o ordering const
1bcf0 72 61 69 6e 74 73 20 6f 6e 20 58 20 2a 2f 0a 20  raints on X */. 
1bd00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1bd10 20 69 66 28 20 21 69 73 4d 61 74 63 68 20 29 7b   if( !isMatch ){
1bd20 0a 20 20 20 20 20 20 69 66 28 20 69 73 45 71 3d  .      if( isEq=
1bd30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  =0 ){.        br
1bd40 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
1bd50 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  {.        contin
1bd60 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
1bd70 7d 65 6c 73 65 20 69 66 28 20 69 73 45 71 21 3d  }else if( isEq!=
1bd80 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
1bd90 6f 72 74 4f 72 64 65 72 3d 3d 32 20 29 7b 0a 20  ortOrder==2 ){. 
1bda0 20 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72         sortOrder
1bdb0 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72   = termSortOrder
1bdc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1bdd0 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21  ( termSortOrder!
1bde0 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  =sortOrder ){.  
1bdf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1be00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6a     }.    }.    j
1be10 2b 2b 3b 0a 20 20 20 20 70 4f 42 49 74 65 6d 2b  ++;.    pOBItem+
1be20 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75  +;.    if( iColu
1be30 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 65  mn<0 ){.      se
1be40 65 6e 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20  enRowid = 1;.   
1be50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
1be60 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43  lse if( pTab->aC
1be70 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  ol[iColumn].notN
1be80 75 6c 6c 3d 3d 30 20 26 26 20 69 73 45 71 21 3d  ull==0 && isEq!=
1be90 31 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  1 ){.      testc
1bea0 61 73 65 28 20 69 73 45 71 3d 3d 30 20 29 3b 0a  ase( isEq==0 );.
1beb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bec0 69 73 45 71 3d 3d 32 20 29 3b 0a 20 20 20 20 20  isEq==2 );.     
1bed0 20 74 65 73 74 63 61 73 65 28 20 69 73 45 71 3d   testcase( isEq=
1bee0 3d 33 20 29 3b 0a 20 20 20 20 20 20 75 6e 69 71  =3 );.      uniq
1bef0 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  ueNotNull = 0;. 
1bf00 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
1bf10 65 65 6e 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  eenRowid ){.    
1bf20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d 20  uniqueNotNull = 
1bf30 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 75  1;.  }else if( u
1bf40 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 3d 3d 30 20  niqueNotNull==0 
1bf50 7c 7c 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  || i<pIdx->nColu
1bf60 6d 6e 20 29 7b 0a 20 20 20 20 75 6e 69 71 75 65  mn ){.    unique
1bf70 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 7d  NotNull = 0;.  }
1bf80 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
1bf90 65 20 6e 6f 74 20 66 6f 75 6e 64 20 61 74 20 6c  e not found at l
1bfa0 65 61 73 74 20 6f 6e 65 20 4f 52 44 45 52 20 42  east one ORDER B
1bfb0 59 20 74 65 72 6d 20 74 68 61 74 20 6d 61 74 63  Y term that matc
1bfc0 68 65 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64  hes the.  ** ind
1bfd0 65 78 2c 20 74 68 65 6e 20 73 68 6f 77 20 6e 6f  ex, then show no
1bfe0 20 70 72 6f 67 72 65 73 73 2e 20 2a 2f 0a 20 20   progress. */.  
1bff0 69 66 28 20 70 4f 42 49 74 65 6d 3d 3d 26 70 4f  if( pOBItem==&pO
1c000 72 64 65 72 42 79 2d 3e 61 5b 6e 50 72 69 6f 72  rderBy->a[nPrior
1c010 53 61 74 5d 20 29 20 72 65 74 75 72 6e 20 6e 50  Sat] ) return nP
1c020 72 69 6f 72 53 61 74 3b 0a 0a 20 20 2f 2a 20 45  riorSat;..  /* E
1c030 69 74 68 65 72 20 74 68 65 20 6f 75 74 65 72 20  ither the outer 
1c040 71 75 65 72 69 65 73 20 6d 75 73 74 20 67 65 6e  queries must gen
1c050 65 72 61 74 65 20 72 6f 77 73 20 77 68 65 72 65  erate rows where
1c060 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 77   there are no tw
1c070 6f 0a 20 20 2a 2a 20 72 6f 77 73 20 77 69 74 68  o.  ** rows with
1c080 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
1c090 20 69 6e 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   in all ORDER BY
1c0a0 20 63 6f 6c 75 6d 6e 73 2c 20 6f 72 20 65 6c 73   columns, or els
1c0b0 65 20 74 68 69 73 0a 20 20 2a 2a 20 6c 6f 6f 70  e this.  ** loop
1c0c0 20 6d 75 73 74 20 67 65 6e 65 72 61 74 65 20 6a   must generate j
1c0d0 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ust a single row
1c0e0 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 45 78 61   of output.  Exa
1c0f0 6d 70 6c 65 3a 20 20 53 75 70 70 6f 73 65 0a 20  mple:  Suppose. 
1c100 20 2a 2a 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   ** the outer lo
1c110 6f 70 73 20 67 65 6e 65 72 61 74 65 20 41 3d 31  ops generate A=1
1c120 20 61 6e 64 20 41 3d 31 2c 20 61 6e 64 20 74 68   and A=1, and th
1c130 69 73 20 6c 6f 6f 70 20 67 65 6e 65 72 61 74 65  is loop generate
1c140 73 20 42 3d 33 0a 20 20 2a 2a 20 61 6e 64 20 42  s B=3.  ** and B
1c150 3d 34 2e 20 20 54 68 65 6e 20 77 69 74 68 6f 75  =4.  Then withou
1c160 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  t the following 
1c170 74 65 73 74 2c 20 4f 52 44 45 52 20 42 59 20 41  test, ORDER BY A
1c180 2c 42 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 67  ,B would .  ** g
1c190 65 6e 65 72 61 74 65 20 74 68 65 20 77 72 6f 6e  enerate the wron
1c1a0 67 20 6f 72 64 65 72 20 6f 75 74 70 75 74 3a 20  g order output: 
1c1b0 31 2c 33 20 31 2c 34 20 31 2c 33 20 31 2c 34 0a  1,3 1,4 1,3 1,4.
1c1c0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 75 74 65 72    */.  if( outer
1c1d0 4f 62 55 6e 69 71 75 65 3d 3d 30 20 26 26 20 75  ObUnique==0 && u
1c1e0 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 3d 3d 30 20  niqueNotNull==0 
1c1f0 29 20 72 65 74 75 72 6e 20 6e 50 72 69 6f 72 53  ) return nPriorS
1c200 61 74 3b 0a 20 20 2a 70 62 4f 62 55 6e 69 71 75  at;.  *pbObUniqu
1c210 65 20 3d 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c  e = uniqueNotNul
1c220 6c 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  l;..  /* Return 
1c230 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 73 63  the necessary sc
1c240 61 6e 20 6f 72 64 65 72 20 62 61 63 6b 20 74 6f  an order back to
1c250 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
1c260 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72   *pbRev = sortOr
1c270 64 65 72 20 26 20 31 3b 0a 0a 20 20 2f 2a 20 49  der & 1;..  /* I
1c280 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22  f there was an "
1c290 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22 20  ORDER BY rowid" 
1c2a0 74 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65  term that matche
1c2b0 64 2c 20 6f 72 20 69 74 20 69 73 20 6f 6e 6c 79  d, or it is only
1c2c0 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66  .  ** possible f
1c2d0 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  or a single row 
1c2e0 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20  from this table 
1c2f0 74 6f 20 6d 61 74 63 68 2c 20 74 68 65 6e 20 73  to match, then s
1c300 6b 69 70 20 6f 76 65 72 0a 20 20 2a 2a 20 61 6e  kip over.  ** an
1c310 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 4f 52 44  y additional ORD
1c320 45 52 20 42 59 20 74 65 72 6d 73 20 64 65 61 6c  ER BY terms deal
1c330 69 6e 67 20 77 69 74 68 20 74 68 69 73 20 74 61  ing with this ta
1c340 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
1c350 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 29 7b  uniqueNotNull ){
1c360 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
1c370 6a 20 6f 76 65 72 20 61 64 64 69 74 69 6f 6e 61  j over additiona
1c380 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
1c390 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1c3a0 20 62 61 73 65 20 2a 2f 0a 20 20 20 20 57 68 65   base */.    Whe
1c3b0 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 53 20 3d  reMaskSet *pMS =
1c3c0 20 70 2d 3e 70 57 43 2d 3e 70 4d 61 73 6b 53 65   p->pWC->pMaskSe
1c3d0 74 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  t;.    Bitmask m
1c3e0 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 53 2c   = ~getMask(pMS,
1c3f0 20 62 61 73 65 29 3b 0a 20 20 20 20 77 68 69 6c   base);.    whil
1c400 65 28 20 6a 3c 6e 54 65 72 6d 20 26 26 20 28 65  e( j<nTerm && (e
1c410 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
1c420 53 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a  S, pOrderBy->a[j
1c430 5d 2e 70 45 78 70 72 29 26 6d 29 3d 3d 30 20 29  ].pExpr)&m)==0 )
1c440 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1c450 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c460 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  j;.}../*.** Find
1c470 20 74 68 65 20 62 65 73 74 20 71 75 65 72 79 20   the best query 
1c480 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69  plan for accessi
1c490 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ng a particular 
1c4a0 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74 68  table.  Write th
1c4b0 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
1c4c0 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
1c4d0 74 20 69 6e 74 6f 20 74 68 65 20 70 2d 3e 63 6f  t into the p->co
1c4e0 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f  st..**.** The lo
1c4f0 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20 77  west cost plan w
1c500 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69  ins.  The cost i
1c510 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1c520 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a   the amount of.*
1c530 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49  * CPU and disk I
1c540 2f 4f 20 6e 65 65 64 65 64 20 74 6f 20 70 72 6f  /O needed to pro
1c550 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74  cess the request
1c560 65 64 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 46 61  ed result..** Fa
1c570 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75  ctors that influ
1c580 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64  ence cost includ
1c590 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54  e:.**.**    *  T
1c5a0 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
1c5b0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
1c5c0 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76   will be retriev
1c5d0 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20  ed.  (The.**    
1c5e0 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74     fewer the bet
1c5f0 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ter.).**.**    *
1c600 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
1c610 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63   sorting must oc
1c620 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  cur..**.**    * 
1c630 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
1c640 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65  there must be se
1c650 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69  parate lookups i
1c660 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69  n the.**       i
1c670 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20  ndex and in the 
1c680 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  main table..**.*
1c690 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1c6a0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
1c6b0 75 73 65 20 28 70 53 72 63 2d 3e 70 49 6e 64 65  use (pSrc->pInde
1c6c0 78 29 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  x) attached to t
1c6d0 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  he table in.** t
1c6e0 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1c6f0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1c700 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64  tion only consid
1c710 65 72 73 20 70 6c 61 6e 73 20 75 73 69 6e 67 20  ers plans using 
1c720 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e  the .** named in
1c730 64 65 78 2e 20 49 66 20 6e 6f 20 73 75 63 68 20  dex. If no such 
1c740 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74  plan is found, t
1c750 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64  hen the returned
1c760 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c 49   cost is.** SQLI
1c770 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20 61  TE_BIG_DBL. If a
1c780 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 20 74   plan is found t
1c790 68 61 74 20 75 73 65 73 20 74 68 65 20 6e 61 6d  hat uses the nam
1c7a0 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68  ed index, .** th
1c7b0 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 63  en the cost is c
1c7c0 61 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68 65  alculated in the
1c7d0 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a   usual way..**.*
1c7e0 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45 58  * If a NOT INDEX
1c7f0 45 44 20 63 6c 61 75 73 65 20 77 61 73 20 61 74  ED clause was at
1c800 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61  tached to the ta
1c810 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53  ble .** in the S
1c820 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1c830 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73   then no indexes
1c840 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
1c850 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 2a   However, the .*
1c860 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 20  * selected plan 
1c870 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61  may still take a
1c880 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
1c890 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20 70  built-in rowid p
1c8a0 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69 6e  rimary key.** in
1c8b0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
1c8c0 6f 69 64 20 62 65 73 74 42 74 72 65 65 49 6e 64  oid bestBtreeInd
1c8d0 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20  ex(WhereBestIdx 
1c8e0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
1c8f0 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
1c900 3b 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e  ;  /* The parsin
1c910 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1c920 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
1c930 3d 20 70 2d 3e 70 57 43 3b 20 20 2f 2a 20 54 68  = p->pWC;  /* Th
1c940 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1c950 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1c960 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20  st_item *pSrc = 
1c970 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65 20  p->pSrc; /* The 
1c980 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1c990 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
1c9a0 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d  int iCur = pSrc-
1c9b0 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54  >iCursor;   /* T
1c9c0 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
1c9d0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63   table to be acc
1c9e0 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  essed */.  Index
1c9f0 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20   *pProbe;       
1ca00 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1ca10 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  ex we are evalua
1ca20 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ting */.  Index 
1ca30 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
1ca40 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
1ca50 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72 6f   pProbe, or zero
1ca60 20 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20 2a   for IPK index *
1ca70 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61  /.  int eqTermMa
1ca80 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1ca90 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b 20  /* Current mask 
1caa0 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74  of valid equalit
1cab0 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  y operators */. 
1cac0 20 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d 61   int idxEqTermMa
1cad0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  sk;          /* 
1cae0 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76 61  Index mask of va
1caf0 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  lid equality ope
1cb00 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64 65  rators */.  Inde
1cb10 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20  x sPk;          
1cb20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b          /* A fak
1cb30 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e index object f
1cb40 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  or the primary k
1cb50 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  ey */.  tRowcnt 
1cb60 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
1cb70 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
1cb80 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  Est[] value for 
1cb90 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
1cba0 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50  .  int aiColumnP
1cbb0 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f  k = -1;        /
1cbc0 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20  * The aColumn[] 
1cbd0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
1cbe0 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  k index */.  int
1cbf0 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20 20   wsFlagMask;    
1cc00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
1cc10 77 65 64 20 66 6c 61 67 73 20 69 6e 20 70 2d 3e  wed flags in p->
1cc20 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
1cc30 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 69 6f 72   */.  int nPrior
1cc40 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sat;            
1cc50 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
1cc60 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62 79  rms satisfied by
1cc70 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   outer loops */.
1cc80 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cca0 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
1ccb0 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 63   BY terms */.  c
1ccc0 68 61 72 20 62 53 6f 72 74 49 6e 69 74 3b 20 20  har bSortInit;  
1ccd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1cce0 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 62 53  itializer for bS
1ccf0 6f 72 74 20 69 6e 20 69 6e 6e 65 72 20 6c 6f 6f  ort in inner loo
1cd00 70 20 2a 2f 0a 20 20 63 68 61 72 20 62 44 69 73  p */.  char bDis
1cd10 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  tInit;          
1cd20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1cd30 72 20 66 6f 72 20 62 44 69 73 74 20 69 6e 20 69  r for bDist in i
1cd40 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 0a 0a 20  nner loop */... 
1cd50 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1cd60 68 65 20 63 6f 73 74 20 74 6f 20 61 20 77 6f 72  he cost to a wor
1cd70 73 74 2d 63 61 73 65 20 76 61 6c 75 65 20 2a 2f  st-case value */
1cd80 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 63 6f  .  memset(&p->co
1cd90 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  st, 0, sizeof(p-
1cda0 3e 63 6f 73 74 29 29 3b 0a 20 20 70 2d 3e 63 6f  >cost));.  p->co
1cdb0 73 74 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54  st.rCost = SQLIT
1cdc0 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a  E_BIG_DBL;..  /*
1cdd0 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62   If the pSrc tab
1cde0 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20  le is the right 
1cdf0 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
1ce00 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79  JOIN then we may
1ce10 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e   not.  ** use an
1ce20 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66   index to satisf
1ce30 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  y IS NULL constr
1ce40 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61  aints on that ta
1ce50 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20  ble.  This is.  
1ce60 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d  ** because colum
1ce70 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ns might end up 
1ce80 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68  being NULL if th
1ce90 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
1cea0 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20   match -.  ** a 
1ceb0 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69  circumstance whi
1cec0 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  ch the index can
1ced0 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63  not help us disc
1cee0 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32  over.  Ticket #2
1cef0 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  177..  */.  if( 
1cf00 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  pSrc->jointype &
1cf10 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20   JT_LEFT ){.    
1cf20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20  idxEqTermMask = 
1cf30 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d  WO_EQ|WO_IN;.  }
1cf40 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 45 71 54  else{.    idxEqT
1cf50 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c  ermMask = WO_EQ|
1cf60 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b  WO_IN|WO_ISNULL;
1cf70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72 63  .  }..  if( pSrc
1cf80 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
1cf90 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
1cfa0 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
1cfb0 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
1cfc0 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
1cfd0 20 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62 65     pIdx = pProbe
1cfe0 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b   = pSrc->pIndex;
1cff0 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20  .    wsFlagMask 
1d000 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f  = ~(WHERE_ROWID_
1d010 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
1d020 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72  ANGE);.    eqTer
1d030 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72  mMask = idxEqTer
1d040 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mMask;.  }else{.
1d050 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
1d060 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
1d070 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20  ause.  Create a 
1d080 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63  fake Index objec
1d090 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a  t in local.    *
1d0a0 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74  * variable sPk t
1d0b0 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
1d0c0 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1d0d0 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74  y index.  Make t
1d0e0 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20  his.    ** fake 
1d0f0 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20  index the first 
1d100 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e  in a chain of In
1d110 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68  dex objects with
1d120 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c   all of the real
1d130 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  .    ** indices 
1d140 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20  to follow */.   
1d150 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20   Index *pFirst; 
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d170 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61   /* First of rea
1d180 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
1d190 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65   table */.    me
1d1a0 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69  mset(&sPk, 0, si
1d1b0 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
1d1c0 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
1d1d0 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
1d1e0 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
1d1f0 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
1d200 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
1d210 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
1d220 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
1d230 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
1d240 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20   pSrc->pTab;.   
1d250 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
1d260 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f   pSrc->pTab->nRo
1d270 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  wEst;.    aiRowE
1d280 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20  stPk[1] = 1;.   
1d290 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
1d2a0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1d2b0 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49    if( pSrc->notI
1d2c0 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
1d2d0 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
1d2e0 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
1d2f0 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
1d300 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
1d310 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
1d320 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
1d330 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
1d340 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1d350 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
1d360 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
1d370 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
1d380 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61  Pk;.    wsFlagMa
1d390 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20 20  sk = ~(.        
1d3a0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
1d3b0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
1d3c0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
1d3d0 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  L|WHERE_COLUMN_R
1d3e0 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  ANGE.    );.    
1d3f0 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  eqTermMask = WO_
1d400 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49  EQ|WO_IN;.    pI
1d410 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 6e  dx = 0;.  }..  n
1d420 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1d430 64 65 72 42 79 20 3f 20 70 2d 3e 70 4f 72 64 65  derBy ? p->pOrde
1d440 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  rBy->nExpr : 0;.
1d450 20 20 69 66 28 20 70 2d 3e 69 20 29 7b 0a 20 20    if( p->i ){.  
1d460 20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 70 2d    nPriorSat = p-
1d470 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e  >aLevel[p->i-1].
1d480 70 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20 20  plan.nOBSat;.   
1d490 20 62 53 6f 72 74 49 6e 69 74 20 3d 20 6e 50 72   bSortInit = nPr
1d4a0 69 6f 72 53 61 74 3c 6e 4f 72 64 65 72 42 79 3b  iorSat<nOrderBy;
1d4b0 0a 20 20 20 20 62 44 69 73 74 49 6e 69 74 20 3d  .    bDistInit =
1d4c0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1d4d0 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 30 3b 0a   nPriorSat = 0;.
1d4e0 20 20 20 20 62 53 6f 72 74 49 6e 69 74 20 3d 20      bSortInit = 
1d4f0 6e 4f 72 64 65 72 42 79 3e 30 3b 0a 20 20 20 20  nOrderBy>0;.    
1d500 62 44 69 73 74 49 6e 69 74 20 3d 20 70 2d 3e 70  bDistInit = p->p
1d510 44 69 73 74 69 6e 63 74 21 3d 30 3b 0a 20 20 7d  Distinct!=0;.  }
1d520 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
1d530 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f   all indices loo
1d540 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73  king for the bes
1d550 74 20 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a  t one to use.  *
1d560 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65  /.  for(; pProbe
1d570 3b 20 70 49 64 78 3d 70 50 72 6f 62 65 3d 70 50  ; pIdx=pProbe=pP
1d580 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  robe->pNext){.  
1d590 20 20 63 6f 6e 73 74 20 74 52 6f 77 63 6e 74 20    const tRowcnt 
1d5a0 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45 73 74  * const aiRowEst
1d5b0 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
1d5c0 45 73 74 3b 0a 20 20 20 20 57 68 65 72 65 43 6f  Est;.    WhereCo
1d5d0 73 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  st pc;          
1d5e0 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
1d5f0 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a  using pProbe */.
1d600 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 67 31 30      double log10
1d610 4e 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 20 20  N = (double)1;  
1d620 2f 2a 20 62 61 73 65 2d 31 30 20 6c 6f 67 61 72  /* base-10 logar
1d630 69 74 68 6d 20 6f 66 20 6e 52 6f 77 20 28 69 6e  ithm of nRow (in
1d640 65 78 61 63 74 29 20 2a 2f 0a 0a 20 20 20 20 2f  exact) */..    /
1d650 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1d660 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 70 6f  variables are po
1d670 70 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  pulated based on
1d680 20 74 68 65 20 70 72 6f 70 65 72 74 69 65 73 20   the properties 
1d690 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  of.    ** index 
1d6a0 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 2e  being evaluated.
1d6b0 20 54 68 65 79 20 61 72 65 20 74 68 65 6e 20 75   They are then u
1d6c0 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
1d6d0 20 74 68 65 20 65 78 70 65 63 74 65 64 0a 20 20   the expected.  
1d6e0 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20 6e 75    ** cost and nu
1d6f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74  mber of rows ret
1d700 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  urned..    **.  
1d710 20 20 2a 2a 20 20 70 63 2e 70 6c 61 6e 2e 6e 45    **  pc.plan.nE
1d720 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75  q: .    **    Nu
1d730 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
1d740 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20   terms that can 
1d750 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  be implemented u
1d760 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 0a  sing the index..
1d770 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68      **    In oth
1d780 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6e 75  er words, the nu
1d790 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61 6c 20  mber of initial 
1d7a0 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 69 6e  fields in the in
1d7b0 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  dex that.    ** 
1d7c0 20 20 20 61 72 65 20 75 73 65 64 20 69 6e 20 3d     are used in =
1d7d0 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e  = or IN or NOT N
1d7e0 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
1d7f0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1d800 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  use..    **.    
1d810 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20  **  nInMul:  .  
1d820 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d    **    The "in-
1d830 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69  multiplier". Thi
1d840 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  s is an estimate
1d850 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65   of how many see
1d860 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20  k operations .  
1d870 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d    **    SQLite m
1d880 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74  ust perform on t
1d890 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73  he index in ques
1d8a0 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tion. For exampl
1d8b0 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
1d8c0 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73  *    WHERE claus
1d8d0 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e is:.    **.   
1d8e0 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61   **      WHERE a
1d8f0 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e   IN (1, 2, 3) AN
1d900 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29  D b IN (4, 5, 6)
1d910 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d920 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65    SQLite must pe
1d930 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20  rform 9 lookups 
1d940 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  on an index on (
1d950 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c  a, b), so nInMul
1d960 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73   is .    **    s
1d970 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74  et to 9. Given t
1d980 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61  he same schema a
1d990 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  nd either of the
1d9a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45   following WHERE
1d9b0 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75   .    **    clau
1d9c0 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ses:.    **.    
1d9d0 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
1d9e0 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  =  1.    **     
1d9f0 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20   WHERE a >= 2.  
1da00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e    **.    **    n
1da10 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20  InMul is set to 
1da20 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  1..    **.    **
1da30 20 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69      If there exi
1da40 73 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d  sts a WHERE term
1da50 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
1da60 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1da70 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20  , then .    **  
1da80 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74    the sub-select
1da90 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72   is assumed to r
1daa0 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f  eturn 25 rows fo
1dab0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
1dac0 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74  f .    **    det
1dad0 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e  ermining nInMul.
1dae0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1daf0 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a  bInEst:  .    **
1db00 20 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20      Set to true 
1db10 69 66 20 74 68 65 72 65 20 77 61 73 20 61 74 20  if there was at 
1db20 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20  least one "x IN 
1db30 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65  (SELECT ...)" te
1db40 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20  rm used .    ** 
1db50 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e     in determinin
1db60 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  g the value of n
1db70 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61  InMul.  Note tha
1db80 74 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  t the RHS of the
1db90 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70  .    **    IN op
1dba0 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 61  erator must be a
1dbb0 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76   SELECT, not a v
1dbc0 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72 20 74  alue list, for t
1dbd0 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20 20 20  his variable.   
1dbe0 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74 72 75   **    to be tru
1dbf0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1dc00 20 20 72 61 6e 67 65 44 69 76 3a 0a 20 20 20 20    rangeDiv:.    
1dc10 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d 61 74  **    An estimat
1dc20 65 20 6f 66 20 61 20 64 69 76 69 73 6f 72 20 62  e of a divisor b
1dc30 79 20 77 68 69 63 68 20 74 6f 20 72 65 64 75 63  y which to reduc
1dc40 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
1dc50 63 65 20 64 75 65 0a 20 20 20 20 2a 2a 20 20 20  ce due.    **   
1dc60 20 74 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63   to inequality c
1dc70 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 49 6e 20  onstraints.  In 
1dc80 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
1dc90 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c  qlite_stat3 ANAL
1dca0 59 5a 45 0a 20 20 20 20 2a 2a 20 20 20 20 64 61  YZE.    **    da
1dcb0 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65  ta, a single ine
1dcc0 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
1dcd0 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
1dce0 20 74 6f 20 31 2f 34 72 64 20 69 74 73 0a 20 20   to 1/4rd its.  
1dcf0 20 20 2a 2a 20 20 20 20 6f 72 69 67 69 6e 61 6c    **    original
1dd00 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69 76 3d   size (rangeDiv=
1dd10 3d 34 29 2e 20 20 54 77 6f 20 69 6e 65 71 75 61  =4).  Two inequa
1dd20 6c 69 74 69 65 73 20 72 65 64 75 63 65 20 74 68  lities reduce th
1dd30 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20  e search.    ** 
1dd40 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f 31 36     space to 1/16
1dd50 74 68 20 6f 66 20 69 74 73 20 6f 72 69 67 69 6e  th of its origin
1dd60 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69  al size (rangeDi
1dd70 76 3d 3d 31 36 29 2e 0a 20 20 20 20 2a 2a 0a 20  v==16)..    **. 
1dd80 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20     **  bSort:   
1dd90 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65  .    **    Boole
1dda0 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68 65 72  an. True if ther
1ddb0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1ddc0 20 63 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c   clause that wil
1ddd0 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20  l require an .  
1dde0 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c    **    external
1ddf0 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63 61 6e   sort (i.e. scan
1de00 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 62  ning the index b
1de10 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 77  eing evaluated w
1de20 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20  ill not .    ** 
1de30 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f 72 64     correctly ord
1de40 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20 20 20  er records)..   
1de50 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 44 69 73   **.    **  bDis
1de60 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f  t:.    **    Boo
1de70 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68  lean. True if th
1de80 65 72 65 20 69 73 20 61 20 44 49 53 54 49 4e 43  ere is a DISTINC
1de90 54 20 63 6c 61 75 73 65 20 74 68 61 74 20 77 69  T clause that wi
1dea0 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20  ll require an . 
1deb0 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61     **    externa
1dec0 6c 20 62 74 72 65 65 2e 0a 20 20 20 20 2a 2a 0a  l btree..    **.
1ded0 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a      **  bLookup:
1dee0 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c   .    **    Bool
1def0 65 61 6e 2e 20 54 72 75 65 20 69 66 20 61 20 74  ean. True if a t
1df00 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 69 73 20 72  able lookup is r
1df10 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
1df20 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 20 20 20   index entry.   
1df30 20 2a 2a 20 20 20 20 76 69 73 69 74 65 64 2e 20   **    visited. 
1df40 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1df50 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
1df60 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e 67 20   not a covering 
1df70 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20 20  index..    **   
1df80 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
1df90 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 72 6f  false for the ro
1dfa0 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
1dfb0 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65  index of a table
1dfc0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f 72 20  ..    **    For 
1dfd0 6f 74 68 65 72 20 69 6e 64 65 78 65 73 2c 20 69  other indexes, i
1dfe0 74 20 69 73 20 74 72 75 65 20 75 6e 6c 65 73 73  t is true unless
1dff0 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 73   all the columns
1e000 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   of the table.  
1e010 20 20 2a 2a 20 20 20 20 75 73 65 64 20 62 79 20    **    used by 
1e020 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1e030 6d 65 6e 74 20 61 72 65 20 70 72 65 73 65 6e 74  ment are present
1e040 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 28 73   in the index (s
1e050 75 63 68 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  uch an.    **   
1e060 20 69 6e 64 65 78 20 69 73 20 73 6f 6d 65 74 69   index is someti
1e070 6d 65 73 20 64 65 73 63 72 69 62 65 64 20 61 73  mes described as
1e080 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1e090 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f  x)..    **    Fo
1e0a0 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e  r example, given
1e0b0 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 28 61   the index on (a
1e0c0 2c 20 62 29 2c 20 74 68 65 20 73 65 63 6f 6e 64  , b), the second
1e0d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1e0e0 67 20 0a 20 20 20 20 2a 2a 20 20 20 20 74 77 6f  g .    **    two
1e0f0 20 71 75 65 72 69 65 73 20 72 65 71 75 69 72 65   queries require
1e100 73 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6c  s table b-tree l
1e110 6f 6f 6b 75 70 73 20 69 6e 20 6f 72 64 65 72 20  ookups in order 
1e120 74 6f 20 66 69 6e 64 20 74 68 65 20 76 61 6c 75  to find the valu
1e130 65 0a 20 20 20 20 2a 2a 20 20 20 20 6f 66 20 63  e.    **    of c
1e140 6f 6c 75 6d 6e 20 63 2c 20 62 75 74 20 74 68 65  olumn c, but the
1e150 20 66 69 72 73 74 20 64 6f 65 73 20 6e 6f 74 20   first does not 
1e160 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20  because columns 
1e170 61 20 61 6e 64 20 62 20 61 72 65 0a 20 20 20 20  a and b are.    
1e180 2a 2a 20 20 20 20 62 6f 74 68 20 61 76 61 69 6c  **    both avail
1e190 61 62 6c 65 20 69 6e 20 74 68 65 20 69 6e 64 65  able in the inde
1e1a0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c               SEL
1e1c0 45 43 54 20 61 2c 20 62 20 20 20 20 46 52 4f 4d  ECT a, b    FROM
1e1d0 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31   tbl WHERE a = 1
1e1e0 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ;.    **        
1e1f0 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62       SELECT a, b
1e200 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57 48 45  , c FROM tbl WHE
1e210 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2f  RE a = 1;.    */
1e220 0a 20 20 20 20 69 6e 74 20 62 49 6e 45 73 74 20  .    int bInEst 
1e230 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1e240 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 78     /* True if "x
1e250 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22   IN (SELECT...)"
1e260 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   seen */.    int
1e270 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b 20 20 20 20   nInMul = 1;    
1e280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1e290 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74  mber of distinct
1e2a0 20 65 71 75 61 6c 69 74 69 65 73 20 74 6f 20 6c   equalities to l
1e2b0 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 64 6f 75  ookup */.    dou
1e2c0 62 6c 65 20 72 61 6e 67 65 44 69 76 20 3d 20 28  ble rangeDiv = (
1e2d0 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a 20 45 73  double)1;  /* Es
1e2e0 74 69 6d 61 74 65 64 20 72 65 64 75 63 74 69 6f  timated reductio
1e2f0 6e 20 69 6e 20 73 65 61 72 63 68 20 73 70 61 63  n in search spac
1e300 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 6f  e */.    int nBo
1e310 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  und = 0;        
1e320 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e330 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
1e340 61 69 6e 74 73 20 73 65 65 6e 20 2a 2f 0a 20 20  aints seen */.  
1e350 20 20 63 68 61 72 20 62 53 6f 72 74 20 3d 20 62    char bSort = b
1e360 53 6f 72 74 49 6e 69 74 3b 20 20 20 20 20 20 20  SortInit;       
1e370 2f 2a 20 54 72 75 65 20 69 66 20 65 78 74 65 72  /* True if exter
1e380 6e 61 6c 20 73 6f 72 74 20 72 65 71 75 69 72 65  nal sort require
1e390 64 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62 44  d */.    char bD
1e3a0 69 73 74 20 3d 20 62 44 69 73 74 49 6e 69 74 3b  ist = bDistInit;
1e3b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e3c0 66 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68  f index cannot h
1e3d0 65 6c 70 20 77 69 74 68 20 44 49 53 54 49 4e 43  elp with DISTINC
1e3e0 54 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62 4c  T */.    char bL
1e3f0 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20 20 20 20  ookup = 0;      
1e400 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e410 66 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e 67  f not a covering
1e420 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 57 68   index */.    Wh
1e430 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1e440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1e450 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
1e460 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1e470 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1e480 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
1e490 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 46     WhereTerm *pF
1e4a0 69 72 73 74 54 65 72 6d 20 3d 20 30 3b 20 20 20  irstTerm = 0;   
1e4b0 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6d   /* First term m
1e4c0 61 74 63 68 69 6e 67 20 74 68 65 20 69 6e 64 65  atching the inde
1e4d0 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20  x */.#endif..   
1e4e0 20 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20   WHERETRACE((.  
1e4f0 20 20 20 20 22 20 20 20 25 73 28 25 73 29 3a 5c      "   %s(%s):\
1e500 6e 22 2c 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  n",.      pSrc->
1e510 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49  pTab->zName, (pI
1e520 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  dx ? pIdx->zName
1e530 20 3a 20 22 69 70 6b 22 29 0a 20 20 20 20 29 29   : "ipk").    ))
1e540 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 63  ;.    memset(&pc
1e550 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 63 29 29  , 0, sizeof(pc))
1e560 3b 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f  ;.    pc.plan.nO
1e570 42 53 61 74 20 3d 20 6e 50 72 69 6f 72 53 61 74  BSat = nPriorSat
1e580 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  ;..    /* Determ
1e590 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ine the values o
1e5a0 66 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 20 61 6e  f pc.plan.nEq an
1e5b0 64 20 6e 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20  d nInMul */.    
1e5c0 66 6f 72 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d  for(pc.plan.nEq=
1e5d0 30 3b 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3c 70  0; pc.plan.nEq<p
1e5e0 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Probe->nColumn; 
1e5f0 70 63 2e 70 6c 61 6e 2e 6e 45 71 2b 2b 29 7b 0a  pc.plan.nEq++){.
1e600 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
1e610 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  robe->aiColumn[p
1e620 63 2e 70 6c 61 6e 2e 6e 45 71 5d 3b 0a 20 20 20  c.plan.nEq];.   
1e630 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
1e640 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
1e650 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 65  , p->notReady, e
1e660 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29  qTermMask, pIdx)
1e670 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1e680 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
1e690 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
1e6a0 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f  ags |= (WHERE_CO
1e6b0 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f  LUMN_EQ|WHERE_RO
1e6c0 57 49 44 5f 45 51 29 3b 0a 20 20 20 20 20 20 74  WID_EQ);.      t
1e6d0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1e6e0 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20 20  pWC!=pWC );.    
1e6f0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
1e700 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1e710 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1e720 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
1e730 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 63  Expr;.        pc
1e740 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
1e750 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
1e760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
1e770 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e780 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1e790 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
1e7a0 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
1e7b0 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d 65 20   ...)":  Assume 
1e7c0 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72  the SELECT retur
1e7d0 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
1e7e0 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a          nInMul *
1e7f0 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 20 20  = 25;.          
1e800 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20 20 20  bInEst = 1;.    
1e810 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
1e820 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
1e830 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
1e840 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
1e850 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 78  .          /* "x
1e860 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
1e870 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20  e, ...)" */.    
1e880 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20        nInMul *= 
1e890 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1e8a0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  nExpr;.        }
1e8b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e8c0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1e8d0 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  r & WO_ISNULL ){
1e8e0 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  .        pc.plan
1e8f0 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1e900 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
1e910 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
1e920 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1e930 33 0a 20 20 20 20 20 20 69 66 28 20 70 63 2e 70  3.      if( pc.p
1e940 6c 61 6e 2e 6e 45 71 3d 3d 30 20 26 26 20 70 50  lan.nEq==0 && pP
1e950 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65 20 29 20  robe->aSample ) 
1e960 70 46 69 72 73 74 54 65 72 6d 20 3d 20 70 54 65  pFirstTerm = pTe
1e970 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  rm;.#endif.     
1e980 20 70 63 2e 75 73 65 64 20 7c 3d 20 70 54 65 72   pc.used |= pTer
1e990 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1e9a0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 49      }. .    /* I
1e9b0 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  f the index bein
1e9c0 67 20 63 6f 6e 73 69 64 65 72 65 64 20 69 73 20  g considered is 
1e9d0 55 4e 49 51 55 45 2c 20 61 6e 64 20 74 68 65 72  UNIQUE, and ther
1e9e0 65 20 69 73 20 61 6e 20 65 71 75 61 6c 69 74 79  e is an equality
1e9f0 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61   .    ** constra
1ea00 69 6e 74 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75  int for all colu
1ea10 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
1ea20 2c 20 74 68 65 6e 20 74 68 69 73 20 73 65 61 72  , then this sear
1ea30 63 68 20 77 69 6c 6c 20 66 69 6e 64 0a 20 20 20  ch will find.   
1ea40 20 2a 2a 20 61 74 20 6d 6f 73 74 20 61 20 73 69   ** at most a si
1ea50 6e 67 6c 65 20 72 6f 77 2e 20 49 6e 20 74 68 69  ngle row. In thi
1ea60 73 20 63 61 73 65 20 73 65 74 20 74 68 65 20 57  s case set the W
1ea70 48 45 52 45 5f 55 4e 49 51 55 45 20 66 6c 61 67  HERE_UNIQUE flag
1ea80 20 74 6f 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   to .    ** indi
1ea90 63 61 74 65 20 74 68 69 73 20 74 6f 20 74 68 65  cate this to the
1eaa0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a   caller..    **.
1eab0 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
1eac0 2c 20 69 66 20 74 68 65 20 73 65 61 72 63 68 20  , if the search 
1ead0 6d 61 79 20 66 69 6e 64 20 6d 6f 72 65 20 74 68  may find more th
1eae0 61 6e 20 6f 6e 65 20 72 6f 77 2c 20 74 65 73 74  an one row, test
1eaf0 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a   to see if.    *
1eb00 2a 20 74 68 65 72 65 20 69 73 20 61 20 72 61 6e  * there is a ran
1eb10 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ge constraint on
1eb20 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
1eb30 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 2b 31 29 20  (pc.plan.nEq+1) 
1eb40 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 6e 20  that.    ** can 
1eb50 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  be optimized usi
1eb60 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 20 0a 20  ng the index. . 
1eb70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63     */.    if( pc
1eb80 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 70 50 72 6f 62  .plan.nEq==pProb
1eb90 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 50  e->nColumn && pP
1eba0 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  robe->onError!=O
1ebb0 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  E_None ){.      
1ebc0 74 65 73 74 63 61 73 65 28 20 70 63 2e 70 6c 61  testcase( pc.pla
1ebd0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1ebe0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20  E_COLUMN_IN );. 
1ebf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ec00 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  c.plan.wsFlags &
1ec10 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
1ec20 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LL );.      if( 
1ec30 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  (pc.plan.wsFlags
1ec40 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
1ec50 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
1ec60 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20  _NULL))==0 ){.  
1ec70 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
1ec80 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55  Flags |= WHERE_U
1ec90 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 69  NIQUE;.        i
1eca0 66 28 20 70 2d 3e 69 3d 3d 30 20 7c 7c 20 28 70  f( p->i==0 || (p
1ecb0 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
1ecc0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1ecd0 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45  WHERE_ALL_UNIQUE
1ece0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1ecf0 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67    pc.plan.wsFlag
1ed00 73 20 7c 3d 20 57 48 45 52 45 5f 41 4c 4c 5f 55  s |= WHERE_ALL_U
1ed10 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 7d  NIQUE;.        }
1ed20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1ed30 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62  se if( pProbe->b
1ed40 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20 29 7b 0a  Unordered==0 ){.
1ed50 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1ed60 20 20 20 6a 20 3d 20 28 70 63 2e 70 6c 61 6e 2e     j = (pc.plan.
1ed70 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq==pProbe->nCo
1ed80 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20 70 50 72 6f  lumn ? -1 : pPro
1ed90 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 63 2e  be->aiColumn[pc.
1eda0 70 6c 61 6e 2e 6e 45 71 5d 29 3b 0a 20 20 20 20  plan.nEq]);.    
1edb0 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
1edc0 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e  WC, iCur, j, p->
1edd0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
1ede0 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
1edf0 45 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20  E, pIdx) ){.    
1ee00 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1ee10 54 6f 70 2c 20 2a 70 42 74 6d 3b 0a 20 20 20 20  Top, *pBtm;.    
1ee20 20 20 20 20 70 54 6f 70 20 3d 20 66 69 6e 64 54      pTop = findT
1ee30 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
1ee40 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 57  , p->notReady, W
1ee50 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78  O_LT|WO_LE, pIdx
1ee60 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 6d 20  );.        pBtm 
1ee70 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1ee80 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52  iCur, j, p->notR
1ee90 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
1eea0 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  E, pIdx);.      
1eeb0 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e    whereRangeScan
1eec0 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
1eed0 62 65 2c 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 2c  be, pc.plan.nEq,
1eee0 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72 61   pBtm, pTop, &ra
1eef0 6e 67 65 44 69 76 29 3b 0a 20 20 20 20 20 20 20  ngeDiv);.       
1ef00 20 69 66 28 20 70 54 6f 70 20 29 7b 0a 20 20 20   if( pTop ){.   
1ef10 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d 20         nBound = 
1ef20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e  1;.          pc.
1ef30 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
1ef40 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
1ef50 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 75 73  .          pc.us
1ef60 65 64 20 7c 3d 20 70 54 6f 70 2d 3e 70 72 65 72  ed |= pTop->prer
1ef70 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
1ef80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
1ef90 70 2d 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20  p->pWC!=pWC );. 
1efa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1efb0 20 69 66 28 20 70 42 74 6d 20 29 7b 0a 20 20 20   if( pBtm ){.   
1efc0 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b         nBound++;
1efd0 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c  .          pc.pl
1efe0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1eff0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
1f000 20 20 20 20 20 20 20 20 20 70 63 2e 75 73 65 64           pc.used
1f010 20 7c 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65 71   |= pBtm->prereq
1f020 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
1f030 20 74 65 73 74 63 61 73 65 28 20 70 42 74 6d 2d   testcase( pBtm-
1f040 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20  >pWC!=pWC );.   
1f050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1f060 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1f070 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  = (WHERE_COLUMN_
1f080 52 41 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57 49  RANGE|WHERE_ROWI
1f090 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 20 20  D_RANGE);.      
1f0a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1f0b0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1f0c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1f0d0 6e 64 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  nd the index bei
1f0e0 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 77 69  ng considered wi
1f0f0 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72 61  ll.    ** natura
1f100 6c 6c 79 20 73 63 61 6e 20 72 6f 77 73 20 69 6e  lly scan rows in
1f110 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6f 72   the required or
1f120 64 65 72 2c 20 73 65 74 20 74 68 65 20 61 70 70  der, set the app
1f130 72 6f 70 72 69 61 74 65 20 66 6c 61 67 73 0a 20  ropriate flags. 
1f140 20 20 20 2a 2a 20 69 6e 20 70 63 2e 70 6c 61 6e     ** in pc.plan
1f150 2e 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77  .wsFlags. Otherw
1f160 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 69 73  ise, if there is
1f170 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1f180 75 73 65 20 62 75 74 0a 20 20 20 20 2a 2a 20 74  use but.    ** t
1f190 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 73 63  he index will sc
1f1a0 61 6e 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66  an rows in a dif
1f1b0 66 65 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65  ferent order, se
1f1c0 74 20 74 68 65 20 62 53 6f 72 74 0a 20 20 20 20  t the bSort.    
1f1d0 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
1f1e0 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 26  .    if( bSort &
1f1f0 26 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  & (pSrc->jointyp
1f200 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20  e & JT_LEFT)==0 
1f210 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 52 65  ){.      int bRe
1f220 76 20 3d 20 32 3b 0a 20 20 20 20 20 20 69 6e 74  v = 2;.      int
1f230 20 62 4f 62 55 6e 69 71 75 65 20 3d 20 30 3b 0a   bObUnique = 0;.
1f240 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1f250 28 28 22 20 20 20 20 20 20 2d 2d 3e 20 62 65 66  (("      --> bef
1f260 6f 72 65 20 69 73 53 6f 72 74 49 6e 64 65 78 3a  ore isSortIndex:
1f270 20 6e 50 72 69 6f 72 53 61 74 3d 25 64 5c 6e 22   nPriorSat=%d\n"
1f280 2c 6e 50 72 69 6f 72 53 61 74 29 29 3b 0a 20 20  ,nPriorSat));.  
1f290 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53      pc.plan.nOBS
1f2a0 61 74 20 3d 20 69 73 53 6f 72 74 69 6e 67 49 6e  at = isSortingIn
1f2b0 64 65 78 28 70 2c 20 70 50 72 6f 62 65 2c 20 69  dex(p, pProbe, i
1f2c0 43 75 72 2c 20 26 62 52 65 76 2c 20 26 62 4f 62  Cur, &bRev, &bOb
1f2d0 55 6e 69 71 75 65 29 3b 0a 20 20 20 20 20 20 57  Unique);.      W
1f2e0 48 45 52 45 54 52 41 43 45 28 28 22 20 20 20 20  HERETRACE(("    
1f2f0 20 20 2d 2d 3e 20 61 66 74 65 72 20 20 69 73 53    --> after  isS
1f300 6f 72 74 49 6e 64 65 78 3a 20 62 52 65 76 3d 25  ortIndex: bRev=%
1f310 64 20 62 4f 62 55 3d 25 64 20 6e 4f 42 53 61 74  d bObU=%d nOBSat
1f320 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1f330 20 20 20 20 20 20 20 20 20 20 62 52 65 76 2c 20            bRev, 
1f340 62 4f 62 55 6e 69 71 75 65 2c 20 70 63 2e 70 6c  bObUnique, pc.pl
1f350 61 6e 2e 6e 4f 42 53 61 74 29 29 3b 0a 20 20 20  an.nOBSat));.   
1f360 20 20 20 69 66 28 20 6e 50 72 69 6f 72 53 61 74     if( nPriorSat
1f370 3c 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20  <pc.plan.nOBSat 
1f380 7c 7c 20 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c  || (pc.plan.wsFl
1f390 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f  ags & WHERE_ALL_
1f3a0 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20  UNIQUE)!=0 ){.  
1f3b0 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
1f3c0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
1f3d0 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20 20 20  RDERED;.        
1f3e0 69 66 28 20 62 4f 62 55 6e 69 71 75 65 20 29 20  if( bObUnique ) 
1f3f0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
1f400 7c 3d 20 57 48 45 52 45 5f 4f 42 5f 55 4e 49 51  |= WHERE_OB_UNIQ
1f410 55 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  UE;.      }.    
1f420 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3d 3d    if( nOrderBy==
1f430 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 29  pc.plan.nOBSat )
1f440 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72 74 20  {.        bSort 
1f450 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 63 2e  = 0;.        pc.
1f460 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
1f470 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
1f480 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  E|WHERE_COLUMN_R
1f490 41 4e 47 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ANGE;.      }.  
1f4a0 20 20 20 20 69 66 28 20 62 52 65 76 20 26 20 31      if( bRev & 1
1f4b0 20 29 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61   ) pc.plan.wsFla
1f4c0 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
1f4d0 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  RSE;.    }..    
1f4e0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1f4f0 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
1f500 69 65 72 20 61 6e 64 20 74 68 69 73 20 69 6e 64  ier and this ind
1f510 65 78 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77  ex will scan row
1f520 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 72 64 65  s in.    ** orde
1f530 72 20 6f 66 20 74 68 65 20 44 49 53 54 49 4e 43  r of the DISTINC
1f540 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 63  T expressions, c
1f550 6c 65 61 72 20 62 44 69 73 74 20 61 6e 64 20 73  lear bDist and s
1f560 65 74 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  et the appropria
1f570 74 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 73 20  te.    ** flags 
1f580 69 6e 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61  in pc.plan.wsFla
1f590 67 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  gs. */.    if( b
1f5a0 44 69 73 74 0a 20 20 20 20 20 26 26 20 69 73 44  Dist.     && isD
1f5b0 69 73 74 69 6e 63 74 49 6e 64 65 78 28 70 50 61  istinctIndex(pPa
1f5c0 72 73 65 2c 20 70 57 43 2c 20 70 50 72 6f 62 65  rse, pWC, pProbe
1f5d0 2c 20 69 43 75 72 2c 20 70 2d 3e 70 44 69 73 74  , iCur, p->pDist
1f5e0 69 6e 63 74 2c 20 70 63 2e 70 6c 61 6e 2e 6e 45  inct, pc.plan.nE
1f5f0 71 29 0a 20 20 20 20 20 26 26 20 28 70 63 2e 70  q).     && (pc.p
1f600 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1f610 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
1f620 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  0.    ){.      b
1f630 44 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Dist = 0;.      
1f640 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  pc.plan.wsFlags 
1f650 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  |= WHERE_ROWID_R
1f660 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  ANGE|WHERE_COLUM
1f670 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 44 49  N_RANGE|WHERE_DI
1f680 53 54 49 4e 43 54 3b 0a 20 20 20 20 7d 0a 0a 20  STINCT;.    }.. 
1f690 20 20 20 2f 2a 20 49 66 20 63 75 72 72 65 6e 74     /* If current
1f6a0 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 74  ly calculating t
1f6b0 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67  he cost of using
1f6c0 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74 20 74   an index (not t
1f6d0 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20 69 6e  he IPK.    ** in
1f6e0 64 65 78 29 2c 20 64 65 74 65 72 6d 69 6e 65 20  dex), determine 
1f6f0 69 66 20 61 6c 6c 20 72 65 71 75 69 72 65 64 20  if all required 
1f700 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61 79 20  column data may 
1f710 62 65 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68  be obtained with
1f720 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75 73 69 6e  out .    ** usin
1f730 67 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  g the main table
1f740 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 69 6e   (i.e. if the in
1f750 64 65 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e  dex is a coverin
1f760 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 66  g.    ** index f
1f770 6f 72 20 74 68 69 73 20 71 75 65 72 79 29 2e 20  or this query). 
1f780 49 66 20 69 74 20 69 73 2c 20 73 65 74 20 74 68  If it is, set th
1f790 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  e WHERE_IDX_ONLY
1f7a0 20 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a 2a 20   flag in.    ** 
1f7b0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2e  pc.plan.wsFlags.
1f7c0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
1f7d0 74 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61 72 69  the bLookup vari
1f7e0 61 62 6c 65 20 74 6f 20 74 72 75 65 2e 20 20 2a  able to true.  *
1f7f0 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29  /.    if( pIdx )
1f800 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
1f810 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
1f820 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  d;.      int j;.
1f830 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1f840 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
1f850 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  j++){.        in
1f860 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
1f870 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
1f880 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a   if( x<BMS-1 ){.
1f890 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e            m &= ~
1f8a0 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78  (((Bitmask)1)<<x
1f8b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f8c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d     }.      if( m
1f8d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1f8e0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1f8f0 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
1f900 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f910 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70 20 3d         bLookup =
1f920 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1f930 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1f940 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
1f950 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20  mber of rows of 
1f960 6f 75 74 70 75 74 2e 20 20 46 6f 72 20 61 6e 20  output.  For an 
1f970 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e  "x IN (SELECT...
1f980 29 22 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  )".    ** constr
1f990 61 69 6e 74 2c 20 64 6f 20 6e 6f 74 20 6c 65 74  aint, do not let
1f9a0 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 65 78   the estimate ex
1f9b0 63 65 65 64 20 68 61 6c 66 20 74 68 65 20 72 6f  ceed half the ro
1f9c0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
1f9d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 63 2e 70  .    */.    pc.p
1f9e0 6c 61 6e 2e 6e 52 6f 77 20 3d 20 28 64 6f 75 62  lan.nRow = (doub
1f9f0 6c 65 29 28 61 69 52 6f 77 45 73 74 5b 70 63 2e  le)(aiRowEst[pc.
1fa00 70 6c 61 6e 2e 6e 45 71 5d 20 2a 20 6e 49 6e 4d  plan.nEq] * nInM
1fa10 75 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e  ul);.    if( bIn
1fa20 45 73 74 20 26 26 20 70 63 2e 70 6c 61 6e 2e 6e  Est && pc.plan.n
1fa30 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74 5b 30  Row*2>aiRowEst[0
1fa40 5d 20 29 7b 0a 20 20 20 20 20 20 70 63 2e 70 6c  ] ){.      pc.pl
1fa50 61 6e 2e 6e 52 6f 77 20 3d 20 61 69 52 6f 77 45  an.nRow = aiRowE
1fa60 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20 20 20 6e  st[0]/2;.      n
1fa70 49 6e 4d 75 6c 20 3d 20 28 69 6e 74 29 28 70 63  InMul = (int)(pc
1fa80 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f 20 61 69 52  .plan.nRow / aiR
1fa90 6f 77 45 73 74 5b 70 63 2e 70 6c 61 6e 2e 6e 45  owEst[pc.plan.nE
1faa0 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  q]);.    }..#ifd
1fab0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1fac0 5f 53 54 41 54 33 0a 20 20 20 20 2f 2a 20 49 66  _STAT3.    /* If
1fad0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
1fae0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 78  is of the form x
1faf0 3d 56 41 4c 55 45 20 6f 72 20 78 20 49 4e 20 28  =VALUE or x IN (
1fb00 45 31 2c 45 32 2c 2e 2e 2e 29 0a 20 20 20 20 2a  E1,E2,...).    *
1fb10 2a 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20  * and we do not 
1fb20 74 68 69 6e 6b 20 74 68 61 74 20 76 61 6c 75 65  think that value
1fb30 73 20 6f 66 20 78 20 61 72 65 20 75 6e 69 71 75  s of x are uniqu
1fb40 65 20 61 6e 64 20 69 66 20 68 69 73 74 6f 67 72  e and if histogr
1fb50 61 6d 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69  am.    ** data i
1fb60 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  s available for 
1fb70 63 6f 6c 75 6d 6e 20 78 2c 20 74 68 65 6e 20 69  column x, then i
1fb80 74 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69  t might be possi
1fb90 62 6c 65 0a 20 20 20 20 2a 2a 20 74 6f 20 67 65  ble.    ** to ge
1fba0 74 20 61 20 62 65 74 74 65 72 20 65 73 74 69 6d  t a better estim
1fbb0 61 74 65 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  ate on the numbe
1fbc0 72 20 6f 66 20 72 6f 77 73 20 62 61 73 65 64 20  r of rows based 
1fbd0 6f 6e 0a 20 20 20 20 2a 2a 20 56 41 4c 55 45 20  on.    ** VALUE 
1fbe0 61 6e 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74  and how common t
1fbf0 68 61 74 20 76 61 6c 75 65 20 69 73 20 61 63 63  hat value is acc
1fc00 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 68 69  ording to the hi
1fc10 73 74 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a  stogram..    */.
1fc20 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61 6e 2e      if( pc.plan.
1fc30 6e 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31 20 26  nRow>(double)1 &
1fc40 26 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 31  & pc.plan.nEq==1
1fc50 0a 20 20 20 20 20 26 26 20 70 46 69 72 73 74 54  .     && pFirstT
1fc60 65 72 6d 21 3d 30 20 26 26 20 61 69 52 6f 77 45  erm!=0 && aiRowE
1fc70 73 74 5b 31 5d 3e 31 20 29 7b 0a 20 20 20 20 20  st[1]>1 ){.     
1fc80 20 61 73 73 65 72 74 28 20 28 70 46 69 72 73 74   assert( (pFirst
1fc90 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1fca0 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
1fcb0 4c 4c 7c 57 4f 5f 49 4e 29 29 21 3d 30 20 29 3b  LL|WO_IN))!=0 );
1fcc0 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 72 73  .      if( pFirs
1fcd0 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  tTerm->eOperator
1fce0 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
1fcf0 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ULL) ){.        
1fd00 74 65 73 74 63 61 73 65 28 20 70 46 69 72 73 74  testcase( pFirst
1fd10 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1fd20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
1fd30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69     testcase( pFi
1fd40 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
1fd50 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20 29 3b  or & WO_EQUIV );
1fd60 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1fd70 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  e( pFirstTerm->e
1fd80 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
1fd90 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  NULL );.        
1fda0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
1fdb0 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65  t(pParse, pProbe
1fdc0 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 70 45  , pFirstTerm->pE
1fdd0 78 70 72 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20  xpr->pRight,.   
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdf0 20 20 20 20 20 20 20 26 70 63 2e 70 6c 61 6e 2e         &pc.plan.
1fe00 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nRow);.      }el
1fe10 73 65 20 69 66 28 20 62 49 6e 45 73 74 3d 3d 30  se if( bInEst==0
1fe20 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1fe30 72 74 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  rt( pFirstTerm->
1fe40 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1fe50 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  N );.        whe
1fe60 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72  reInScanEst(pPar
1fe70 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72  se, pProbe, pFir
1fe80 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78  stTerm->pExpr->x
1fe90 2e 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  .pList,.        
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1feb0 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 3b 0a 20  pc.plan.nRow);. 
1fec0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
1fed0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1fee0 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 20  ABLE_STAT3 */.. 
1fef0 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 74 68 65     /* Adjust the
1ff00 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
1ff10 74 20 72 6f 77 73 20 61 6e 64 20 64 6f 77 6e 77  t rows and downw
1ff20 61 72 64 20 74 6f 20 72 65 66 6c 65 63 74 20 72  ard to reflect r
1ff30 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ows.    ** that 
1ff40 61 72 65 20 65 78 63 6c 75 64 65 64 20 62 79 20  are excluded by 
1ff50 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
1ff60 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 63  s..    */.    pc
1ff70 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 70 63 2e  .plan.nRow = pc.
1ff80 70 6c 61 6e 2e 6e 52 6f 77 2f 72 61 6e 67 65 44  plan.nRow/rangeD
1ff90 69 76 3b 0a 20 20 20 20 69 66 28 20 70 63 2e 70  iv;.    if( pc.p
1ffa0 6c 61 6e 2e 6e 52 6f 77 3c 31 20 29 20 70 63 2e  lan.nRow<1 ) pc.
1ffb0 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 31 3b 0a 0a  plan.nRow = 1;..
1ffc0 20 20 20 20 2f 2a 20 45 78 70 65 72 69 6d 65 6e      /* Experimen
1ffd0 74 73 20 72 75 6e 20 6f 6e 20 72 65 61 6c 20 53  ts run on real S
1ffe0 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 73 20  QLite databases 
1fff0 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 74 69  show that the ti
20000 6d 65 20 6e 65 65 64 65 64 0a 20 20 20 20 2a 2a  me needed.    **
20010 20 74 6f 20 64 6f 20 61 20 62 69 6e 61 72 79 20   to do a binary 
20020 73 65 61 72 63 68 20 74 6f 20 6c 6f 63 61 74 65  search to locate
20030 20 61 20 72 6f 77 20 69 6e 20 61 20 74 61 62 6c   a row in a tabl
20040 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 72 6f  e or index is ro
20050 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20 6c 6f 67  ughly.    ** log
20060 31 30 28 4e 29 20 74 69 6d 65 73 20 74 68 65 20  10(N) times the 
20070 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20 66 72 6f  time to move fro
20080 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20 74 68 65  m one row to the
20090 20 6e 65 78 74 20 72 6f 77 20 77 69 74 68 69 6e   next row within
200a0 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65 20  .    ** a table 
200b0 6f 72 20 69 6e 64 65 78 2e 20 20 54 68 65 20 61  or index.  The a
200c0 63 74 75 61 6c 20 74 69 6d 65 73 20 63 61 6e 20  ctual times can 
200d0 76 61 72 79 2c 20 77 69 74 68 20 74 68 65 20 73  vary, with the s
200e0 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 72 65  ize of.    ** re
200f0 63 6f 72 64 73 20 62 65 69 6e 67 20 61 6e 20 69  cords being an i
20100 6d 70 6f 72 74 61 6e 74 20 66 61 63 74 6f 72 2e  mportant factor.
20110 20 20 42 6f 74 68 20 6d 6f 76 65 73 20 61 6e 64    Both moves and
20120 20 73 65 61 72 63 68 65 73 20 61 72 65 0a 20 20   searches are.  
20130 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77 69 74 68    ** slower with
20140 20 6c 61 72 67 65 72 20 72 65 63 6f 72 64 73 2c   larger records,
20150 20 70 72 65 73 75 6d 61 62 6c 79 20 62 65 63 61   presumably beca
20160 75 73 65 20 66 65 77 65 72 20 72 65 63 6f 72 64  use fewer record
20170 73 20 66 69 74 0a 20 20 20 20 2a 2a 20 6f 6e 20  s fit.    ** on 
20180 6f 6e 65 20 70 61 67 65 20 61 6e 64 20 68 65 6e  one page and hen
20190 63 65 20 6d 6f 72 65 20 70 61 67 65 73 20 68 61  ce more pages ha
201a0 76 65 20 74 6f 20 62 65 20 66 65 74 63 68 65 64  ve to be fetched
201b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
201c0 54 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  The ANALYZE comm
201d0 61 6e 64 20 61 6e 64 20 74 68 65 20 73 71 6c 69  and and the sqli
201e0 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73 71 6c  te_stat1 and sql
201f0 69 74 65 5f 73 74 61 74 33 20 74 61 62 6c 65 73  ite_stat3 tables
20200 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 67   do.    ** not g
20210 69 76 65 20 75 73 20 64 61 74 61 20 6f 6e 20 74  ive us data on t
20220 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65  he relative size
20230 73 20 6f 66 20 74 61 62 6c 65 20 61 6e 64 20 69  s of table and i
20240 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 0a 20 20  ndex records..  
20250 20 20 2a 2a 20 53 6f 20 74 68 69 73 20 63 6f 6d    ** So this com
20260 70 75 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73  putation assumes
20270 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 20 61   table records a
20280 72 65 20 61 62 6f 75 74 20 74 77 69 63 65 20 61  re about twice a
20290 73 20 62 69 67 0a 20 20 20 20 2a 2a 20 61 73 20  s big.    ** as 
202a0 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 20 20  index records.  
202b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 63    */.    if( (pc
202c0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 7e 28  .plan.wsFlags&~(
202d0 57 48 45 52 45 5f 52 45 56 45 52 53 45 7c 57 48  WHERE_REVERSE|WH
202e0 45 52 45 5f 4f 52 44 45 52 45 44 7c 57 48 45 52  ERE_ORDERED|WHER
202f0 45 5f 4f 42 5f 55 4e 49 51 55 45 29 29 0a 20 20  E_OB_UNIQUE)).  
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 57 48              ==WH
20340 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 0a 20 20 20  ERE_IDX_ONLY.   
20350 20 20 26 26 20 28 70 57 43 2d 3e 77 63 74 72 6c    && (pWC->wctrl
20360 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
20370 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
20380 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  0.     && sqlite
20390 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55  3GlobalConfig.bU
203a0 73 65 43 69 73 0a 20 20 20 20 20 26 26 20 4f 70  seCis.     && Op
203b0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
203c0 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
203d0 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61  LITE_CoverIdxSca
203e0 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
203f0 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73  /* This index is
20400 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20   not useful for 
20410 69 6e 64 65 78 69 6e 67 2c 20 62 75 74 20 69 74  indexing, but it
20420 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   is a covering i
20430 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2a 20 41  ndex..      ** A
20440 20 66 75 6c 6c 2d 73 63 61 6e 20 6f 66 20 74 68   full-scan of th
20450 65 20 69 6e 64 65 78 20 6d 69 67 68 74 20 62 65  e index might be
20460 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72   a little faster
20470 20 74 68 61 6e 20 61 20 66 75 6c 6c 2d 73 63 61   than a full-sca
20480 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  n.      ** of th
20490 65 20 74 61 62 6c 65 2c 20 73 6f 20 67 69 76 65  e table, so give
204a0 20 74 68 69 73 20 63 61 73 65 20 61 20 63 6f 73   this case a cos
204b0 74 20 73 6c 69 67 68 74 6c 79 20 6c 65 73 73 20  t slightly less 
204c0 74 68 61 6e 20 61 20 74 61 62 6c 65 0a 20 20 20  than a table.   
204d0 20 20 20 2a 2a 20 73 63 61 6e 2e 20 2a 2f 0a 20     ** scan. */. 
204e0 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20 3d 20       pc.rCost = 
204f0 61 69 52 6f 77 45 73 74 5b 30 5d 2a 33 20 2b 20  aiRowEst[0]*3 + 
20500 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pProbe->nColumn;
20510 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77  .      pc.plan.w
20520 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
20530 43 4f 56 45 52 5f 53 43 41 4e 7c 57 48 45 52 45  COVER_SCAN|WHERE
20540 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20  _COLUMN_RANGE;. 
20550 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 63     }else if( (pc
20560 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
20570 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
20580 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AN)==0 ){.      
20590 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 61  /* The cost of a
205a0 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
205b0 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   is a number of 
205c0 6d 6f 76 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  move operations 
205d0 65 71 75 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74  equal.      ** t
205e0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
205f0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
20600 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
20610 20 20 2a 2a 20 57 65 20 61 64 64 20 61 6e 20 61    ** We add an a
20620 64 64 69 74 69 6f 6e 61 6c 20 34 78 20 70 65 6e  dditional 4x pen
20630 61 6c 74 79 20 74 6f 20 66 75 6c 6c 20 74 61 62  alty to full tab
20640 6c 65 20 73 63 61 6e 73 2e 20 20 54 68 69 73 20  le scans.  This 
20650 63 61 75 73 65 73 0a 20 20 20 20 20 20 2a 2a 20  causes.      ** 
20660 74 68 65 20 63 6f 73 74 20 66 75 6e 63 74 69 6f  the cost functio
20670 6e 20 74 6f 20 65 72 72 20 6f 6e 20 74 68 65 20  n to err on the 
20680 73 69 64 65 20 6f 66 20 63 68 6f 6f 73 69 6e 67  side of choosing
20690 20 61 6e 20 69 6e 64 65 78 20 6f 76 65 72 0a 20   an index over. 
206a0 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 69 6e 67       ** choosing
206b0 20 61 20 66 75 6c 6c 20 73 63 61 6e 2e 20 20 54   a full scan.  T
206c0 68 69 73 20 34 78 20 66 75 6c 6c 2d 73 63 61 6e  his 4x full-scan
206d0 20 70 65 6e 61 6c 74 79 20 69 73 20 61 6e 20 61   penalty is an a
206e0 72 67 75 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  rguable.      **
206f0 20 64 65 63 69 73 69 6f 6e 20 61 6e 64 20 6f 6e   decision and on
20700 65 20 77 68 69 63 68 20 77 65 20 65 78 70 65 63  e which we expec
20710 74 20 74 6f 20 72 65 76 69 73 69 74 20 69 6e 20  t to revisit in 
20720 74 68 65 20 66 75 74 75 72 65 2e 20 20 42 75 74  the future.  But
20730 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 73 65 65  .      ** it see
20740 6d 73 20 74 6f 20 62 65 20 77 6f 72 6b 69 6e 67  ms to be working
20750 20 77 65 6c 6c 20 65 6e 6f 75 67 68 20 61 74 20   well enough at 
20760 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a 20 20 20 20  the moment..    
20770 20 20 2a 2f 0a 20 20 20 20 20 20 70 63 2e 72 43    */.      pc.rC
20780 6f 73 74 20 3d 20 61 69 52 6f 77 45 73 74 5b 30  ost = aiRowEst[0
20790 5d 2a 34 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c  ]*4;.      pc.pl
207a0 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57  an.wsFlags &= ~W
207b0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
207c0 20 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b       if( pIdx ){
207d0 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  .        pc.plan
207e0 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  .wsFlags &= ~WHE
207f0 52 45 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  RE_ORDERED;.    
20800 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53      pc.plan.nOBS
20810 61 74 20 3d 20 6e 50 72 69 6f 72 53 61 74 3b 0a  at = nPriorSat;.
20820 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
20830 65 7b 0a 20 20 20 20 20 20 6c 6f 67 31 30 4e 20  e{.      log10N 
20840 3d 20 65 73 74 4c 6f 67 28 61 69 52 6f 77 45 73  = estLog(aiRowEs
20850 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 63 2e  t[0]);.      pc.
20860 72 43 6f 73 74 20 3d 20 70 63 2e 70 6c 61 6e 2e  rCost = pc.plan.
20870 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  nRow;.      if( 
20880 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  pIdx ){.        
20890 69 66 28 20 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20  if( bLookup ){. 
208a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
208b0 61 6e 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  an index lookup 
208c0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 74 61  followed by a ta
208d0 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20  ble lookup:.    
208e0 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d        **    nInM
208f0 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68 65  ul index searche
20900 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 73 74  s to find the st
20910 61 72 74 20 6f 66 20 65 61 63 68 20 69 6e 64 65  art of each inde
20920 78 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20  x range.        
20930 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65    **  + nRow ste
20940 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  ps through the i
20950 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 2a  ndex.          *
20960 2a 20 20 2b 20 6e 52 6f 77 20 74 61 62 6c 65 20  *  + nRow table 
20970 73 65 61 72 63 68 65 73 20 74 6f 20 6c 6f 6f 6b  searches to look
20980 75 70 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  up the table ent
20990 72 79 20 75 73 69 6e 67 20 74 68 65 20 72 6f 77  ry using the row
209a0 69 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  id.          */.
209b0 20 20 20 20 20 20 20 20 20 20 70 63 2e 72 43 6f            pc.rCo
209c0 73 74 20 2b 3d 20 28 6e 49 6e 4d 75 6c 20 2b 20  st += (nInMul + 
209d0 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 2a 6c 6f  pc.plan.nRow)*lo
209e0 67 31 30 4e 3b 0a 20 20 20 20 20 20 20 20 7d 65  g10N;.        }e
209f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
20a00 2a 20 46 6f 72 20 61 20 63 6f 76 65 72 69 6e 67  * For a covering
20a10 20 69 6e 64 65 78 3a 0a 20 20 20 20 20 20 20 20   index:.        
20a20 20 20 2a 2a 20 20 20 20 20 6e 49 6e 4d 75 6c 20    **     nInMul 
20a30 69 6e 64 65 78 20 73 65 61 72 63 68 65 73 20 74  index searches t
20a40 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 69 74 69  o find the initi
20a50 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
20a60 20 20 20 20 2a 2a 20 20 20 2b 20 6e 52 6f 77 20      **   + nRow 
20a70 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68  steps through th
20a80 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  e index.        
20a90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
20aa0 63 2e 72 43 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75  c.rCost += nInMu
20ab0 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20  l*log10N;.      
20ac0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
20ad0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
20ae0 61 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  a rowid primary 
20af0 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20  key lookup:.    
20b00 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c      **    nInMul
20b10 74 20 74 61 62 6c 65 20 73 65 61 72 63 68 65 73  t table searches
20b20 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 69   to find the ini
20b30 74 69 61 6c 20 65 6e 74 72 79 20 66 6f 72 20 65  tial entry for e
20b40 61 63 68 20 72 61 6e 67 65 0a 20 20 20 20 20 20  ach range.      
20b50 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65    **  + nRow ste
20b60 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  ps through the t
20b70 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  able.        */.
20b80 20 20 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74          pc.rCost
20b90 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30   += nInMul*log10
20ba0 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  N;.      }.    }
20bb0 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 69 6e 20  ..    /* Add in 
20bc0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 63 6f  the estimated co
20bd0 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68  st of sorting th
20be0 65 20 72 65 73 75 6c 74 2e 20 20 41 63 74 75 61  e result.  Actua
20bf0 6c 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a 20  l experimental. 
20c00 20 20 20 2a 2a 20 6d 65 61 73 75 72 65 6d 65 6e     ** measuremen
20c10 74 73 20 6f 66 20 73 6f 72 74 69 6e 67 20 70 65  ts of sorting pe
20c20 72 66 6f 72 6d 61 6e 63 65 20 69 6e 20 53 51 4c  rformance in SQL
20c30 69 74 65 20 73 68 6f 77 20 74 68 61 74 20 73 6f  ite show that so
20c40 72 74 69 6e 67 20 74 69 6d 65 0a 20 20 20 20 2a  rting time.    *
20c50 2a 20 61 64 64 73 20 43 2a 4e 2a 6c 6f 67 31 30  * adds C*N*log10
20c60 28 4e 29 20 74 6f 20 74 68 65 20 63 6f 73 74 2c  (N) to the cost,
20c70 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
20c80 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
20c90 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 6f 72  o be .    ** sor
20ca0 74 65 64 20 61 6e 64 20 43 20 69 73 20 61 20 66  ted and C is a f
20cb0 61 63 74 6f 72 20 62 65 74 77 65 65 6e 20 31 2e  actor between 1.
20cc0 39 35 20 61 6e 64 20 34 2e 33 2e 20 20 57 65 20  95 and 4.3.  We 
20cd0 77 69 6c 6c 20 73 70 6c 69 74 20 74 68 65 0a 20  will split the. 
20ce0 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 63 65     ** difference
20cf0 20 61 6e 64 20 73 65 6c 65 63 74 20 43 20 6f 66   and select C of
20d00 20 33 2e 30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   3.0..    */.   
20d10 20 69 66 28 20 62 53 6f 72 74 20 29 7b 0a 20 20   if( bSort ){.  
20d20 20 20 20 20 64 6f 75 62 6c 65 20 6d 20 3d 20 65      double m = e
20d30 73 74 4c 6f 67 28 70 63 2e 70 6c 61 6e 2e 6e 52  stLog(pc.plan.nR
20d40 6f 77 2a 28 6e 4f 72 64 65 72 42 79 20 2d 20 70  ow*(nOrderBy - p
20d50 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 29 2f 6e  c.plan.nOBSat)/n
20d60 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
20d70 6d 20 2a 3d 20 28 64 6f 75 62 6c 65 29 28 70 63  m *= (double)(pc
20d80 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3f 20 32  .plan.nOBSat ? 2
20d90 20 3a 20 33 29 3b 0a 20 20 20 20 20 20 70 63 2e   : 3);.      pc.
20da0 72 43 6f 73 74 20 2b 3d 20 70 63 2e 70 6c 61 6e  rCost += pc.plan
20db0 2e 6e 52 6f 77 2a 6d 3b 0a 20 20 20 20 7d 0a 20  .nRow*m;.    }. 
20dc0 20 20 20 69 66 28 20 62 44 69 73 74 20 29 7b 0a     if( bDist ){.
20dd0 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74 20 2b        pc.rCost +
20de0 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2a 65  = pc.plan.nRow*e
20df0 73 74 4c 6f 67 28 70 63 2e 70 6c 61 6e 2e 6e 52  stLog(pc.plan.nR
20e00 6f 77 29 2a 33 3b 0a 20 20 20 20 7d 0a 0a 20 20  ow)*3;.    }..  
20e10 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20    /**** Cost of 
20e20 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64 65 78  using this index
20e30 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f   has now been co
20e40 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20  mputed ****/..  
20e50 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
20e60 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e  e additional con
20e70 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 69 73  straints on this
20e80 20 74 61 62 6c 65 20 74 68 61 74 20 63 61 6e 6e   table that cann
20e90 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20 75 73 65  ot.    ** be use
20ea0 64 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  d with the curre
20eb0 6e 74 20 69 6e 64 65 78 2c 20 62 75 74 20 77 68  nt index, but wh
20ec0 69 63 68 20 6d 69 67 68 74 20 6c 6f 77 65 72 20  ich might lower 
20ed0 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a  the number.    *
20ee0 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  * of output rows
20ef0 2c 20 61 64 6a 75 73 74 20 74 68 65 20 6e 52 6f  , adjust the nRo
20f00 77 20 76 61 6c 75 65 20 61 63 63 6f 72 64 69 6e  w value accordin
20f10 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  gly.  This only 
20f20 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 73 20  .    ** matters 
20f30 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  if the current i
20f40 6e 64 65 78 20 69 73 20 74 68 65 20 6c 65 61 73  ndex is the leas
20f50 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20 64 6f 20  t costly, so do 
20f60 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20 20 20 2a  not bother.    *
20f70 2a 20 77 69 74 68 20 74 68 69 73 20 73 74 65 70  * with this step
20f80 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 6b   if we already k
20f90 6e 6f 77 20 74 68 69 73 20 69 6e 64 65 78 20 77  now this index w
20fa0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 6f 73 65  ill not be chose
20fb0 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  n..    ** Also, 
20fc0 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
20fd0 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e   output row coun
20fe0 74 20 62 65 6c 6f 77 20 32 20 75 73 69 6e 67 20  t below 2 using 
20ff0 74 68 69 73 20 73 74 65 70 2e 0a 20 20 20 20 2a  this step..    *
21000 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69 73 20 63  *.    ** It is c
21010 72 69 74 69 63 61 6c 20 74 68 61 74 20 74 68 65  ritical that the
21020 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b 20 62   notValid mask b
21030 65 20 75 73 65 64 20 68 65 72 65 20 69 6e 73 74  e used here inst
21040 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ead of.    ** th
21050 65 20 6e 6f 74 52 65 61 64 79 20 6d 61 73 6b 2e  e notReady mask.
21060 20 20 57 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67    When computing
21070 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 69 6e   an "optimal" in
21080 64 65 78 2c 20 74 68 65 20 6e 6f 74 52 65 61 64  dex, the notRead
21090 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b 20 77 69  y.    ** mask wi
210a0 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20 6f 6e 65  ll only have one
210b0 20 62 69 74 20 73 65 74 20 2d 20 74 68 65 20 62   bit set - the b
210c0 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  it for the curre
210d0 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  nt table..    **
210e0 20 54 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61   The notValid ma
210f0 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  sk, on the other
21100 20 68 61 6e 64 2c 20 61 6c 77 61 79 73 20 68 61   hand, always ha
21110 73 20 61 6c 6c 20 62 69 74 73 20 73 65 74 20 66  s all bits set f
21120 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  or.    ** tables
21130 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 69 6e   that are not in
21140 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 20 20 49   outer loops.  I
21150 66 20 6e 6f 74 52 65 61 64 79 20 69 73 20 75 73  f notReady is us
21160 65 64 20 68 65 72 65 20 69 6e 73 74 65 61 64 0a  ed here instead.
21170 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 56 61 6c      ** of notVal
21180 69 64 2c 20 74 68 65 6e 20 61 20 6f 70 74 69 6d  id, then a optim
21190 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 64 65  al index that de
211a0 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65 72 20 6a  pends on inner j
211b0 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20 20 20 2a  oins loops.    *
211c0 2a 20 6d 69 67 68 74 20 62 65 20 73 65 6c 65 63  * might be selec
211d0 74 65 64 20 65 76 65 6e 20 77 68 65 6e 20 74 68  ted even when th
211e0 65 72 65 20 65 78 69 73 74 73 20 61 6e 20 6f 70  ere exists an op
211f0 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74  timal index that
21200 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 73   has.    ** no s
21210 75 63 68 20 64 65 70 65 6e 64 65 6e 63 79 2e 0a  uch dependency..
21220 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
21230 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 32 20 26 26  c.plan.nRow>2 &&
21240 20 70 63 2e 72 43 6f 73 74 3c 3d 70 2d 3e 63 6f   pc.rCost<=p->co
21250 73 74 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20  st.rCost ){.    
21260 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21280 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
21290 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69  /.      int nSki
212a0 70 45 71 20 3d 20 70 63 2e 70 6c 61 6e 2e 6e 45  pEq = pc.plan.nE
212b0 71 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  q;   /* Number o
212c0 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  f == constraints
212d0 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20   to skip */.    
212e0 20 20 69 6e 74 20 6e 53 6b 69 70 52 61 6e 67 65    int nSkipRange
212f0 20 3d 20 6e 42 6f 75 6e 64 3b 20 20 20 20 20 2f   = nBound;     /
21300 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3c 20 63 6f  * Number of < co
21310 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73 6b 69  nstraints to ski
21320 70 20 2a 2f 0a 20 20 20 20 20 20 42 69 74 6d 61  p */.      Bitma
21330 73 6b 20 74 68 69 73 54 61 62 3b 20 20 20 20 20  sk thisTab;     
21340 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
21350 70 20 66 6f 72 20 70 53 72 63 20 2a 2f 0a 0a 20  p for pSrc */.. 
21360 20 20 20 20 20 74 68 69 73 54 61 62 20 3d 20 67       thisTab = g
21370 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73  etMask(pWC->pMas
21380 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20  kSet, iCur);.   
21390 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
213a0 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72  ->a, k=pWC->nTer
213b0 6d 3b 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e  m; pc.plan.nRow>
213c0 32 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65  2 && k; k--, pTe
213d0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
213e0 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
213f0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
21400 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21410 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
21420 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 2d 3e  >prereqAll & p->
21430 6e 6f 74 56 61 6c 69 64 29 21 3d 74 68 69 73 54  notValid)!=thisT
21440 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
21450 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
21460 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
21470 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
21480 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
21490 20 20 20 69 66 28 20 6e 53 6b 69 70 45 71 20 29     if( nSkipEq )
214a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
214b0 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73   Ignore the firs
214c0 74 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 20 65 71  t pc.plan.nEq eq
214d0 75 61 6c 69 74 79 20 6d 61 74 63 68 65 73 20 73  uality matches s
214e0 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20  ince the index. 
214f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
21500 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e  s already accoun
21510 74 65 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f  ted for these */
21520 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b  .            nSk
21530 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20 20 20 20  ipEq--;.        
21540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21550 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65       /* Assume e
21560 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ach additional e
21570 71 75 61 6c 69 74 79 20 6d 61 74 63 68 20 72 65  quality match re
21580 64 75 63 65 73 20 74 68 65 20 72 65 73 75 6c 74  duces the result
21590 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
215a0 73 65 74 20 73 69 7a 65 20 62 79 20 61 20 66 61  set size by a fa
215b0 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f 0a 20 20  ctor of 10 */.  
215c0 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61            pc.pla
215d0 6e 2e 6e 52 6f 77 20 2f 3d 20 31 30 3b 0a 20 20  n.nRow /= 10;.  
215e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
215f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
21600 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
21610 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
21620 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20  T|WO_GE) ){.    
21630 20 20 20 20 20 20 69 66 28 20 6e 53 6b 69 70 52        if( nSkipR
21640 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ange ){.        
21650 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68      /* Ignore th
21660 65 20 66 69 72 73 74 20 6e 53 6b 69 70 52 61 6e  e first nSkipRan
21670 67 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ge range constra
21680 69 6e 74 73 20 73 69 6e 63 65 20 74 68 65 20 69  ints since the i
21690 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20  ndex.           
216a0 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
216b0 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68  accounted for th
216c0 65 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ese */.         
216d0 20 20 20 6e 53 6b 69 70 52 61 6e 67 65 2d 2d 3b     nSkipRange--;
216e0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
216f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
21700 20 41 73 73 75 6d 65 20 65 61 63 68 20 61 64 64   Assume each add
21710 69 74 69 6f 6e 61 6c 20 72 61 6e 67 65 20 63 6f  itional range co
21720 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65 73  nstraint reduces
21730 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
21740 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 73          ** set s
21750 69 7a 65 20 62 79 20 61 20 66 61 63 74 6f 72 20  ize by a factor 
21760 6f 66 20 33 2e 20 20 49 6e 64 65 78 65 64 20 72  of 3.  Indexed r
21770 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
21780 20 72 65 64 75 63 65 0a 20 20 20 20 20 20 20 20   reduce.        
21790 20 20 20 20 2a 2a 20 74 68 65 20 73 65 61 72 63      ** the searc
217a0 68 20 73 70 61 63 65 20 62 79 20 61 20 6c 61 72  h space by a lar
217b0 67 65 72 20 66 61 63 74 6f 72 3a 20 34 2e 20 20  ger factor: 4.  
217c0 57 65 20 6d 61 6b 65 20 69 6e 64 65 78 65 64 20  We make indexed 
217d0 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20  range.          
217e0 20 20 2a 2a 20 6d 6f 72 65 20 73 65 6c 65 63 74    ** more select
217f0 69 76 65 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 6c  ive intentionall
21800 79 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  y because of the
21810 20 73 75 62 6a 65 63 74 69 76 65 20 0a 20 20 20   subjective .   
21820 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 73 65           ** obse
21830 72 76 61 74 69 6f 6e 20 74 68 61 74 20 69 6e 64  rvation that ind
21840 65 78 65 64 20 72 61 6e 67 65 20 63 6f 6e 73 74  exed range const
21850 72 61 69 6e 74 73 20 72 65 61 6c 6c 79 20 61 72  raints really ar
21860 65 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 20  e more.         
21870 20 20 20 2a 2a 20 73 65 6c 65 63 74 69 76 65 20     ** selective 
21880 69 6e 20 70 72 61 63 74 69 63 65 2c 20 6f 6e 20  in practice, on 
21890 61 76 65 72 61 67 65 2e 20 2a 2f 0a 20 20 20 20  average. */.    
218a0 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e          pc.plan.
218b0 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20  nRow /= 3;.     
218c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
218d0 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
218e0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
218f0 4e 4f 4f 50 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NOOP)==0 ){.    
21900 20 20 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68        /* Any oth
21910 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  er expression lo
21920 77 65 72 73 20 74 68 65 20 6f 75 74 70 75 74 20  wers the output 
21930 72 6f 77 20 63 6f 75 6e 74 20 62 79 20 68 61 6c  row count by hal
21940 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  f */.          p
21950 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 32  c.plan.nRow /= 2
21960 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21970 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63    }.      if( pc
21980 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 32 20 29 20 70  .plan.nRow<2 ) p
21990 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 32 3b  c.plan.nRow = 2;
219a0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 57 48 45  .    }...    WHE
219b0 52 45 54 52 41 43 45 28 28 0a 20 20 20 20 20 20  RETRACE((.      
219c0 22 20 20 20 20 20 20 6e 45 71 3d 25 64 20 6e 49  "      nEq=%d nI
219d0 6e 4d 75 6c 3d 25 64 20 72 61 6e 67 65 44 69 76  nMul=%d rangeDiv
219e0 3d 25 64 20 62 53 6f 72 74 3d 25 64 20 62 4c 6f  =%d bSort=%d bLo
219f0 6f 6b 75 70 3d 25 64 20 77 73 46 6c 61 67 73 3d  okup=%d wsFlags=
21a00 30 78 25 30 38 78 5c 6e 22 0a 20 20 20 20 20 20  0x%08x\n".      
21a10 22 20 20 20 20 20 20 6e 6f 74 52 65 61 64 79 3d  "      notReady=
21a20 30 78 25 6c 6c 78 20 6c 6f 67 31 30 4e 3d 25 2e  0x%llx log10N=%.
21a30 31 66 20 6e 52 6f 77 3d 25 2e 31 66 20 63 6f 73  1f nRow=%.1f cos
21a40 74 3d 25 2e 31 66 5c 6e 22 0a 20 20 20 20 20 20  t=%.1f\n".      
21a50 22 20 20 20 20 20 20 75 73 65 64 3d 30 78 25 6c  "      used=0x%l
21a60 6c 78 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c  lx nOBSat=%d\n",
21a70 0a 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e  .      pc.plan.n
21a80 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20 28 69 6e 74  Eq, nInMul, (int
21a90 29 72 61 6e 67 65 44 69 76 2c 20 62 53 6f 72 74  )rangeDiv, bSort
21aa0 2c 20 62 4c 6f 6f 6b 75 70 2c 20 70 63 2e 70 6c  , bLookup, pc.pl
21ab0 61 6e 2e 77 73 46 6c 61 67 73 2c 0a 20 20 20 20  an.wsFlags,.    
21ac0 20 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 6c    p->notReady, l
21ad0 6f 67 31 30 4e 2c 20 70 63 2e 70 6c 61 6e 2e 6e  og10N, pc.plan.n
21ae0 52 6f 77 2c 20 70 63 2e 72 43 6f 73 74 2c 20 70  Row, pc.rCost, p
21af0 63 2e 75 73 65 64 2c 0a 20 20 20 20 20 20 70 63  c.used,.      pc
21b00 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 0a 20 20 20  .plan.nOBSat.   
21b10 20 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   ));..    /* If 
21b20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68  this index is th
21b30 65 20 62 65 73 74 20 77 65 20 68 61 76 65 20 73  e best we have s
21b40 65 65 6e 20 73 6f 20 66 61 72 2c 20 74 68 65 6e  een so far, then
21b50 20 72 65 63 6f 72 64 20 74 68 69 73 0a 20 20 20   record this.   
21b60 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 69 74   ** index and it
21b70 73 20 63 6f 73 74 20 69 6e 20 74 68 65 20 70 2d  s cost in the p-
21b80 3e 63 6f 73 74 20 73 74 72 75 63 74 75 72 65 2e  >cost structure.
21b90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21ba0 28 21 70 49 64 78 20 7c 7c 20 70 63 2e 70 6c 61  (!pIdx || pc.pla
21bb0 6e 2e 77 73 46 6c 61 67 73 29 20 26 26 20 63 6f  n.wsFlags) && co
21bc0 6d 70 61 72 65 43 6f 73 74 28 26 70 63 2c 20 26  mpareCost(&pc, &
21bd0 70 2d 3e 63 6f 73 74 29 20 29 7b 0a 20 20 20 20  p->cost) ){.    
21be0 20 20 70 2d 3e 63 6f 73 74 20 3d 20 70 63 3b 0a    p->cost = pc;.
21bf0 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c        p->cost.pl
21c00 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 77 73  an.wsFlags &= ws
21c10 46 6c 61 67 4d 61 73 6b 3b 0a 20 20 20 20 20 20  FlagMask;.      
21c20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70  p->cost.plan.u.p
21c30 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  Idx = pIdx;.    
21c40 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
21c50 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
21c60 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
21c70 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20  n only that one 
21c80 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20  index is.    ** 
21c90 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20  considered. */. 
21ca0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e     if( pSrc->pIn
21cb0 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  dex ) break;..  
21cc0 20 20 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b 73    /* Reset masks
21cd0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e   for the next in
21ce0 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20  dex in the loop 
21cf0 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73  */.    wsFlagMas
21d00 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49  k = ~(WHERE_ROWI
21d10 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
21d20 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54  _RANGE);.    eqT
21d30 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54  ermMask = idxEqT
21d40 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20  ermMask;.  }..  
21d50 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
21d60 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
21d70 65 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45  e and the SQLITE
21d80 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 66 6c  _ReverseOrder fl
21d90 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c 20  ag.  ** is set, 
21da0 74 68 65 6e 20 72 65 76 65 72 73 65 20 74 68 65  then reverse the
21db0 20 6f 72 64 65 72 20 74 68 61 74 20 74 68 65 20   order that the 
21dc0 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 73 63  index will be sc
21dd0 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54  anned.  ** in. T
21de0 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
21df0 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 65 73 74  application test
21e00 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e  ing, to help fin
21e10 64 20 63 61 73 65 73 0a 20 20 2a 2a 20 77 68 65  d cases.  ** whe
21e20 72 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 62  re application b
21e30 65 68 61 76 69 6f 72 20 64 65 70 65 6e 64 73 20  ehavior depends 
21e40 6f 6e 20 74 68 65 20 28 75 6e 64 65 66 69 6e 65  on the (undefine
21e50 64 29 20 6f 72 64 65 72 20 74 68 61 74 0a 20 20  d) order that.  
21e60 2a 2a 20 53 51 4c 69 74 65 20 6f 75 74 70 75 74  ** SQLite output
21e70 73 20 72 6f 77 73 20 69 6e 20 69 6e 20 74 68 65  s rows in in the
21e80 20 61 62 73 65 6e 63 65 20 6f 66 20 61 6e 20 4f   absence of an O
21e90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
21ea0 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 70 4f   */.  if( !p->pO
21eb0 72 64 65 72 42 79 20 26 26 20 70 50 61 72 73 65  rderBy && pParse
21ec0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
21ed0 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
21ee0 72 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73 74  r ){.    p->cost
21ef0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
21f00 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a   WHERE_REVERSE;.
21f10 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
21f20 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70  ->pOrderBy || (p
21f30 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  ->cost.plan.wsFl
21f40 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 45  ags&WHERE_ORDERE
21f50 44 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  D)==0 );.  asser
21f60 74 28 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e  t( p->cost.plan.
21f70 75 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70 2d  u.pIdx==0 || (p-
21f80 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  >cost.plan.wsFla
21f90 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  gs&WHERE_ROWID_E
21fa0 51 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Q)==0 );.  asser
21fb0 74 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d  t( pSrc->pIndex=
21fc0 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  =0 .       || p-
21fd0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64  >cost.plan.u.pId
21fe0 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  x==0 .       || 
21ff0 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70  p->cost.plan.u.p
22000 49 64 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65  Idx==pSrc->pInde
22010 78 20 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45  x .  );..  WHERE
22020 54 52 41 43 45 28 28 22 20 20 20 62 65 73 74 20  TRACE(("   best 
22030 69 6e 64 65 78 20 69 73 20 25 73 20 63 6f 73 74  index is %s cost
22040 3d 25 2e 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20  =%.1f\n",.      
22050 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e     p->cost.plan.
22060 75 2e 70 49 64 78 20 3f 20 70 2d 3e 63 6f 73 74  u.pIdx ? p->cost
22070 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  .plan.u.pIdx->zN
22080 61 6d 65 20 3a 20 22 69 70 6b 22 2c 0a 20 20 20  ame : "ipk",.   
22090 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43        p->cost.rC
220a0 6f 73 74 29 29 3b 0a 20 20 0a 20 20 62 65 73 74  ost));.  .  best
220b0 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70 29  OrClauseIndex(p)
220c0 3b 0a 20 20 62 65 73 74 41 75 74 6f 6d 61 74 69  ;.  bestAutomati
220d0 63 49 6e 64 65 78 28 70 29 3b 0a 20 20 70 2d 3e  cIndex(p);.  p->
220e0 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
220f0 73 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b  s |= eqTermMask;
22100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
22110 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f  he query plan fo
22120 72 20 61 63 63 65 73 73 69 6e 67 20 74 61 62 6c  r accessing tabl
22130 65 20 70 53 72 63 2d 3e 70 54 61 62 2e 20 57 72  e pSrc->pTab. Wr
22140 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20  ite the.** best 
22150 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69  query plan and i
22160 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65  ts cost into the
22170 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63   WhereCost objec
22180 74 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61  t supplied .** a
22190 73 20 74 68 65 20 6c 61 73 74 20 70 61 72 61 6d  s the last param
221a0 65 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  eter. This funct
221b0 69 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61 74  ion may calculat
221c0 65 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a  e the cost of.**
221d0 20 62 6f 74 68 20 72 65 61 6c 20 61 6e 64 20 76   both real and v
221e0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63 61  irtual table sca
221f0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ns..**.** This f
22200 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
22210 20 74 61 6b 65 20 4f 52 44 45 52 20 42 59 20 6f   take ORDER BY o
22220 72 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20  r DISTINCT into 
22230 61 63 63 6f 75 6e 74 2e 20 20 4e 6f 72 0a 2a 2a  account.  Nor.**
22240 20 64 6f 65 73 20 69 74 20 72 65 6d 65 6d 62 65   does it remembe
22250 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  r the virtual ta
22260 62 6c 65 20 71 75 65 72 79 20 70 6c 61 6e 2e 20  ble query plan. 
22270 20 41 6c 6c 20 69 74 20 64 6f 65 73 20 69 73 20   All it does is 
22280 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 63  compute.** the c
22290 6f 73 74 20 77 68 69 6c 65 20 64 65 74 65 72 6d  ost while determ
222a0 69 6e 69 6e 67 20 69 66 20 61 6e 20 4f 52 20 6f  ining if an OR o
222b0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61  ptimization is a
222c0 70 70 6c 69 63 61 62 6c 65 2e 20 20 54 68 65 0a  pplicable.  The.
222d0 2a 2a 20 64 65 74 61 69 6c 73 20 77 69 6c 6c 20  ** details will 
222e0 62 65 20 72 65 63 6f 6e 73 69 64 65 72 65 64 20  be reconsidered 
222f0 6c 61 74 65 72 20 69 66 20 74 68 65 20 6f 70 74  later if the opt
22300 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 66 6f 75  imization is fou
22310 6e 64 20 74 6f 20 62 65 0a 2a 2a 20 61 70 70 6c  nd to be.** appl
22320 69 63 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  icable..*/.stati
22330 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78  c void bestIndex
22340 28 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70  (WhereBestIdx *p
22350 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
22360 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
22370 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
22380 75 61 6c 28 70 2d 3e 70 53 72 63 2d 3e 70 54 61  ual(p->pSrc->pTa
22390 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
223a0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
223b0 64 78 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  dxInfo = 0;.    
223c0 70 2d 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20 26  p->ppIdxInfo = &
223d0 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 62 65  pIdxInfo;.    be
223e0 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70  stVirtualIndex(p
223f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22400 49 64 78 49 6e 66 6f 21 3d 30 20 7c 7c 20 70 2d  IdxInfo!=0 || p-
22410 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c  >pParse->db->mal
22420 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
22430 20 69 66 28 20 70 49 64 78 49 6e 66 6f 20 26 26   if( pIdxInfo &&
22440 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
22450 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20  oFreeIdxStr ){. 
22460 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22470 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
22480 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  tr);.    }.    s
22490 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
224a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 64 78  pParse->db, pIdx
224b0 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Info);.  }else.#
224c0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 62 65  endif.  {.    be
224d0 73 74 42 74 72 65 65 49 6e 64 65 78 28 70 29 3b  stBtreeIndex(p);
224e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  .  }.}../*.** Di
224f0 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20  sable a term in 
22500 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
22510 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  .  Except, do no
22520 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  t disable the te
22530 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74  rm.** if it cont
22540 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45  rols a LEFT OUTE
22550 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69  R JOIN and it di
22560 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
22570 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20  in the ON.** or 
22580 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
22590 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  that join..**.**
225a0 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65   Consider the te
225b0 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20  rm t2.z='ok' in 
225c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
225d0 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  eries:.**.**   (
225e0 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1)  SELECT * FRO
225f0 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
22600 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57  2 ON t1.a=t2.x W
22610 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a  HERE t2.z='ok'.*
22620 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20  *   (2)  SELECT 
22630 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
22640 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
22650 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
22660 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45  '.**   (3)  SELE
22670 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
22680 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78   WHERE t1.a=t2.x
22690 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
226a0 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f  *.** The t2.z='o
226b0 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  k' is disabled i
226c0 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63  n the in (2) bec
226d0 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74  ause it originat
226e0 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  es.** in the ON 
226f0 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72  clause.  The ter
22700 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  m is disabled in
22710 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20   (3) because it 
22720 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f  is not part.** o
22730 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
22740 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68  OIN.  In (1), th
22750 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69  e term is not di
22760 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d  sabled..**.** IM
22770 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
22780 20 52 2d 32 34 35 39 37 2d 35 38 36 35 35 20 4e   R-24597-58655 N
22790 6f 20 74 65 73 74 73 20 61 72 65 20 64 6f 6e 65  o tests are done
227a0 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20   for terms that 
227b0 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c  are.** completel
227c0 79 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  y satisfied by i
227d0 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44 69  ndices..**.** Di
227e0 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63  sabling a term c
227f0 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20  auses that term 
22800 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  to not be tested
22810 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   in the inner lo
22820 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  op.** of the joi
22830 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73  n.  Disabling is
22840 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
22850 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72  .  When terms ar
22860 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
22870 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69  y indices, we di
22880 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72  sable them to pr
22890 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20  event redundant 
228a0 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e  tests in the inn
228b0 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20  er.** loop.  We 
228c0 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f  would get the co
228d0 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66  rrect results if
228e0 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76   nothing were ev
228f0 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20  er disabled,.** 
22900 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20  but joins might 
22910 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
22920 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20  wer.  The trick 
22930 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73  is to disable as
22940 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63   much.** as we c
22950 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62  an without disab
22960 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20  ling too much.  
22970 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69  If we disabled i
22980 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a  n (1), we'd get.
22990 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73  ** the wrong ans
229a0 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74  wer.  See ticket
229b0 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   #813..*/.static
229c0 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72   void disableTer
229d0 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  m(WhereLevel *pL
229e0 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20  evel, WhereTerm 
229f0 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70  *pTerm){.  if( p
22a00 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70  Term.      && (p
22a10 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
22a20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
22a30 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
22a40 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
22a50 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
22a60 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
22a70 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29  P_FromJoin)).  )
22a80 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  {.    pTerm->wtF
22a90 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
22aa0 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ED;.    if( pTer
22ab0 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b  m->iParent>=0 ){
22ac0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
22ad0 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72   *pOther = &pTer
22ae0 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d  m->pWC->a[pTerm-
22af0 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
22b00 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e   if( (--pOther->
22b10 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20  nChild)==0 ){.  
22b20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
22b30 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72  m(pLevel, pOther
22b40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22b50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
22b60 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
22b70 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
22b80 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
22b90 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
22ba0 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
22bb0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
22bc0 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
22bd0 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
22be0 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
22bf0 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68  NONE entries (wh
22c00 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
22c10 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
22c20 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
22c30 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
22c40 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
22c50 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
22c60 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c  SQLITE_AFF_NONE,
22c70 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
22c80 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
22c90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22ca0 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
22cb0 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
22cc0 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
22cd0 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
22ce0 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
22cf0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
22d00 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
22d10 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
22d20 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
22d30 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
22d40 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
22d50 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
22d60 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
22d70 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
22d80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
22d90 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
22da0 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
22db0 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
22dc0 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
22dd0 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
22de0 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
22df0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
22e00 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
22e10 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
22e20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
22e30 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
22e40 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
22e50 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
22e60 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
22e70 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
22e80 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
22e90 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
22ea0 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
22eb0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
22ec0 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
22ed0 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
22ee0 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
22ef0 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
22f00 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
22f10 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
22f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22f30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp2(v, OP_Affi
22f40 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  nity, base, n);.
22f50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
22f60 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a  hangeP4(v, -1, z
22f70 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  Aff, n);.    sql
22f80 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
22f90 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
22fa0 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  se, base, n);.  
22fb0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
22fc0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
22fd0 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20  single equality 
22fe0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
22ff0 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71  E clause.  An eq
23000 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63  uality.** term c
23010 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65  an be either X=e
23020 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  xpr or X IN (...
23030 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
23040 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a  e term to be .**
23050 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   coded..**.** Th
23060 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
23070 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
23080 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  nt is left in re
23090 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a  gister iReg..**.
230a0 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
230b0 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
230c0 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
230d0 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
230e0 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
230f0 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
23100 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
23110 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
23120 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
23130 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
23140 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
23150 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
23160 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
23170 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
23180 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75  atic int codeEqu
23190 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
231a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
231b0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
231c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
231d0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
231e0 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
231f0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
23200 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
23210 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
23220 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76  evel, /* The lev
23230 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
23240 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
23250 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  king on */.  int
23260 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20   iEq,           
23270 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
23280 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77   equality term w
23290 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c  ithin this level
232a0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
232b0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
232c0 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
232d0 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
232e0 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
232f0 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
23300 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
23310 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
23320 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
23350 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
23360 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
23370 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
23380 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
23390 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
233a0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
233b0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
233c0 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
233d0 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
233e0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
233f0 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
23400 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
23410 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
23420 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
23430 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23440 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
23450 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
23460 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
23470 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
23480 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 75 38 20  op *pIn;.    u8 
23490 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  bRev = (pLevel->
234a0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
234b0 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
234c0 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  ;..    if( (pLev
234d0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
234e0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
234f0 29 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70  )!=0 .      && p
23500 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
23510 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
23520 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq].    ){.     
23530 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d   testcase( iEq==
23540 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
23550 61 73 65 28 20 69 45 71 3d 3d 70 4c 65 76 65 6c  ase( iEq==pLevel
23560 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 6e  ->plan.u.pIdx->n
23570 43 6f 6c 75 6d 6e 2d 31 20 29 3b 0a 20 20 20 20  Column-1 );.    
23580 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3e    testcase( iEq>
23590 30 20 26 26 20 69 45 71 2b 31 3c 70 4c 65 76 65  0 && iEq+1<pLeve
235a0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
235b0 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
235c0 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20   testcase( bRev 
235d0 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20  );.      bRev = 
235e0 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  !bRev;.    }.   
235f0 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
23600 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52  =TK_IN );.    iR
23610 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
23620 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
23630 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
23640 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20  rse, pX, 0);.   
23650 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
23660 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
23670 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
23680 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20  e( bRev );.     
23690 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20   bRev = !bRev;. 
236a0 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d 20     }.    iTab = 
236b0 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
236c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
236d0 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
236e0 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
236f0 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61   iTab, 0);.    a
23700 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
23710 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
23720 45 52 45 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20  ERE_IN_ABLE );. 
23730 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75     if( pLevel->u
23740 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20  .in.nIn==0 ){.  
23750 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
23760 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
23770 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
23780 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
23790 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20  >u.in.nIn++;.   
237a0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
237b0 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73  nLoop =.       s
237c0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
237d0 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  rFree(pParse->db
237e0 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
237f0 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  InLoop,.        
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23810 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65        sizeof(pLe
23820 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
23830 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e  p[0])*pLevel->u.
23840 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e  in.nIn);.    pIn
23850 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e   = pLevel->u.in.
23860 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
23870 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49   pIn ){.      pI
23880 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  n += pLevel->u.i
23890 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20  n.nIn - 1;.     
238a0 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61   pIn->iCur = iTa
238b0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  b;.      if( eTy
238c0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
238d0 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  ID ){.        pI
238e0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
238f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23900 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
23910 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20  ab, iReg);.     
23920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23930 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
23940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23950 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
23960 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b   iTab, 0, iReg);
23970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
23980 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d  In->eEndLoopOp =
23990 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
239a0 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  : OP_Next;.     
239b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
239c0 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
239d0 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73   iReg);.    }els
239e0 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
239f0 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20  >u.in.nIn = 0;. 
23a00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
23a10 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
23a20 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
23a30 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
23a40 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
23a50 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
23a60 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e  aluate all == an
23a70 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
23a80 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78   for an.** index
23a90 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
23aa0 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
23ab0 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
23ac0 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
23ad0 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
23ae0 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
23af0 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
23b00 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
23b10 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
23b20 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
23b30 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
23b40 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
23b50 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
23b60 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
23b70 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
23b80 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
23b90 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
23ba0 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
23bb0 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
23bc0 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
23bd0 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
23be0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
23bf0 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
23c00 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
23c10 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
23c20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
23c30 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   be stored.** in
23c40 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
23c50 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69  isters and the i
23c60 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
23c70 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  t register is re
23c80 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  turned..**.** In
23c90 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
23ca0 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
23cb0 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
23cc0 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
23cd0 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
23ce0 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
23cf0 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
23d00 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
23d10 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
23d20 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
23d30 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
23d40 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
23d50 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a  mory cell and.**
23d60 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66   compute the aff
23d70 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  inity string..**
23d80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23d90 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65   always allocate
23da0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d  s at least one m
23db0 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
23dc0 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e  eturns.** the in
23dd0 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f  dex of that memo
23de0 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64  ry cell. The cod
23df0 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20  e that.** calls 
23e00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
23e10 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72  l use that memor
23e20 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20  y cell to store 
23e30 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a  the termination.
23e40 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20  ** key value of 
23e50 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e  the loop.  If on
23e60 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65  e or more IN ope
23e70 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74  rators appear, t
23e80 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
23e90 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ine allocates an
23ea0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20   additional nEq 
23eb0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
23ec0 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65   internal.** use
23ed0 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
23ee0 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66  eturning, *pzAff
23ef0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
23f00 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
23f10 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70  taining a.** cop
23f20 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  y of the column 
23f30 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
23f40 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c  of the index all
23f50 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  ocated using.** 
23f60 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
23f70 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69  ). Except, entri
23f80 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f  es in the copy o
23f90 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73  f the string ass
23fa0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
23fb0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
23fc0 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f  ints that use NO
23fd0 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20  NE affinity are 
23fe0 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45  set to.** SQLITE
23ff0 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20  _AFF_NONE. This 
24000 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  is to deal with 
24010 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20  SQL such as the 
24020 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
24030 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
24040 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52  t1(a TEXT PRIMAR
24050 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20  Y KEY, b);.**   
24060 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
24070 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45  t1 AS t2, t1 WHE
24080 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a  RE t1.a = t2.b;.
24090 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
240a0 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
240b0 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68  index on t1(a) h
240c0 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79  as TEXT affinity
240d0 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74  . But since.** t
240e0 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69  he right hand si
240f0 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69  de of the equali
24100 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74  ty constraint (t
24110 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66  2.b) has NONE af
24120 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f  finity,.** no co
24130 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20  nversion should 
24140 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66  be attempted bef
24150 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62  ore using a t2.b
24160 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f   value as part o
24170 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65  f.** a key to se
24180 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20  arch the index. 
24190 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  Hence the first 
241a0 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75  byte in the retu
241b0 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a  rned affinity.**
241c0 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20   string in this 
241d0 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65  example would be
241e0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41   set to SQLITE_A
241f0 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74  FF_NONE..*/.stat
24200 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
24210 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
24220 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
24230 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
24240 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
24250 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
24260 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
24270 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
24280 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
24290 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  g */.  WhereClau
242a0 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
242b0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
242c0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
242d0 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57  tReady,     /* W
242e0 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52  hich parts of FR
242f0 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  OM have not yet 
24300 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20  been coded */.  
24310 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20  int nExtraReg,  
24320 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24330 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
24340 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
24350 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66  /.  char **pzAff
24360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
24370 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  : Set to point t
24380 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  o affinity strin
24390 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  g */.){.  int nE
243a0 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  q = pLevel->plan
243b0 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e  .nEq;   /* The n
243c0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
243d0 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  N constraints to
243e0 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20   code */.  Vdbe 
243f0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
24400 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
24410 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  vm under constru
24420 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
24430 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
24440 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24450 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64  index being used
24460 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a   for this loop *
24470 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
24480 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20  Level->iTabCur; 
24490 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
244a0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
244b0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
244c0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
244d0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73  /* A single cons
244e0 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  traint term */. 
244f0 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24510 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
24520 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b  /.  int regBase;
24530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24540 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
24550 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  er */.  int nReg
24560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24570 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24580 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
24590 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
245a0 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20  ar *zAff;       
245b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
245c0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74  ffinity string t
245d0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f  o return */..  /
245e0 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73  * This module is
245f0 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20   only called on 
24600 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74  query plans that
24610 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a   use an index. *
24620 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76  /.  assert( pLev
24630 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
24640 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
24650 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 65   );.  pIdx = pLe
24660 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
24670 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
24680 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
24690 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
246a0 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
246b0 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
246c0 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
246d0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
246e0 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Reg = pLevel->pl
246f0 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52  an.nEq + nExtraR
24700 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  eg;.  pParse->nM
24710 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a  em += nReg;..  z
24720 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
24730 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
24740 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  , sqlite3IndexAf
24750 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
24760 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66  x));.  if( !zAff
24770 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
24780 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24790 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
247a0 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75  Evaluate the equ
247b0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
247c0 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
247d0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
247e0 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  nEq );.  for(j=0
247f0 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
24800 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69     int r1;.    i
24810 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt k = pIdx->aiC
24820 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54  olumn[j];.    pT
24830 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
24840 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  WC, iCur, k, not
24850 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 70  Ready, pLevel->p
24860 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70 49 64  lan.wsFlags, pId
24870 78 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  x);.    if( pTer
24880 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
24890 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
248a0 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69  ng true for indi
248b0 63 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61  ces with redunda
248c0 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20  nt columns. .   
248d0 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49   ** Ex: CREATE I
248e0 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
248f0 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46  b,a); SELECT * F
24900 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30  ROM t1 WHERE a=0
24910 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20   AND b=0; */.   
24920 20 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72   testcase( (pTer
24930 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
24940 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20  M_CODED)!=0 );. 
24950 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
24960 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
24970 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
24980 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
24990 36 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63  62 */.    r1 = c
249a0 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
249b0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
249c0 4c 65 76 65 6c 2c 20 6a 2c 20 72 65 67 42 61 73  Level, j, regBas
249d0 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31  e+j);.    if( r1
249e0 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20  !=regBase+j ){. 
249f0 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31       if( nReg==1
24a00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24a10 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
24a20 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  g(pParse, regBas
24a30 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42  e);.        regB
24a40 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20  ase = r1;.      
24a50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
24a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24a70 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
24a80 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
24a90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
24aa0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
24ab0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
24ac0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
24ad0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
24ae0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
24af0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
24b00 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
24b10 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
24b20 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ))==0 ){.      E
24b30 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54  xpr *pRight = pT
24b40 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
24b50 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
24b60 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
24b70 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
24b80 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
24b90 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
24ba0 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20    if( zAff ){.  
24bb0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24bc0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
24bd0 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
24be0 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
24bf0 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
24c00 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
24c10 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
24c20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
24c30 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
24c40 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
24c50 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  e(pRight, zAff[j
24c60 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
24c70 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
24c80 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
24c90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24ca0 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20   }.  }.  *pzAff 
24cb0 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e  = zAff;.  return
24cc0 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66   regBase;.}..#if
24cd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24ce0 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54  _EXPLAIN./*.** T
24cf0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
24d00 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c   helper for expl
24d10 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20  ainIndexRange() 
24d20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72  below.**.** pStr
24d30 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20   holds the text 
24d40 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
24d50 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69   that we are bui
24d60 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72  lding up one ter
24d70 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20  m.** at a time. 
24d80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
24d90 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  ds a new term to
24da0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
24db0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54  expression..** T
24dc0 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74  erms are separat
24dd0 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64  ed by AND so add
24de0 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20   the "AND" text 
24df0 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73  for second and s
24e00 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72  ubsequent.** ter
24e10 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ms only..*/.stat
24e20 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41  ic void explainA
24e30 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72  ppendTerm(.  Str
24e40 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20  Accum *pStr,    
24e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24e60 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20  text expression 
24e70 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20  being built */. 
24e80 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20   int iTerm,     
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ea0 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65  Index of this te
24eb0 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65  rm.  First is ze
24ec0 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ro */.  const ch
24ed0 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20  ar *zColumn,    
24ee0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
24ef0 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
24f00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20  onst char *zOp  
24f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
24f20 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  me of the operat
24f30 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  or */.){.  if( i
24f40 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74  Term ) sqlite3St
24f50 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
24f60 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a  r, " AND ", 5);.
24f70 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
24f80 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43  mAppend(pStr, zC
24f90 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71  olumn, -1);.  sq
24fa0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
24fb0 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31  end(pStr, zOp, 1
24fc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
24fd0 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
24fe0 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a   "?", 1);.}../*.
24ff0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76  ** Argument pLev
25000 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73  el describes a s
25010 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e  trategy for scan
25020 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e  ning table pTab.
25030 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
25040 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
25050 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
25060 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
25070 6e 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ng a description
25080 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65  .** of the subse
25090 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20  t of table rows 
250a0 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73  scanned by the s
250b0 74 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66  trategy in the f
250c0 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c  orm of an.** SQL
250d0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c   expression. Or,
250e0 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
250f0 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69   scanned, NULL i
25100 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
25110 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
25120 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  f the query:.**.
25130 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
25140 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20  OM t1 WHERE a=1 
25150 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69  AND b>2;.**.** i
25160 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20  s run and there 
25170 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  is an index on (
25180 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73  a, b), then this
25190 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
251a0 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69  s a.** string si
251b0 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
251c0 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a    "a=? AND b>?".
251d0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
251e0 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
251f0 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  s to memory obta
25200 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
25210 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  3DbMalloc()..** 
25220 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
25230 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
25240 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74  caller to free t
25250 68 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69  he buffer when i
25260 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  t is.** no longe
25270 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  r required..*/.s
25280 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c  tatic char *expl
25290 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71  ainIndexRange(sq
252a0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
252b0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 54  Level *pLevel, T
252c0 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 57  able *pTab){.  W
252d0 68 65 72 65 50 6c 61 6e 20 2a 70 50 6c 61 6e 20  herePlan *pPlan 
252e0 3d 20 26 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b  = &pLevel->plan;
252f0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
25300 20 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70 49 64 78   = pPlan->u.pIdx
25310 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 50  ;.  int nEq = pP
25320 6c 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74 20  lan->nEq;.  int 
25330 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
25340 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
25350 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75  l;.  int *aiColu
25360 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
25370 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75  olumn;.  StrAccu
25380 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45  m txt;..  if( nE
25390 71 3d 3d 30 20 26 26 20 28 70 50 6c 61 6e 2d 3e  q==0 && (pPlan->
253a0 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
253b0 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
253c0 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20  _TOP_LIMIT))==0 
253d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
253e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
253f0 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c  rAccumInit(&txt,
25400 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41   0, 0, SQLITE_MA
25410 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74  X_LENGTH);.  txt
25420 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69  .db = db;.  sqli
25430 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
25440 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29  d(&txt, " (", 2)
25450 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
25460 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78  Eq; i++){.    ex
25470 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
25480 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69  &txt, i, aCol[ai
25490 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65  Column[i]].zName
254a0 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a  , "=");.  }..  j
254b0 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 50 6c 61   = i;.  if( pPla
254c0 6e 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  n->wsFlags&WHERE
254d0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
254e0 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d    char *z = (j==
254f0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
25500 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
25510 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
25520 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
25530 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
25540 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b  t, i++, z, ">");
25550 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 6c 61 6e  .  }.  if( pPlan
25560 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
25570 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
25580 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
25590 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
255a0 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
255b0 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
255c0 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
255d0 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
255e0 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20  , i, z, "<");.  
255f0 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
25600 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
25610 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  ")", 1);.  retur
25620 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  n sqlite3StrAccu
25630 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d  mFinish(&txt);.}
25640 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25650 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
25660 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c   unless currentl
25670 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20  y processing an 
25680 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
25690 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49  AN.** command. I
256a0 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e  f the query bein
256b0 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e  g compiled is an
256c0 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
256d0 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  LAN, a single.**
256e0 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
256f0 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74   to the output t
25700 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  o describe the t
25710 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65  able scan strate
25720 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c  gy in .** pLevel
25730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25740 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
25750 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25770 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
25780 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
25790 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
257a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
257b0 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70  e list this loop
257c0 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20   refers to */.  
257d0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
257e0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
257f0 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65  /* Scan to write
25800 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
25810 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  de for */.  int 
25820 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
25830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
25840 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22  alue for "level"
25850 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
25860 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
25870 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25880 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
25890 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d  for "from" colum
258a0 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
258b0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258d0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
258e0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
258f0 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  Begin() */.){.  
25900 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
25910 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 75 33  ain==2 ){.    u3
25920 32 20 66 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c  2 flags = pLevel
25930 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a  ->plan.wsFlags;.
25940 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
25950 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
25960 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
25970 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
25980 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
25990 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
259a0 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73  /* VM being cons
259b0 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73  tructed */.    s
259c0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
259d0 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20  rse->db;     /* 
259e0 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
259f0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  */.    char *zMs
25a00 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
25a10 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
25a20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75  add to EQP outpu
25a30 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
25a40 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20 20 20  _int64 nRow;    
25a50 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
25a60 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
25a70 73 20 76 69 73 69 74 65 64 20 62 79 20 73 63 61  s visited by sca
25a80 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  n */.    int iId
25a90 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
25aa0 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74  ctId;  /* Select
25ab0 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f   id (left-most o
25ac0 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f  utput column) */
25ad0 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63  .    int isSearc
25ae0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
25af0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
25b00 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66   SEARCH. False f
25b10 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20 20 20  or SCAN. */..   
25b20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
25b30 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28  E_MULTI_OR) || (
25b40 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
25b50 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
25b60 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69  ) return;..    i
25b70 73 53 65 61 72 63 68 20 3d 20 28 70 4c 65 76 65  sSearch = (pLeve
25b80 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29 0a 20  l->plan.nEq>0). 
25b90 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
25ba0 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  flags&(WHERE_BTM
25bb0 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
25bc0 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20  _LIMIT))!=0.    
25bd0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74           || (wct
25be0 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f  rlFlags&(WHERE_O
25bf0 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45  RDERBY_MIN|WHERE
25c00 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a  _ORDERBY_MAX));.
25c10 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
25c20 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
25c30 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53  %s", isSearch?"S
25c40 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a  EARCH":"SCAN");.
25c50 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
25c60 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
25c70 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
25c80 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
25c90 20 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64   "%s SUBQUERY %d
25ca0 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69  ", zMsg,pItem->i
25cb0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d  SelectId);.    }
25cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67  else{.      zMsg
25cd0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
25ce0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
25cf0 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67   TABLE %s", zMsg
25d00 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
25d10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
25d20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
25d30 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
25d40 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
25d50 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25  , zMsg, "%s AS %
25d60 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
25d70 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a  >zAlias);.    }.
25d80 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
25d90 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
25da0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
25db0 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61   *zWhere = expla
25dc0 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c  inIndexRange(db,
25dd0 20 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d 2d 3e   pLevel, pItem->
25de0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73  pTab);.      zMs
25df0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
25e00 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
25e10 73 20 55 53 49 4e 47 20 25 73 25 73 49 4e 44 45  s USING %s%sINDE
25e20 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20  X%s%s%s", zMsg, 
25e30 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61  .          ((fla
25e40 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
25e50 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54 49  INDEX)?"AUTOMATI
25e60 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20  C ":""),.       
25e70 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
25e80 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f  RE_IDX_ONLY)?"CO
25e90 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20  VERING ":""),.  
25ea0 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
25eb0 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
25ec0 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20  EX)?"":" "),.   
25ed0 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
25ee0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
25ef0 58 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d 3e 70  X)?"": pLevel->p
25f00 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d  lan.u.pIdx->zNam
25f10 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 57  e),.          zW
25f20 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  here.      );.  
25f30 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
25f40 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20  e(db, zWhere);. 
25f50 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
25f60 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49  gs & (WHERE_ROWI
25f70 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
25f80 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
25f90 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
25fa0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
25fb0 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45  , "%s USING INTE
25fc0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
25fd0 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20  , zMsg);..      
25fe0 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
25ff0 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20  ROWID_EQ ){.    
26000 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
26010 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
26020 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d  Msg, "%s (rowid=
26030 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
26040 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
26050 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  gs&WHERE_BOTH_LI
26060 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48  MIT)==WHERE_BOTH
26070 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
26080 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
26090 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
260a0 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20  g, "%s (rowid>? 
260b0 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a  AND rowid<?)", z
260c0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
260d0 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52  e if( flags&WHER
260e0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
260f0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
26100 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
26110 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
26120 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id>?)", zMsg);. 
26130 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
26140 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
26150 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
26160 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
26170 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
26180 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c   "%s (rowid<?)",
26190 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zMsg);.      }.
261a0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
261b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
261c0 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20  LTABLE.    else 
261d0 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
261e0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
261f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
26200 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
26210 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76  *pVtabIdx = pLev
26220 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  el->plan.u.pVtab
26230 49 64 78 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  Idx;.      zMsg 
26240 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
26250 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
26260 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
26270 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67  DEX %d:%s", zMsg
26280 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26290 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 69 64      pVtabIdx->id
262a0 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e  xNum, pVtabIdx->
262b0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23  idxStr);.    }.#
262c0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 77 63  endif.    if( wc
262d0 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f  trlFlags&(WHERE_
262e0 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52  ORDERBY_MIN|WHER
262f0 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 20 29  E_ORDERBY_MAX) )
26300 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
26310 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
26320 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
26330 20 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d   );.      nRow =
26340 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
26350 20 20 20 20 20 6e 52 6f 77 20 3d 20 28 73 71 6c       nRow = (sql
26360 69 74 65 33 5f 69 6e 74 36 34 29 70 4c 65 76 65  ite3_int64)pLeve
26370 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20  l->plan.nRow;.  
26380 20 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73    }.    zMsg = s
26390 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
263a0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25  b, zMsg, "%s (~%
263b0 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67  lld rows)", zMsg
263c0 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c  , nRow);.    sql
263d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
263e0 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49  , OP_Explain, iI
263f0 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d  d, iLevel, iFrom
26400 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
26410 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
26420 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
26430 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78  nOneScan(u,v,w,x
26440 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
26450 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
26460 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  AIN */.../*.** G
26470 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
26480 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
26490 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70  e iLevel-th loop
264a0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
264b0 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ause.** implemen
264c0 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  tation described
264d0 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73   by pWInfo..*/.s
264e0 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
264f0 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
26500 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
26510 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
26520 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
26530 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
26540 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
26550 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
26560 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
26570 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
26580 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
26590 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
265a0 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  s,      /* One o
265b0 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
265c0 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
265d0 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
265e0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
265f0 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61       /* Which ta
26600 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74  bles are current
26610 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ly available */.
26620 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20  ){.  int j, k;  
26630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
26640 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
26650 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
26660 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
26670 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
26680 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  table */.  int a
26690 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20  ddrNxt;         
266a0 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
266b0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
266c0 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
266d0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  se */.  int omit
266e0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  Table;       /* 
266f0 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
26700 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
26710 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
26720 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26730 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
26740 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
26750 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  der */.  WhereLe
26760 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a  vel *pLevel;  /*
26770 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c   The where level
26780 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
26790 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
267a0 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70  WC;    /* Decomp
267b0 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  osition of the e
267c0 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75  ntire WHERE clau
267d0 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
267e0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
267f0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45          /* A WHE
26800 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  RE clause term *
26810 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
26820 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
26830 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
26840 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65  ontext */.  Vdbe
26850 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
26860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26870 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74  he prepared stmt
26880 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
26890 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ions */.  struct
268a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
268b0 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f  TabItem;  /* FRO
268c0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
268d0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
268e0 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20  nt addrBrk;     
268f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26900 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
26910 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
26920 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
26930 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20  drCont;         
26940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
26950 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
26960 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63  ue with next cyc
26970 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  le */.  int iRow
26980 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  idReg = 0;      
26990 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74    /* Rowid is st
269a0 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67  ored in this reg
269b0 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65  ister, if not ze
269c0 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c  ro */.  int iRel
269d0 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20  easeReg = 0;    
269e0 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
269f0 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72  er to free befor
26a00 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20  e returning */. 
26a10 20 42 69 74 6d 61 73 6b 20 6e 65 77 4e 6f 74 52   Bitmask newNotR
26a20 65 61 64 79 3b 20 20 20 20 20 20 2f 2a 20 52 65  eady;      /* Re
26a30 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
26a40 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
26a50 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20  ->pParse;.  v = 
26a60 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
26a70 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   pWC = pWInfo->p
26a80 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  WC;.  pLevel = &
26a90 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
26aa0 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  ];.  pTabItem = 
26ab0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
26ac0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
26ad0 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
26ae0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
26af0 0a 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65  .  bRev = (pLeve
26b00 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
26b10 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
26b20 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65  !=0;.  omitTable
26b30 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
26b40 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
26b50 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20  _IDX_ONLY)!=0 . 
26b60 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63            && (wc
26b70 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26b80 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30  _FORCE_TABLE)==0
26b90 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
26ba0 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 4a  ent((v, "Begin J
26bb0 6f 69 6e 20 4c 6f 6f 70 20 25 64 22 2c 20 69 4c  oin Loop %d", iL
26bc0 65 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a 20 43 72  evel));..  /* Cr
26bd0 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20  eate labels for 
26be0 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20  the "break" and 
26bf0 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72  "continue" instr
26c00 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72  uctions.  ** for
26c10 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
26c20 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72  p.  Jump to addr
26c30 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  Brk to break out
26c40 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a   of a loop..  **
26c50 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f   Jump to cont to
26c60 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   go immediately 
26c70 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
26c80 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
26c90 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a  * loop..  **.  *
26ca0 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73 20  * When there is 
26cb0 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  an IN operator, 
26cc0 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22  we also have a "
26cd0 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74  addrNxt" label t
26ce0 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74  hat.  ** means t
26cf0 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
26d00 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75  the next IN valu
26d10 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20  e combination.  
26d20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20  When.  ** there 
26d30 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74  are no IN operat
26d40 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  ors in the const
26d50 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64  raints, the "add
26d60 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a  rNxt" label.  **
26d70 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
26d80 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a  "addrBrk"..  */.
26d90 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76    addrBrk = pLev
26da0 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c  el->addrBrk = pL
26db0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
26dc0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
26dd0 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43  abel(v);.  addrC
26de0 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  ont = pLevel->ad
26df0 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
26e00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
26e10 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
26e20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
26e30 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  le of a LEFT OUT
26e40 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74  ER JOIN, allocat
26e50 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69  e and.  ** initi
26e60 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63  alize a memory c
26e70 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73  ell that records
26e80 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d   if this table m
26e90 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20  atches any.  ** 
26ea0 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20  row of the left 
26eb0 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
26ec0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  n..  */.  if( pL
26ed0 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26  evel->iFrom>0 &&
26ee0 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f   (pTabItem[0].jo
26ef0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
26f00 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76  )!=0 ){.    pLev
26f10 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20  el->iLeftJoin = 
26f20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
26f30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26f40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
26f50 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 0, pLevel->
26f60 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
26f70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
26f80 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20  "init LEFT JOIN 
26f90 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29  no-match flag"))
26fa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
26fb0 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46 52  ial case of a FR
26fc0 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM clause subque
26fd0 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ry implemented a
26fe0 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  s a co-routine *
26ff0 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d  /.  if( pTabItem
27000 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  ->viaCoroutine )
27010 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65  {.    int regYie
27020 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72  ld = pTabItem->r
27030 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  egReturn;.    sq
27040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27050 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
27060 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  TabItem->addrFil
27070 6c 53 75 62 2d 31 2c 20 72 65 67 59 69 65 6c 64  lSub-1, regYield
27080 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
27090 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65  2 =  sqlite3Vdbe
270a0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
270b0 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  ld, regYield);. 
270c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
270d0 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20  v, "next row of 
270e0 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c 20  co-routine %s", 
270f0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
27100 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c  zName));.    sql
27110 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27120 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59 69 65 6c  , OP_If, regYiel
27130 64 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  d+1, addrBrk);. 
27140 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
27150 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65  OP_Goto;.  }else
27160 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
27170 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
27180 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 65 76 65  LE.  if(  (pLeve
27190 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
271a0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
271b0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
271c0 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65 20  /* Case 0:  The 
271d0 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
271e0 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
271f0 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
27200 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  Next.    **     
27210 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
27220 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  he data..    */.
27230 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20      int iReg;   
27240 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20  /* P3 Value for 
27250 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20  OP_VFilter */.  
27260 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75    int addrNotFou
27270 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  nd;.    sqlite3_
27280 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61  index_info *pVta
27290 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  bIdx = pLevel->p
272a0 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a  lan.u.pVtabIdx;.
272b0 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
272c0 69 6e 74 20 3d 20 70 56 74 61 62 49 64 78 2d 3e  int = pVtabIdx->
272d0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  nConstraint;.   
272e0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
272f0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
27300 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65 20 3d  _usage *aUsage =
27310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27340 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73   pVtabIdx->aCons
27350 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20  traintUsage;.   
27360 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
27370 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
27380 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61  traint *aConstra
27390 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  int =.          
273a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273c0 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
273d0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  aConstraint;..  
273e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
273f0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
27400 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
27410 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
27420 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  Parse, nConstrai
27430 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e  nt+2);.    addrN
27440 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c  otFound = pLevel
27450 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66  ->addrBrk;.    f
27460 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73  or(j=1; j<=nCons
27470 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
27480 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
27490 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29  Constraint; k++)
274a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 55  {.        if( aU
274b0 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65  sage[k].argvInde
274c0 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  x==j ){.        
274d0 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20    int iTarget = 
274e0 69 52 65 67 2b 6a 2b 31 3b 0a 20 20 20 20 20 20  iReg+j+1;.      
274f0 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
27500 2d 3e 61 5b 61 43 6f 6e 73 74 72 61 69 6e 74 5b  ->a[aConstraint[
27510 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 3b  k].iTermOffset];
27520 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
27530 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27540 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
27550 20 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c         codeEqual
27560 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
27570 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6b  pTerm, pLevel, k
27580 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
27590 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46          addrNotF
275a0 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  ound = pLevel->a
275b0 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 20 20  ddrNxt;.        
275c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
275d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
275e0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65  Code(pParse, pTe
275f0 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
27600 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  t, iTarget);.   
27610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27620 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27630 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27640 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72    if( k==nConstr
27650 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  aint ) break;.  
27660 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
27670 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
27680 49 6e 74 65 67 65 72 2c 20 70 56 74 61 62 49 64  Integer, pVtabId
27690 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29  x->idxNum, iReg)
276a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
276b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
276c0 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67  teger, j-1, iReg
276d0 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
276e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
276f0 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20  _VFilter, iCur, 
27700 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52  addrNotFound, iR
27710 65 67 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64  eg, pVtabIdx->id
27720 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
27730 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
27740 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65  bIdx->needToFree
27750 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52 49  IdxStr ? P4_MPRI
27760 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29  NTF : P4_STATIC)
27770 3b 0a 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e  ;.    pVtabIdx->
27780 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
27790 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
277a0 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; j<nConstraint
277b0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
277c0 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74  ( aUsage[j].omit
277d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
277e0 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61  iTerm = aConstra
277f0 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  int[j].iTermOffs
27800 65 74 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61  et;.        disa
27810 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
27820 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b  &pWC->a[iTerm]);
27830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27840 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
27850 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c  OP_VNext;.    pL
27860 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
27870 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
27880 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
27890 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
278a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
278b0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
278c0 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69   iReg, nConstrai
278d0 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  nt+2);.    sqlit
278e0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
278f0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c  Parse, 1);.  }el
27900 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
27910 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
27920 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20  TABLE */..  if( 
27930 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
27940 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
27950 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20  ID_EQ ){.    /* 
27960 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20  Case 1:  We can 
27970 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
27980 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
27990 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
279a0 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74           equalit
279b0 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
279c0 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
279d0 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a  ield.  Or.    **
279e0 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66            we ref
279f0 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20  erence multiple 
27a00 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f  rows using a "ro
27a10 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20  wid IN (...)".  
27a20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
27a30 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a  nstruct..    */.
27a40 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20      iReleaseReg 
27a50 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
27a60 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
27a70 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
27a80 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
27a90 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
27aa0 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20  |WO_IN, 0);.    
27ab0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
27ac0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27ad0 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
27ae0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
27af0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
27b00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
27b10 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
27b20 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
27b30 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
27b40 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64  62 */.    iRowid
27b50 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69  Reg = codeEquali
27b60 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
27b70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c  Term, pLevel, 0,
27b80 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
27b90 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
27ba0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
27bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27bc0 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
27bd0 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  Int, iRowidReg, 
27be0 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71  addrNxt);.    sq
27bf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
27c00 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
27c10 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20   iCur, addrNxt, 
27c20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
27c30 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
27c40 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
27c50 50 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67  Parse, iRowidReg
27c60 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
27c70 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
27c80 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
27c90 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
27ca0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
27cb0 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c  , "pk"));.    pL
27cc0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
27cd0 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  op;.  }else if( 
27ce0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
27cf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
27d00 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  ID_RANGE ){.    
27d10 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68  /* Case 2:  We h
27d20 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
27d30 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
27d40 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
27d50 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ield..    */.   
27d60 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
27d70 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73  _Noop;.    int s
27d80 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65  tart;.    int me
27d90 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20  mEndValue = 0;. 
27da0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
27db0 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
27dc0 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
27dd0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53  ble==0 );.    pS
27de0 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  tart = findTerm(
27df0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
27e00 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
27e10 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 70 45  O_GE, 0);.    pE
27e20 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  nd = findTerm(pW
27e30 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
27e40 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
27e50 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LE, 0);.    if( 
27e60 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
27e70 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
27e80 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
27e90 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
27ea0 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
27eb0 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
27ec0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
27ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27ee0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
27ef0 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
27f00 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
27f10 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
27f20 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
27f30 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
27f40 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
27f50 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  dary */..      /
27f60 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
27f70 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
27f80 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
27f90 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
27fa0 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
27fb0 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
27fc0 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
27fd0 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
27fe0 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
27ff0 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
28000 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
28010 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
28020 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20   OP_SeekGt,.    
28030 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
28040 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
28050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
28060 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74  LT */  OP_SeekLt
28070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
28080 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
28090 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGe.      };.   
280a0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
280b0 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
280c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
280d0 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
280e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
280f0 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
28100 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
28110 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
28120 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
28130 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
28140 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
28150 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
28160 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  . */..      test
28170 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
28180 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
28190 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
281a0 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
281b0 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
281c0 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
281d0 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
281e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
281f0 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
28200 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
28210 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
28220 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
28230 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72  , pX->pRight, &r
28240 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
28250 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
28260 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70  , aMoveOp[pX->op
28270 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61  -TK_GT], iCur, a
28280 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
28290 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
282a0 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
282b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
282c0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
282d0 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
282e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
282f0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
28300 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
28310 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
28320 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
28330 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28350 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
28360 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
28370 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
28380 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
28390 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
283a0 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20  r *pX;.      pX 
283b0 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
283c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
283d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
283e0 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  rt( pEnd->leftCu
283f0 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
28400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
28410 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
28420 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
28430 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
28440 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45  62 */.      memE
28450 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
28460 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
28470 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
28480 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
28490 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
284a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
284b0 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
284c0 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
284d0 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
284e0 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
284f0 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
28500 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
28510 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
28520 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
28530 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
28540 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
28550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
28560 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
28570 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
28580 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
28590 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
285a0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
285b0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
285c0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
285d0 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69 66 28  = start;.    if(
285e0 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20 70 45   pStart==0 && pE
285f0 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nd==0 ){.      p
28600 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
28610 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
28620 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
28630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
28640 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
28650 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
28660 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
28670 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52  Noop ){.      iR
28680 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
28690 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
286a0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
286b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
286c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
286d0 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
286e0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
286f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
28700 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
28710 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
28720 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
28730 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
28740 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
28750 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
28760 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
28770 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
28780 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
28790 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
287a0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
287b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
287c0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
287d0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
287e0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
287f0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a  E_COLUMN_EQ) ){.
28800 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41      /* Case 3: A
28810 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69   scan using an i
28820 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
28830 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
28840 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79  WHERE clause may
28850 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72   contain zero or
28860 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a   more equality .
28870 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
28880 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49  erms ("==" or "I
28890 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68  N" operators) th
288a0 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
288b0 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  N.    **        
288c0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
288d0 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
288e0 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
288f0 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tain.    **     
28900 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
28910 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
28920 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
28930 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a  he indexed.    *
28940 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
28950 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
28960 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20  y follows the N 
28970 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79  equalities. Only
28980 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
28990 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
289a0 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
289b0 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
289c0 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
289d0 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
289e0 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22  he "==" and "IN"
289f0 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20   operators. For 
28a00 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
28a10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
28a20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
28a30 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
28a40 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
28a50 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  are all .    ** 
28a60 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65          optimize
28a70 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
28a80 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
28a90 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
28aa0 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
28ab0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
28ac0 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   x=5 AND y<10.  
28ad0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
28ae0 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20  x=5 AND y>5 AND 
28af0 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
28b00 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
28b10 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20  =5 AND z<=10.   
28b20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
28b30 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d     The z<10 term
28b40 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
28b50 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  g cannot be used
28b60 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  , only.    **   
28b70 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65        the x=5 te
28b80 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rm:.    **.    *
28b90 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
28ba0 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a   AND z<10.    **
28bb0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
28bc0 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66  N may be zero if
28bd0 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
28be0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
28bf0 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s..    **       
28c00 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
28c10 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
28c20 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e  straints, then N
28c30 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20   is at.    **   
28c40 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
28c50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
28c60 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
28c70 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
28c80 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
28c90 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
28ca0 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
28cb0 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
28cc0 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
28cd0 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
28ce0 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
28cf0 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
28d00 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
28d10 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
28d20 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20  R BY..    */  . 
28d30 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
28d40 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  u8 aStartOp[] = 
28d50 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
28d60 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
28d70 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
28d80 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
28d90 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
28da0 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
28db0 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28dd0 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
28de0 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
28df0 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
28e00 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c        OP_SeekGt,
28e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
28e20 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
28e30 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
28e40 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
28e50 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20      OP_SeekLt,  
28e60 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
28e70 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
28e80 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
28e90 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
28ea0 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20    OP_SeekGe,    
28eb0 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
28ec0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
28ed0 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
28ee0 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
28ef0 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20  OP_SeekLe       
28f00 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
28f10 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
28f20 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
28f30 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
28f40 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
28f50 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  u8 aEndOp[] = {.
28f60 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20        OP_Noop,  
28f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
28f80 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e   (!end_constrain
28f90 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ts) */.      OP_
28fa0 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20  IdxGE,          
28fb0 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e    /* 1: (end_con
28fc0 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65  straints && !bRe
28fd0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  v) */.      OP_I
28fe0 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  dxLT            
28ff0 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
29000 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29  traints && bRev)
29010 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   */.    };.    i
29020 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
29030 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e  >plan.nEq;  /* N
29040 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
29050 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  N terms */.    i
29060 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20  nt isMinQuery = 
29070 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  0;          /* I
29080 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
29090 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
290a0 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  n(x).. */.    in
290b0 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
290c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
290d0 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
290e0 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
290f0 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  alues */.    int
29100 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
29110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
29120 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  p register */.  
29130 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
29140 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
29150 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
29160 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
29170 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
29180 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
29190 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
291a0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
291b0 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
291c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
291d0 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
291e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
291f0 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
29200 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
29210 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
29220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29230 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
29240 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
29250 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
29260 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
29270 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
29280 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
29290 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
292a0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
292b0 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
292c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
292d0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
292e0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
292f0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
29300 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
29310 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
29320 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
29330 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
29340 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
29350 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
29360 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
29370 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
29380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29390 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
293a0 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
293b0 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
293c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293d0 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
293e0 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
293f0 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
29400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29410 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
29420 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
29430 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
29440 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20  ar *zEndAff;    
29450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
29460 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
29470 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
29480 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20  nt */..    pIdx 
29490 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
294a0 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43  .pIdx;.    iIdxC
294b0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
294c0 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20 28 6e  xCur;.    k = (n
294d0 45 71 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  Eq==pIdx->nColum
294e0 6e 20 3f 20 2d 31 20 3a 20 70 49 64 78 2d 3e 61  n ? -1 : pIdx->a
294f0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3b 0a 0a  iColumn[nEq]);..
29500 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
29510 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
29520 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
29530 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
29540 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
29550 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
29560 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
29570 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
29580 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
29590 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
295a0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
295b0 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
295c0 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
295d0 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
295e0 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
295f0 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
29600 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
29610 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
29620 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
29630 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
29640 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
29650 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
29660 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
29670 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
29680 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
29690 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
296a0 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
296b0 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
296c0 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
296d0 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 26  if( (wctrlFlags&
296e0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
296f0 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  N)!=0.     && (p
29700 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
29710 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 45  ags&WHERE_ORDERE
29720 44 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78  D).     && (pIdx
29730 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20  ->nColumn>nEq). 
29740 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61     ){.      /* a
29750 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
29760 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a  >nExpr==1 ); */.
29770 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
29780 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
29790 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
297a0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
297b0 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  Eq] ); */.      
297c0 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a  isMinQuery = 1;.
297d0 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
297e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
297f0 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
29800 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
29810 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
29820 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
29830 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
29840 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
29850 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
29860 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
29870 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
29880 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20      pRangeEnd = 
29890 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
298a0 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
298b0 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20   (WO_LT|WO_LE), 
298c0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78  pIdx);.      nEx
298d0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
298e0 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
298f0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
29900 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
29910 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
29920 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d  Start = findTerm
29930 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
29940 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c  otReady, (WO_GT|
29950 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a 20  WO_GE), pIdx);. 
29960 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
29970 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
29980 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
29990 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
299a0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
299b0 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
299c0 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65      ** and store
299d0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
299e0 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  hose terms in an
299f0 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
29a00 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
29a10 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a  ing at regBase..
29a20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61      */.    regBa
29a30 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61  se = codeAllEqua
29a40 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20 20 20  lityTerms(.     
29a50 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65 76 65     pParse, pLeve
29a60 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61 64 79  l, pWC, notReady
29a70 2c 20 6e 45 78 74 72 61 52 65 67 2c 20 26 7a 53  , nExtraReg, &zS
29a80 74 61 72 74 41 66 66 0a 20 20 20 20 29 3b 0a 20  tartAff.    );. 
29a90 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c     zEndAff = sql
29aa0 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
29ab0 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41  rse->db, zStartA
29ac0 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  ff);.    addrNxt
29ad0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
29ae0 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  xt;..    /* If w
29af0 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65  e are doing a re
29b00 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e  verse order scan
29b10 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
29b20 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a   index, or.    *
29b30 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65  * a forward orde
29b40 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63  r scan on a desc
29b50 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e  ending index, in
29b60 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20  terchange the . 
29b70 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
29b80 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
29b90 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
29ba0 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  eEnd)..    */.  
29bb0 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d    if( (nEq<pIdx-
29bc0 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76  >nColumn && bRev
29bd0 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ==(pIdx->aSortOr
29be0 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
29bf0 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c  _SO_ASC)).     |
29c00 7c 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d  | (bRev && pIdx-
29c10 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20  >nColumn==nEq). 
29c20 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50     ){.      SWAP
29c30 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52  (WhereTerm *, pR
29c40 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53  angeEnd, pRangeS
29c50 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  tart);.    }..  
29c60 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
29c70 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67  geStart && pRang
29c80 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
29c90 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
29ca0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
29cb0 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67 65  eStart && pRange
29cc0 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
29cd0 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
29ce0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
29cf0 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64  End && pRangeEnd
29d00 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
29d10 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _LE );.    testc
29d20 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
29d30 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  & pRangeEnd->eOp
29d40 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
29d50 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
29d60 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
29d70 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
29d80 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
29d90 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
29da0 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
29db0 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
29dc0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
29dd0 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
29de0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
29df0 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
29e00 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
29e10 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
29e20 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
29e30 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
29e40 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
29e50 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
29e60 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
29e70 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
29e80 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
29e90 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
29ea0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
29eb0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
29ec0 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
29ed0 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
29ee0 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77   (pRangeStart->w
29ef0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
29f00 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
29f10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
29f20 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
29f30 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
29f40 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
29f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
29f60 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20   zStartAff ){.  
29f70 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29f80 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
29f90 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
29fa0 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
29fb0 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
29fc0 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
29fd0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
29fe0 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
29ff0 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
2a000 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
2a010 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
2a020 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
2a030 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
2a040 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
2a050 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
2a060 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
2a070 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
2a080 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
2a090 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
2a0a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a0b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2a0c0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
2a0d0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
2a0e0 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20  zStartAff[nEq]) 
2a0f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  ){.          zSt
2a100 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
2a110 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
2a120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a130 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72    .      nConstr
2a140 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
2a150 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
2a160 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
2a170 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
2a180 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
2a190 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  662 */.    }else
2a1a0 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20   if( isMinQuery 
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 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2a1d0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
2a1e0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43  e+nEq);.      nC
2a1f0 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
2a200 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a     startEq = 0;.
2a210 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73        start_cons
2a220 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20  traints = 1;.   
2a230 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79   }.    codeApply
2a240 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
2a250 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
2a260 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41 66 66  raint, zStartAff
2a270 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61  );.    op = aSta
2a280 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73  rtOp[(start_cons
2a290 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73  traints<<2) + (s
2a2a0 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65  tartEq<<1) + bRe
2a2b0 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  v];.    assert( 
2a2c0 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  op!=0 );.    tes
2a2d0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65  tcase( op==OP_Re
2a2e0 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65 73 74  wind );.    test
2a2f0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73  case( op==OP_Las
2a300 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
2a310 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74  e( op==OP_SeekGt
2a320 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
2a330 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20  ( op==OP_SeekGe 
2a340 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2a350 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29   op==OP_SeekLe )
2a360 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2a370 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b  op==OP_SeekLt );
2a380 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a390 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
2a3a0 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
2a3b0 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
2a3c0 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f  straint);..    /
2a3d0 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65  * Load the value
2a3e0 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c   for the inequal
2a3f0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
2a400 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2a410 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69  .    ** range (i
2a420 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
2a430 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
2a440 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
2a450 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20  angeEnd ){.     
2a460 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
2a470 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72  pRangeEnd->pExpr
2a480 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
2a490 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2a4a0 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  Remove(pParse, r
2a4b0 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a  egBase+nEq, 1);.
2a4c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2a4d0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
2a4e0 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
2a4f0 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  q);.      if( (p
2a500 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
2a510 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
2a520 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2a530 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
2a540 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
2a550 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
2a560 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
2a570 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64  }.      if( zEnd
2a580 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
2a590 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
2a5a0 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
2a5b0 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d  , zEndAff[nEq])=
2a5c0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
2a5d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2a5e0 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
2a5f0 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
2a600 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
2a610 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
2a620 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
2a630 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
2a640 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
2a650 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
2a660 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
2a670 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
2a680 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
2a690 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
2a6a0 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
2a6b0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
2a6c0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2a6d0 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
2a6e0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
2a6f0 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71  ght, zEndAff[nEq
2a700 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
2a710 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53  zEndAff[nEq] = S
2a720 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
2a730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a740 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65 41 70  }  .      codeAp
2a750 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
2a760 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71  se, regBase, nEq
2a770 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20  +1, zEndAff);.  
2a780 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
2a790 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
2a7a0 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  e( pRangeEnd->wt
2a7b0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
2a7c0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
2a7d0 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
2a7e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2a7f0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
2a800 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  db, zStartAff);.
2a810 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2a820 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 45  e(pParse->db, zE
2a830 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20  ndAff);..    /* 
2a840 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
2a850 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76  body */.    pLev
2a860 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
2a870 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2a880 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  v);..    /* Chec
2a890 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
2a8a0 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
2a8b0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
2a8c0 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20  ge. */.    op = 
2a8d0 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e  aEndOp[(pRangeEn
2a8e0 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b  d || nEq) * (1 +
2a8f0 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73   bRev)];.    tes
2a900 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f  tcase( op==OP_No
2a910 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  op );.    testca
2a920 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  se( op==OP_IdxGE
2a930 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
2a940 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  ( op==OP_IdxLT )
2a950 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50  ;.    if( op!=OP
2a960 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
2a970 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2a980 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Int(v, op, iIdxC
2a990 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67  ur, addrNxt, reg
2a9a0 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
2a9b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2a9c0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2a9d0 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a   endEq!=bRev ?1:
2a9e0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
2a9f0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69  * If there are i
2aa00 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
2aa10 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61  aints, check tha
2aa20 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  t the value.    
2aa30 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
2aa40 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
2aa50 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72  inequality contr
2aa60 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ains is not NULL
2aa70 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69  ..    ** If it i
2aa80 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  s, jump to the n
2aa90 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
2aaa0 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a   the loop..    *
2aab0 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74  /.    r1 = sqlit
2aac0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2aad0 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  rse);.    testca
2aae0 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
2aaf0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2ab00 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _BTM_LIMIT );.  
2ab10 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76    testcase( pLev
2ab20 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2ab30 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
2ab40 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  IT );.    if( (p
2ab50 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2ab60 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
2ab70 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
2ab80 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20  _LIMIT))!=0 ){. 
2ab90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2aba0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
2abb0 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45  umn, iIdxCur, nE
2abc0 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  q, r1);.      sq
2abd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2abe0 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31  v, OP_IsNull, r1
2abf0 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  , addrCont);.   
2ac00 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65   }.    sqlite3Re
2ac10 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2ac20 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f  rse, r1);..    /
2ac30 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65  * Seek the table
2ac40 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75   cursor, if requ
2ac50 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61  ired */.    disa
2ac60 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
2ac70 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
2ac80 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
2ac90 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29  evel, pRangeEnd)
2aca0 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54  ;.    if( !omitT
2acb0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52  able ){.      iR
2acc0 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
2acd0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
2ace0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2acf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ad00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2ad10 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
2ad20 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
2ad30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2ad40 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
2ad50 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
2ad60 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
2ad70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ad80 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43  2(v, OP_Seek, iC
2ad90 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20  ur, iRowidReg); 
2ada0 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65   /* Deferred see
2adb0 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  k */.    }..    
2adc0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
2add0 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
2ade0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
2adf0 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
2ae00 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
2ae10 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
2ae20 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
2ae30 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
2ae40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ae50 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2ae60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
2ae70 51 55 45 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  QUE ){.      pLe
2ae80 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
2ae90 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
2aea0 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
2aeb0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50  Level->op = OP_P
2aec0 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rev;.    }else{.
2aed0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
2aee0 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
2aef0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  }.    pLevel->p1
2af00 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
2af10 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
2af20 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2af30 5f 43 4f 56 45 52 5f 53 43 41 4e 20 29 7b 0a 20  _COVER_SCAN ){. 
2af40 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
2af50 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
2af60 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
2af70 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
2af80 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
2af90 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
2afa0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
2afb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2afc0 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
2afd0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
2afe0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2aff0 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
2b000 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
2b010 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
2b020 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
2b030 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
2b040 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
2b050 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
2b060 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
2b070 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
2b080 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
2b090 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
2b0a0 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
2b0b0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
2b0c0 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
2b0d0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
2b0e0 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
2b0f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
2b100 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
2b110 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
2b120 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
2b130 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
2b140 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
2b150 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
2b160 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
2b170 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
2b180 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
2b190 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
2b1a0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
2b1b0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
2b1c0 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
2b1e0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
2b1f0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
2b200 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
2b210 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
2b220 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
2b230 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
2b240 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
2b250 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
2b260 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
2b270 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
2b280 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
2b290 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
2b2a0 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
2b2b0 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
2b2c0 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
2b2d0 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
2b2e0 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
2b2f0 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
2b300 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
2b310 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
2b320 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
2b330 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
2b340 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
2b350 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
2b360 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
2b370 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
2b380 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
2b390 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
2b3a0 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
2b3b0 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
2b3c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2b3d0 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
2b3e0 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
2b3f0 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
2b400 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
2b410 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
2b420 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
2b430 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
2b440 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
2b450 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
2b460 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
2b470 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2b480 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
2b490 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
2b4a0 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
2b4b0 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
2b4c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
2b4d0 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
2b4e0 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
2b4f0 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
2b500 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b510 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
2b520 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
2b530 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
2b540 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
2b550 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
2b560 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
2b570 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
2b580 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
2b590 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
2b5a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
2b5b0 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
2b5c0 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
2b5d0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
2b5e0 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
2b5f0 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
2b600 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
2b610 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c  erms */.    SrcL
2b620 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
2b630 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
2b640 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
2b650 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
2b660 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  on */.    Index 
2b670 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20  *pCov = 0;      
2b680 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74         /* Potent
2b690 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ial covering ind
2b6a0 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ex (or NULL) */.
2b6b0 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20      int iCovCur 
2b6c0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2b6d0 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65  ;  /* Cursor use
2b6e0 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e  d for index scan
2b6f0 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20  s (if any) */.. 
2b700 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e     int regReturn
2b710 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2b720 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
2b730 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69  Register used wi
2b740 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  th OP_Gosub */. 
2b750 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74     int regRowset
2b760 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b780 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77  Register for Row
2b790 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Set object */.  
2b7a0 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
2b7b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2b7c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b7d0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
2b7e0 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
2b7f0 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c   iLoopBody = sql
2b800 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2b810 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20  l(v);  /* Start 
2b820 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  of loop body */.
2b830 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74      int iRetInit
2b840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b860 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52   Address of regR
2b870 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20  eturn init */.  
2b880 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65    int untestedTe
2b890 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rms = 0;        
2b8a0 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72       /* Some ter
2b8b0 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  ms not completel
2b8c0 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20  y tested */.    
2b8d0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2b900 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  er */.    Expr *
2b910 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20  pAndExpr = 0;   
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b930 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29  An ".. AND (...)
2b940 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  " expression */.
2b950 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
2b960 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
2b970 54 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Term;.    assert
2b980 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
2b990 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
2b9a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2b9b0 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
2b9c0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
2b9d0 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
2b9e0 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
2b9f0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
2ba00 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c  Info->wc;.    pL
2ba10 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65  evel->op = OP_Re
2ba20 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  turn;.    pLevel
2ba30 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e  ->p1 = regReturn
2ba40 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70  ;..    /* Set up
2ba50 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
2ba60 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e  n pOrTab contain
2ba70 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65  ing the table be
2ba80 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20  ing scanned.    
2ba90 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20  ** by this loop 
2baa0 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74  in the a[0] slot
2bab0 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64   and all notRead
2bac0 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e  y tables in a[1.
2bad0 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a  .] slots..    **
2bae0 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68   This becomes th
2baf0 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65  e SrcList in the
2bb00 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20   recursive call 
2bb10 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
2bb20 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  egin()..    */. 
2bb30 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
2bb40 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20  Level>1 ){.     
2bb50 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20   int nNotReady; 
2bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb70 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
2bb80 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
2bb90 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
2bba0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f   SrcList_item *o
2bbb0 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f  rigSrc;     /* O
2bbc0 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20  riginal list of 
2bbd0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
2bbe0 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e  nNotReady = pWIn
2bbf0 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65  fo->nLevel - iLe
2bc00 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  vel - 1;.      p
2bc10 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53  OrTab = sqlite3S
2bc20 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 70 50 61  tackAllocRaw(pPa
2bc30 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
2bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc50 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72       sizeof(*pOr
2bc60 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a  Tab)+ nNotReady*
2bc70 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
2bc80 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
2bc90 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74   pOrTab==0 ) ret
2bca0 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20  urn notReady;.  
2bcb0 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c      pOrTab->nAll
2bcc0 6f 63 20 3d 20 28 69 31 36 29 28 6e 4e 6f 74 52  oc = (i16)(nNotR
2bcd0 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20  eady + 1);.     
2bce0 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20   pOrTab->nSrc = 
2bcf0 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a  pOrTab->nAlloc;.
2bd00 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72        memcpy(pOr
2bd10 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d  Tab->a, pTabItem
2bd20 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74  , sizeof(*pTabIt
2bd30 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67  em));.      orig
2bd40 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Src = pWInfo->pT
2bd50 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  abList->a;.     
2bd60 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f   for(k=1; k<=nNo
2bd70 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20  tReady; k++){.  
2bd80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f        memcpy(&pO
2bd90 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69  rTab->a[k], &ori
2bda0 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69  gSrc[pLevel[k].i
2bdb0 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f  From], sizeof(pO
2bdc0 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20  rTab->a[k]));.  
2bdd0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2bde0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
2bdf0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2be00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2be10 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  Initialize the r
2be20 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74  owset register t
2be30 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20  o contain NULL. 
2be40 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a  An SQL NULL is .
2be50 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e      ** equivalen
2be60 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f  t to an empty ro
2be70 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  wset..    **.   
2be80 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c   ** Also initial
2be90 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f  ize regReturn to
2bea0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64   contain the add
2beb0 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74  ress of the inst
2bec0 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ruction .    ** 
2bed0 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
2bee0 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74  owing the OP_Ret
2bef0 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f  urn at the botto
2bf00 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54  m of the loop. T
2bf10 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65  his.    ** is re
2bf20 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20  quired in a few 
2bf30 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49  obscure LEFT JOI
2bf40 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f  N cases where co
2bf50 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20  ntrol jumps.    
2bf60 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20  ** over the top 
2bf70 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f  of the loop into
2bf80 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e   the body of it.
2bf90 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2bfa0 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  e .    ** correc
2bfb0 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74  t response for t
2bfc0 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63  he end-of-loop c
2bfd0 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75  ode (the OP_Retu
2bfe0 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a  rn) is to .    *
2bff0 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  * fall through t
2c000 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
2c010 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20  uction, just as 
2c020 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20  an OP_Next does 
2c030 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  if.    ** called
2c040 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   on an uninitial
2c050 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20  ized cursor..   
2c060 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74   */.    if( (wct
2c070 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2c080 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
2c090 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f  0 ){.      regRo
2c0a0 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  wset = ++pParse-
2c0b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
2c0c0 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
2c0d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
2c0e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c0f0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
2c100 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d  egRowset);.    }
2c110 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20  .    iRetInit = 
2c120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c130 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2c140 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a   0, regReturn);.
2c150 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
2c160 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
2c170 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65  ause is z of the
2c180 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78   form:  (x1 OR x
2c190 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a  2 OR ...) AND y.
2c1a0 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20      ** Then for 
2c1b0 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65  every term xN, e
2c1c0 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20 73  valuate as the s
2c1d0 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e  ubexpression: xN
2c1e0 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68   AND z.    ** Th
2c1f0 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e  at way, terms in
2c200 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63 74   y that are fact
2c210 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69  ored into the di
2c220 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20  sjunction will. 
2c230 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20     ** be picked 
2c240 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72 73  up by the recurs
2c250 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ive calls to sql
2c260 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2c270 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20   below..    **. 
2c280 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20     ** Actually, 
2c290 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
2c2a0 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  on is converted 
2c2b0 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68  to "xN AND w" wh
2c2c0 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20  ere w is.    ** 
2c2d0 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67  the "interesting
2c2e0 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74  " terms of z - t
2c2f0 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f  erms that did no
2c300 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
2c310 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20  he.    ** ON or 
2c320 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
2c330 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64  a LEFT JOIN, and
2c340 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
2c350 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a  usable as .    *
2c360 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  * indices..    *
2c370 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e  /.    if( pWC->n
2c380 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20  Term>1 ){.      
2c390 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  int iTerm;.     
2c3a0 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54   for(iTerm=0; iT
2c3b0 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  erm<pWC->nTerm; 
2c3c0 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  iTerm++){.      
2c3d0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
2c3e0 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45  pWC->a[iTerm].pE
2c3f0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
2c400 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2c410 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
2c420 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  oin) ) continue;
2c430 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43  .        if( pWC
2c440 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
2c450 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
2c460 41 4c 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 20  AL|TERM_ORINFO) 
2c470 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c480 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b      if( (pWC->a[
2c490 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72  iTerm].eOperator
2c4a0 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20   & WO_ALL)==0 ) 
2c4b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c4c0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
2c4d0 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
2c4e0 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  >db, pExpr, 0);.
2c4f0 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
2c500 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
2c510 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  d(pParse->db, pA
2c520 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a  ndExpr, pExpr);.
2c530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2c540 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
2c550 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d        pAndExpr =
2c560 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2c570 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  arse, TK_AND, 0,
2c580 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20   pAndExpr, 0);. 
2c590 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2c5a0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2c5b0 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  OrWc->nTerm; ii+
2c5c0 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
2c5d0 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26  erm *pOrTerm = &
2c5e0 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20  pOrWc->a[ii];.  
2c5f0 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
2c600 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
2c610 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65  r || (pOrTerm->e
2c620 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
2c630 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
2c640 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62   WhereInfo *pSub
2c650 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
2c660 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67  /* Info for sing
2c670 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20  le OR-term scan 
2c680 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
2c690 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65  *pOrExpr = pOrTe
2c6a0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
2c6b0 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
2c6c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e  ){.          pAn
2c6d0 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70  dExpr->pLeft = p
2c6e0 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  OrExpr;.        
2c6f0 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64    pOrExpr = pAnd
2c700 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
2c710 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2c720 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
2c730 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
2c740 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
2c750 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62 57 49  /.        pSubWI
2c760 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
2c770 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
2c780 70 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c  pOrTab, pOrExpr,
2c790 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
2c7b0 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
2c7c0 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44  LOSE | WHERE_AND
2c7d0 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20  _ONLY |.        
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7f0 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
2c800 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  E | WHERE_ONETAB
2c810 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72  LE_ONLY, iCovCur
2c820 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2c830 74 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20  t( pSubWInfo || 
2c840 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2c850 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2c860 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
2c870 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
2c880 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  o ){.          W
2c890 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b  hereLevel *pLvl;
2c8a0 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61  .          expla
2c8b0 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
2c8c0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
2c8d0 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49   pOrTab, &pSubWI
2c8e0 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65  nfo->a[0], iLeve
2c8f0 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  l, pLevel->iFrom
2c900 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b  , 0.          );
2c910 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2c920 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2c930 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
2c940 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2c950 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28      int iSet = (
2c960 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  (ii==pOrWc->nTer
2c970 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20  m-1)?-1:ii);.   
2c980 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
2c990 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
2c9a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
2c9b0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
2c9c0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c   pTabItem->pTab,
2c9d0 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20   -1, iCur, .    
2c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca00 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30       regRowid, 0
2ca10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2ca20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2ca30 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Int(v, OP_RowSet
2ca40 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c  Test, regRowset,
2ca50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca70 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
2ca80 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
2ca90 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20  , iSet);.       
2caa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2cab0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2cac0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2cad0 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f  gReturn, iLoopBo
2cae0 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  dy);..          
2caf0 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f  /* The pSubWInfo
2cb00 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
2cb10 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
2cb20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20  this OR term.   
2cb30 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
2cb40 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ned one or more 
2cb50 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20  AND term from a 
2cb60 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20  notReady table. 
2cb70 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   The.          *
2cb80 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  * terms from the
2cb90 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20   notReady table 
2cba0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73  could not be tes
2cbb0 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20  ted and will.   
2cbc0 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74         ** need t
2cbd0 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65  o be tested late
2cbe0 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  r..          */.
2cbf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2cc00 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
2cc10 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65  dTerms ) unteste
2cc20 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20  dTerms = 1;..   
2cc30 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
2cc40 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65   of the OR-conne
2cc50 63 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f  cted terms are o
2cc60 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74  ptimized using t
2cc70 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20  he same.        
2cc80 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20    ** index, and 
2cc90 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65  the index is ope
2cca0 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ned using the sa
2ccb0 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  me cursor number
2ccc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79  .          ** by
2ccd0 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71   each call to sq
2cce0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2ccf0 29 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c  ) made by this l
2cd00 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20  oop, it may.    
2cd10 20 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73        ** be poss
2cd20 69 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74  ible to use that
2cd30 20 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65   index as a cove
2cd40 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20  ring index..    
2cd50 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2cd60 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c     ** If the cal
2cd70 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
2cd80 65 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72  eBegin() above r
2cd90 65 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61  esulted in a sca
2cda0 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
2cdb0 20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65   ** uses an inde
2cdc0 78 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65  x, and this is e
2cdd0 69 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20  ither the first 
2cde0 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
2cdf0 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  m.          ** p
2ce00 72 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20  rocessed or the 
2ce10 69 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d  index is the sam
2ce20 65 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62  e as that used b
2ce30 79 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20  y all previous. 
2ce40 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
2ce50 73 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74  s, set pCov to t
2ce60 68 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76  he candidate cov
2ce70 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68  ering index. Oth
2ce80 65 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20  erwise, set .   
2ce90 20 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74         ** pCov t
2cea0 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61  o NULL to indica
2ceb0 74 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69  te that no candi
2cec0 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  date covering in
2ced0 64 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20  dex will .      
2cee0 20 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61      ** be availa
2cef0 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ble..          *
2cf00 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c  /.          pLvl
2cf10 20 3d 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61   = &pSubWInfo->a
2cf20 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [0];.          i
2cf30 66 28 20 28 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 77  f( (pLvl->plan.w
2cf40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2cf50 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
2cf60 20 20 20 20 20 20 26 26 20 28 70 4c 76 6c 2d 3e        && (pLvl->
2cf70 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2cf80 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
2cf90 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
2cfa0 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 4c 76 6c  & (ii==0 || pLvl
2cfb0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70  ->plan.u.pIdx==p
2cfc0 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 29  Cov).          )
2cfd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
2cfe0 73 65 72 74 28 20 70 4c 76 6c 2d 3e 69 49 64 78  sert( pLvl->iIdx
2cff0 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a  Cur==iCovCur );.
2d000 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76              pCov
2d010 20 3d 20 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 75 2e   = pLvl->plan.u.
2d020 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
2d030 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d040 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20     pCov = 0;.   
2d050 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2d060 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68      /* Finish th
2d070 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  e loop through t
2d080 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
2d090 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
2d0a0 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
2d0b0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2d0c0 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20  nd(pSubWInfo);. 
2d0d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d0e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
2d0f0 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70  l->u.pCovidx = p
2d100 43 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  Cov;.    if( pCo
2d110 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  v ) pLevel->iIdx
2d120 43 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20  Cur = iCovCur;. 
2d130 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
2d140 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70  ){.      pAndExp
2d150 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
2d160 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
2d170 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
2d180 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20  , pAndExpr);.   
2d190 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2d1a0 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52  beChangeP1(v, iR
2d1b0 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56  etInit, sqlite3V
2d1c0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2d1d0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
2d1e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d1f0 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
2d200 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73  >addrBrk);.    s
2d210 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2d220 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42  eLabel(v, iLoopB
2d230 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ody);..    if( p
2d240 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
2d250 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72  ) sqlite3StackFr
2d260 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
2d270 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20  OrTab);.    if( 
2d280 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  !untestedTerms )
2d290 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
2d2a0 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d  vel, pTerm);.  }
2d2b0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
2d2c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
2d2d0 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20  TIMIZATION */.. 
2d2e0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35   {.    /* Case 5
2d2f0 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
2d300 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
2d310 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
2d320 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ete.    **      
2d330 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20      scan of the 
2d340 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20  entire table..  
2d350 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
2d360 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d  const u8 aStep[]
2d370 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50   = { OP_Next, OP
2d380 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61  _Prev };.    sta
2d390 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
2d3a0 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77  art[] = { OP_Rew
2d3b0 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a  ind, OP_Last };.
2d3c0 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76      assert( bRev
2d3d0 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29  ==0 || bRev==1 )
2d3e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ;.    assert( om
2d3f0 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
2d400 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61    pLevel->op = a
2d410 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20  Step[bRev];.    
2d420 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
2d430 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
2d440 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  2 = 1 + sqlite3V
2d450 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74  dbeAddOp2(v, aSt
2d460 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c  art[bRev], iCur,
2d470 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70   addrBrk);.    p
2d480 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
2d490 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
2d4a0 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d  LLSCAN_STEP;.  }
2d4b0 0a 20 20 6e 65 77 4e 6f 74 52 65 61 64 79 20 3d  .  newNotReady =
2d4c0 20 6e 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74   notReady & ~get
2d4d0 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
2d4e0 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a  et, iCur);..  /*
2d4f0 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
2d500 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78  test every subex
2d510 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
2d520 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  n be completely.
2d530 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
2d540 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
2d550 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
2d560 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
2d570 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39  NTATION-OF: R-49
2d580 35 32 35 2d 35 30 39 33 35 20 54 65 72 6d 73 20  525-50935 Terms 
2d590 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  that cannot be s
2d5a0 61 74 69 73 66 69 65 64 20 74 68 72 6f 75 67 68  atisfied through
2d5b0 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66  .  ** the use of
2d5c0 20 69 6e 64 69 63 65 73 20 62 65 63 6f 6d 65 20   indices become 
2d5d0 74 65 73 74 73 20 74 68 61 74 20 61 72 65 20 65  tests that are e
2d5e0 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74  valuated against
2d5f0 20 65 61 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a   each row of.  *
2d600 2a 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 69  * the relevant i
2d610 6e 70 75 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a  nput tables..  *
2d620 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  /.  for(pTerm=pW
2d630 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65  C->a, j=pWC->nTe
2d640 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
2d650 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
2d660 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61   *pE;.    testca
2d670 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
2d680 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
2d690 4c 20 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  L ); /* IMP: R-3
2d6a0 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
2d6b0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
2d6c0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
2d6d0 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69  M_CODED );.    i
2d6e0 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
2d6f0 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
2d700 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
2d710 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2d720 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
2d730 41 6c 6c 20 26 20 6e 65 77 4e 6f 74 52 65 61 64  All & newNotRead
2d740 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  y)!=0 ){.      t
2d750 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d  estcase( pWInfo-
2d760 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d  >untestedTerms==
2d770 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2d780 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
2d790 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2d7a0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d  ONETABLE_ONLY)!=
2d7b0 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 );.      pWInf
2d7c0 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
2d7d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 1;.      cont
2d7e0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
2d7f0 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
2d800 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
2d810 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  E!=0 );.    if( 
2d820 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
2d830 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  n && !ExprHasPro
2d840 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
2d850 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
2d860 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2d870 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
2d880 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
2d890 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  E, addrCont, SQL
2d8a0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2d8b0 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
2d8c0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
2d8d0 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73  D;.  }..  /* Ins
2d8e0 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
2d8f0 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e   for implied con
2d900 73 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f  straints based o
2d910 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20  n transitivity. 
2d920 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20   ** of the "==" 
2d930 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
2d940 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20   ** Example: If 
2d950 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2d960 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d   contains "t1.a=
2d970 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d  t2.b" and "t2.b=
2d980 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65  123".  ** and we
2d990 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20   are coding the 
2d9a0 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20  t1 loop and the 
2d9b0 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20  t2 loop has not 
2d9c0 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20  yet coded,.  ** 
2d9d0 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75  then we cannot u
2d9e0 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e  se the "t1.a=t2.
2d9f0 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62  b" constraint, b
2da00 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20  ut we can code. 
2da10 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20   ** the implied 
2da20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74  "t1.a=123" const
2da30 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
2da40 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
2da50 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
2da60 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
2da70 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a  {.    Expr *pE;.
2da80 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2da90 41 6c 74 3b 0a 20 20 20 20 45 78 70 72 20 73 45  Alt;.    Expr sE
2daa0 71 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  q;.    if( pTerm
2dab0 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
2dac0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
2dad0 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
2dae0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
2daf0 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f  >eOperator!=(WO_
2db00 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63  EQUIV|WO_EQ) ) c
2db10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2db20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
2db30 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  or!=iCur ) conti
2db40 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54  nue;.    pE = pT
2db50 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
2db60 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2db70 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
2db80 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20  FromJoin) );.   
2db90 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
2dba0 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
2dbb0 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ewNotReady)!=0 )
2dbc0 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e  ;.    pAlt = fin
2dbd0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
2dbe0 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
2dbf0 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20  lumn, notReady, 
2dc00 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
2dc10 0a 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30  .    if( pAlt==0
2dc20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2dc30 20 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61   if( pAlt->wtFla
2dc40 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44  gs & (TERM_CODED
2dc50 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2dc60 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
2dc70 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61  t((v, "begin tra
2dc80 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
2dc90 6e 74 22 29 29 3b 0a 20 20 20 20 73 45 71 20 3d  nt"));.    sEq =
2dca0 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20   *pAlt->pExpr;. 
2dcb0 20 20 20 73 45 71 2e 70 4c 65 66 74 20 3d 20 70     sEq.pLeft = p
2dcc0 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73 71  E->pLeft;.    sq
2dcd0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
2dce0 28 70 50 61 72 73 65 2c 20 26 73 45 71 2c 20 61  (pParse, &sEq, a
2dcf0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
2dd00 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d  JUMPIFNULL);.  }
2dd10 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
2dd20 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
2dd30 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
2dd40 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
2dd50 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
2dd60 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
2dd70 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2dd80 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
2dd90 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
2dda0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
2ddb0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
2ddc0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
2ddd0 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
2dde0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2ddf0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
2de00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2de10 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
2de20 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
2de30 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
2de40 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
2de50 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
2de60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2de70 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2de80 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
2de90 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
2dea0 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
2deb0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
2dec0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
2ded0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2dee0 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49  VIRTUAL );  /* I
2def0 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  MP: R-30575-1166
2df00 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  2 */.      testc
2df10 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
2df20 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
2df30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
2df40 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
2df50 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
2df60 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
2df70 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
2df80 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
2df90 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21   & newNotReady)!
2dfa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
2dfb0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  sert( pWInfo->un
2dfc0 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20  testedTerms );. 
2dfd0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2dfe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2dff0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
2e000 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr );.      sql
2e010 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
2e020 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
2e030 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Expr, addrCont, 
2e040 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
2e050 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  L);.      pTerm-
2e060 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
2e070 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
2e080 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
2e090 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
2e0a0 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
2e0b0 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74  .  return newNot
2e0c0 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65  Ready;.}..#if de
2e0d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
2e0e0 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  T)./*.** The fol
2e0f0 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
2e100 68 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65 73  holds a text des
2e110 63 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72  cription of quer
2e120 79 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64  y plan generated
2e130 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20  .** by the most 
2e140 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73  recent call to s
2e150 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2e160 28 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74  ().  Each call t
2e170 6f 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20  o WhereBegin.** 
2e180 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70  overwrites the p
2e190 72 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69  revious.  This i
2e1a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
2e1b0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
2e1c0 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f  nd.** analysis o
2e1d0 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  nly..*/.char sql
2e1e0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2e1f0 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54  BMS*2*40];  /* T
2e200 65 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ext of the join 
2e210 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51  */.static int nQ
2e220 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  Plan = 0;       
2e230 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
2e240 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65  ree slow in _que
2e250 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65  ry_plan[] */..#e
2e260 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
2e270 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46  EST */.../*.** F
2e280 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20  ree a WhereInfo 
2e290 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61  structure.*/.sta
2e2a0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e  tic void whereIn
2e2b0 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a  foFree(sqlite3 *
2e2c0 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  db, WhereInfo *p
2e2d0 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c  WInfo){.  if( AL
2e2e0 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a  WAYS(pWInfo) ){.
2e2f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
2e300 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f  or(i=0; i<pWInfo
2e310 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
2e320 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
2e330 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20  dex_info *pInfo 
2e340 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  = pWInfo->a[i].p
2e350 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  IdxInfo;.      i
2e360 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
2e370 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
2e380 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2e390 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64 62 2d  IdxStr==0 || db-
2e3a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
2e3b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2e3c0 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  pInfo->needToFre
2e3d0 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  eIdxStr ){.     
2e3e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2e3f0 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  e(pInfo->idxStr)
2e400 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e410 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2e420 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  e(db, pInfo);.  
2e430 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2e440 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61  pWInfo->a[i].pla
2e450 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2e460 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 7b 0a  E_TEMP_INDEX ){.
2e470 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
2e480 49 64 78 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  Idx = pWInfo->a[
2e490 69 5d 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  i].plan.u.pIdx;.
2e4a0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
2e4b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2e4c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2e4d0 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  pIdx->zColAff);.
2e4e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e4f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
2e500 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e510 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77     }.    }.    w
2e520 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
2e530 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20  pWInfo->pWC);.  
2e540 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2e550 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
2e560 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
2e570 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
2e580 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
2e590 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
2e5a0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
2e5b0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
2e5c0 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
2e5d0 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
2e5e0 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
2e5f0 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
2e600 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
2e610 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
2e620 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
2e630 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
2e640 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
2e650 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2e660 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
2e670 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
2e680 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
2e690 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
2e6a0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2e6b0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
2e6c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2e6d0 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
2e6e0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
2e6f0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
2e700 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
2e710 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
2e720 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
2e730 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
2e740 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2e750 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
2e760 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
2e770 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
2e780 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
2e790 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
2e7a0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
2e7b0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2e7c0 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
2e7d0 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
2e7e0 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
2e7f0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
2e800 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
2e810 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
2e820 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
2e830 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
2e840 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
2e850 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
2e860 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
2e870 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
2e880 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
2e890 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
2e8a0 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
2e8b0 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
2e8c0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
2e8d0 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
2e8e0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
2e8f0 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
2e900 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
2e910 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
2e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e930 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
2e940 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
2e950 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
2e960 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
2e970 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
2e980 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
2e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9a0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
2e9b0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
2e9c0 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
2e9d0 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
2e9e0 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
2e9f0 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
2ea00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2ea10 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
2ea20 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
2ea30 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
2ea40 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
2ea50 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
2ea60 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
2ea70 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
2ea80 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
2ea90 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
2eaa0 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
2eab0 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
2eac0 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
2ead0 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
2eae0 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
2eaf0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
2eb00 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
2eb10 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
2eb20 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2eb30 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
2eb40 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
2eb50 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
2eb60 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
2eb70 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
2eb80 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
2eb90 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
2eba0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
2ebb0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2ebc0 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
2ebd0 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
2ebe0 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
2ebf0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
2ec00 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
2ec10 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
2ec20 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
2ec30 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
2ec40 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
2ec50 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
2ec60 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
2ec70 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
2ec80 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
2ec90 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
2eca0 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
2ecb0 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
2ecc0 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
2ecd0 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
2ece0 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
2ecf0 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
2ed00 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
2ed10 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
2ed20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
2ed30 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
2ed40 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
2ed50 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
2ed60 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
2ed70 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
2ed80 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
2ed90 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
2eda0 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
2edb0 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
2edc0 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
2edd0 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
2ede0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
2edf0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
2ee00 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
2ee10 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
2ee20 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
2ee30 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
2ee40 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
2ee50 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
2ee60 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
2ee70 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
2ee80 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
2ee90 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
2eea0 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
2eeb0 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
2eec0 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
2eed0 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
2eee0 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
2eef0 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
2ef00 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
2ef10 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
2ef20 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
2ef30 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
2ef40 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
2ef50 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
2ef60 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
2ef70 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
2ef80 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
2ef90 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
2efa0 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
2efb0 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
2efc0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
2efd0 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
2efe0 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
2eff0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
2f000 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
2f010 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
2f020 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
2f030 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
2f040 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
2f050 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
2f060 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
2f070 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
2f080 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
2f090 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
2f0a0 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
2f0b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
2f0c0 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
2f0d0 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
2f0e0 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
2f0f0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
2f100 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
2f110 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
2f120 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
2f130 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
2f140 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
2f150 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
2f160 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
2f170 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
2f180 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
2f190 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
2f1a0 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
2f1b0 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
2f1c0 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
2f1d0 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  G.**.** pOrderBy
2f1e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2f1f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2f200 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
2f210 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69   statement,.** i
2f220 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
2f230 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
2f240 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2f250 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
2f260 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
2f270 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
2f280 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
2f290 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42  nt, then pOrderB
2f2a0 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  y is NULL..**.**
2f2b0 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e   If an index can
2f2c0 20 62 65 20 75 73 65 64 20 73 6f 20 74 68 61 74   be used so that
2f2d0 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74   the natural out
2f2e0 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65  put order of the
2f2f0 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69   table.** scan i
2f300 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68  s correct for th
2f310 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2f320 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64  e, then that ind
2f330 65 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a  ex is used and.*
2f340 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 57  * the returned W
2f350 68 65 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74 20  hereInfo.nOBSat 
2f360 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20  field is set to 
2f370 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2e  pOrderBy->nExpr.
2f380 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 61 6e 20    This.** is an 
2f390 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61  optimization tha
2f3a0 74 20 70 72 65 76 65 6e 74 73 20 61 6e 20 75 6e  t prevents an un
2f3b0 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f  necessary sort o
2f3c0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
2f3d0 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 64 65 78 20  .** if an index 
2f3e0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
2f3f0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2f400 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  use already exis
2f410 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
2f420 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f   where clause lo
2f430 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72  ops cannot be ar
2f440 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64  ranged to provid
2f450 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
2f460 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74   output order, t
2f470 68 65 6e 20 57 68 65 72 65 49 6e 66 6f 2e 6e 4f  hen WhereInfo.nO
2f480 42 53 61 74 20 69 73 20 30 2e 0a 2a 2f 0a 57 68  BSat is 0..*/.Wh
2f490 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
2f4a0 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
2f4b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2f4c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2f4d0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
2f4e0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2f4f0 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ,    /* A list o
2f500 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
2f510 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
2f520 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
2f530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
2f540 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
2f550 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
2f560 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  y,   /* An ORDER
2f570 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
2f580 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
2f590 74 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 2f  t *pDistinct,  /
2f5a0 2a 20 54 68 65 20 73 65 6c 65 63 74 2d 6c 69 73  * The select-lis
2f5b0 74 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 71  t for DISTINCT q
2f5c0 75 65 72 69 65 73 20 2d 20 6f 72 20 4e 55 4c 4c  ueries - or NULL
2f5d0 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
2f5e0 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f  lags,       /* O
2f5f0 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ne of the WHERE_
2f600 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20  * flags defined 
2f610 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a  in sqliteInt.h *
2f620 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 20  /.  int iIdxCur 
2f630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2f640 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
2f650 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65  NLY is set, inde
2f660 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  x cursor number 
2f670 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  */.){.  int nByt
2f680 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eWInfo;         
2f690 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73     /* Num. bytes
2f6a0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57   allocated for W
2f6b0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20  hereInfo struct 
2f6c0 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  */.  int nTabLis
2f6d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2f6e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
2f6f0 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73  ments in pTabLis
2f700 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  t */.  WhereInfo
2f710 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
2f720 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65    /* Will become
2f730 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
2f740 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
2f750 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  on */.  Vdbe *v 
2f760 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2f770 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2f780 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
2f790 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
2f7a0 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
2f7b0 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61    /* Cursors tha
2f7c0 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f  t are not yet po
2f7d0 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68  sitioned */.  Wh
2f7e0 65 72 65 42 65 73 74 49 64 78 20 73 57 42 49 3b  ereBestIdx sWBI;
2f7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
2f800 20 69 6e 64 65 78 20 73 65 61 72 63 68 20 63 6f   index search co
2f810 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
2f820 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2f830 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
2f840 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
2f850 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
2f860 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
2f870 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
2f880 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b  el in pWInfo->a[
2f890 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  ] */.  int iFrom
2f8a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f8b0 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
2f8c0 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  d FROM clause el
2f8d0 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
2f8e0 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ndFlags;        
2f8f0 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20        /* AND-ed 
2f900 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61  combination of a
2f910 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e 77 74 46 6c  ll pWC->a[].wtFl
2f920 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ags */.  int ii;
2f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f940 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2f950 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
2f960 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2f970 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2f980 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 0a  connection */...
2f990 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e    /* Variable in
2f9a0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
2f9b0 20 20 6d 65 6d 73 65 74 28 26 73 57 42 49 2c 20    memset(&sWBI, 
2f9c0 30 2c 20 73 69 7a 65 6f 66 28 73 57 42 49 29 29  0, sizeof(sWBI))
2f9d0 3b 0a 20 20 73 57 42 49 2e 70 50 61 72 73 65 20  ;.  sWBI.pParse 
2f9e0 3d 20 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a 20  = pParse;..  /* 
2f9f0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
2fa00 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
2fa10 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
2fa20 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
2fa30 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
2fa40 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
2fa50 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
2fa60 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53  bList->nSrc==BMS
2fa70 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69   );.  if( pTabLi
2fa80 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a  st->nSrc>BMS ){.
2fa90 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2faa0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20  Msg(pParse, "at 
2fab0 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69  most %d tables i
2fac0 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b  n a join", BMS);
2fad0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2fae0 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75   }..  /* This fu
2faf0 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20  nction normally 
2fb00 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74  generates a nest
2fb10 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20  ed loop for all 
2fb20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20  tables in .  ** 
2fb30 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69  pTabList.  But i
2fb40 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54  f the WHERE_ONET
2fb50 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  ABLE_ONLY flag i
2fb60 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73  s set, then we s
2fb70 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20  hould.  ** only 
2fb80 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  generate code fo
2fb90 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c  r the first tabl
2fba0 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e  e in pTabList an
2fbb0 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20  d assume that.  
2fbc0 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  ** any cursors a
2fbd0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
2fbe0 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73  ubsequent tables
2fbf0 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   are uninitializ
2fc00 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c  ed..  */.  nTabL
2fc10 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67  ist = (wctrlFlag
2fc20 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
2fc30 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70  LE_ONLY) ? 1 : p
2fc40 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a  TabList->nSrc;..
2fc50 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
2fc60 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
2fc70 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
2fc80 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
2fc90 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
2fca0 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73  eturn value. A s
2fcb0 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  ingle allocation
2fcc0 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
2fcd0 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a  e the WhereInfo.
2fce0 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65    ** struct, the
2fcf0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65   contents of Whe
2fd00 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20  reInfo.a[], the 
2fd10 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2fd20 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74  cture.  ** and t
2fd30 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  he WhereMaskSet 
2fd40 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65  structure. Since
2fd50 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e   WhereClause con
2fd60 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a  tains an 8-byte.
2fd70 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65    ** field (type
2fd80 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73   Bitmask) it mus
2fd90 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20  t be aligned on 
2fda0 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61  an 8-byte bounda
2fdb0 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20  ry on.  ** some 
2fdc0 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48  architectures. H
2fdd0 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28  ence the ROUND8(
2fde0 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  ) below..  */.  
2fdf0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2fe00 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20  .  nByteWInfo = 
2fe10 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68  ROUND8(sizeof(Wh
2fe20 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69  ereInfo)+(nTabLi
2fe30 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65  st-1)*sizeof(Whe
2fe40 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49  reLevel));.  pWI
2fe50 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
2fe60 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20  allocZero(db, . 
2fe70 20 20 20 20 20 6e 42 79 74 65 57 49 6e 66 6f 20       nByteWInfo 
2fe80 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  + .      sizeof(
2fe90 57 68 65 72 65 43 6c 61 75 73 65 29 20 2b 0a 20  WhereClause) +. 
2fea0 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72       sizeof(Wher
2feb0 65 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a 20  eMaskSet).  );. 
2fec0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2fed0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
2fee0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2fef0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e  WInfo);.    pWIn
2ff00 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  fo = 0;.    goto
2ff10 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2ff20 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
2ff30 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73  nLevel = nTabLis
2ff40 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  t;.  pWInfo->pPa
2ff50 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2ff60 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2ff70 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
2ff80 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20  WInfo->iBreak = 
2ff90 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2ffa0 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66  abel(v);.  pWInf
2ffb0 6f 2d 3e 70 57 43 20 3d 20 73 57 42 49 2e 70 57  o->pWC = sWBI.pW
2ffc0 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73 65  C = (WhereClause
2ffd0 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49 6e 66   *)&((u8 *)pWInf
2ffe0 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d 3b 0a  o)[nByteWInfo];.
2fff0 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
30000 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
30010 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  s;.  pWInfo->sav
30020 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
30030 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
30040 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  p;.  pMaskSet = 
30050 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 29 26  (WhereMaskSet*)&
30060 73 57 42 49 2e 70 57 43 5b 31 5d 3b 0a 20 20 73  sWBI.pWC[1];.  s
30070 57 42 49 2e 61 4c 65 76 65 6c 20 3d 20 70 57 49  WBI.aLevel = pWI
30080 6e 66 6f 2d 3e 61 3b 0a 0a 20 20 2f 2a 20 44 69  nfo->a;..  /* Di
30090 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e  sable the DISTIN
300a0 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  CT optimization 
300b0 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  if SQLITE_Distin
300c0 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61  ctOpt is set via
300d0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  .  ** sqlite3_te
300e0 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54  st_ctrl(SQLITE_T
300f0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
30100 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20  TIONS,...) */.  
30110 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
30120 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
30130 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29  ITE_DistinctOpt)
30140 20 29 20 70 44 69 73 74 69 6e 63 74 20 3d 20 30   ) pDistinct = 0
30150 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  ;..  /* Split th
30160 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
30170 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
30180 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
30190 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
301a0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
301b0 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
301c0 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
301d0 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
301e0 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65  askSet);.  where
301f0 43 6c 61 75 73 65 49 6e 69 74 28 73 57 42 49 2e  ClauseInit(sWBI.
30200 70 57 43 2c 20 70 50 61 72 73 65 2c 20 70 4d 61  pWC, pParse, pMa
30210 73 6b 53 65 74 2c 20 77 63 74 72 6c 46 6c 61 67  skSet, wctrlFlag
30220 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  s);.  sqlite3Exp
30230 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70  rCodeConstants(p
30240 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a  Parse, pWhere);.
30250 20 20 77 68 65 72 65 53 70 6c 69 74 28 73 57 42    whereSplit(sWB
30260 49 2e 70 57 43 2c 20 70 57 68 65 72 65 2c 20 54  I.pWC, pWhere, T
30270 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20 49 4d 50  K_AND);   /* IMP
30280 3a 20 52 2d 31 35 38 34 32 2d 35 33 32 39 36 20  : R-15842-53296 
30290 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  */.    .  /* Spe
302a0 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
302b0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
302c0 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
302d0 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
302e0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
302f0 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
30300 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
30310 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
30320 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26  /.  if( pWhere &
30330 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c  & (nTabList==0 |
30340 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  | sqlite3ExprIsC
30350 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
30360 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73  Where)) ){.    s
30370 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
30380 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  e(pParse, pWhere
30390 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
303a0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
303b0 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65  ULL);.    pWhere
303c0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
303d0 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f  Assign a bit fro
303e0 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f  m the bitmask to
303f0 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
30400 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
30410 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61    **.  ** When a
30420 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b  ssigning bitmask
30430 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20   values to FROM 
30440 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20  clause cursors, 
30450 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  it must be.  ** 
30460 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66  the case that if
30470 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
30480 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46  k for the N-th F
30490 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
304a0 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69  then.  ** the bi
304b0 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52  tmask for all FR
304c0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
304d0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
304e0 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a  he N-th term.  *
304f0 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e  * is (X-1).   An
30500 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
30510 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
30520 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  f a LEFT JOIN ca
30530 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45  n use.  ** its E
30540 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
30550 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e  ble value to fin
30560 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66  d the bitmask of
30570 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
30580 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  .  ** of the joi
30590 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20  n.  Subtracting 
305a0 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67  one from the rig
305b0 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b  ht table bitmask
305c0 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69   gives a.  ** bi
305d0 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61  tmask for all ta
305e0 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
305f0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b   of the join.  K
30600 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61  nowing the bitma
30610 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  sk.  ** for all 
30620 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
30630 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  ft of a left joi
30640 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  n is important. 
30650 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20   Ticket #3015.. 
30660 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
30670 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20  at bitmasks are 
30680 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
30690 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74  pTabList->nSrc t
306a0 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54  ables in.  ** pT
306b0 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74  abList, not just
306c0 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c   the first nTabL
306d0 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61  ist tables.  nTa
306e0 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c  bList is normall
306f0 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  y.  ** equal to 
30700 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62  pTabList->nSrc b
30710 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  ut might be shor
30720 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68  tened to 1 if th
30730 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45  e.  ** WHERE_ONE
30740 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
30750 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66  is set..  */.  f
30760 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
30770 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
30780 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
30790 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
307a0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
307b0 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
307c0 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  f NDEBUG.  {.   
307d0 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65   Bitmask toTheLe
307e0 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ft = 0;.    for(
307f0 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
30800 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
30810 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
30820 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
30830 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
30840 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
30850 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31      assert( (m-1
30860 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a  )==toTheLeft );.
30870 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20        toTheLeft 
30880 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  |= m;.    }.  }.
30890 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61  #endif..  /* Ana
308a0 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
308b0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
308c0 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41   Note that exprA
308d0 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20  nalyze() might. 
308e0 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74   ** add new virt
308f0 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74  ual terms onto t
30900 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
30910 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20  ERE clause.  We 
30920 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74  do not.  ** want
30930 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73   to analyze thes
30940 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c  e virtual terms,
30950 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a   so start analyz
30960 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20  ing at the end. 
30970 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72   ** and work for
30980 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65  ward so that the
30990 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74   added virtual t
309a0 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70  erms are never p
309b0 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  rocessed..  */. 
309c0 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
309d0 70 54 61 62 4c 69 73 74 2c 20 73 57 42 49 2e 70  pTabList, sWBI.p
309e0 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  WC);.  if( db->m
309f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
30a00 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
30a10 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  inError;.  }..  
30a20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
30a30 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
30a40 65 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  er, if there is 
30a50 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e 64 61 6e  one, is redundan
30a60 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69 74 20 69  t. .  ** If it i
30a70 73 2c 20 74 68 65 6e 20 73 65 74 20 70 44 69 73  s, then set pDis
30a80 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  tinct to NULL an
30a90 64 20 57 68 65 72 65 49 6e 66 6f 2e 65 44 69 73  d WhereInfo.eDis
30aa0 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a 20 57 48  tinct to.  ** WH
30ab0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
30ac0 51 55 45 20 74 6f 20 74 65 6c 6c 20 74 68 65 20  QUE to tell the 
30ad0 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e 6f 72 65  caller to ignore
30ae0 20 74 68 65 20 44 49 53 54 49 4e 43 54 2e 0a 20   the DISTINCT.. 
30af0 20 2a 2f 0a 20 20 69 66 28 20 70 44 69 73 74 69   */.  if( pDisti
30b00 6e 63 74 20 26 26 20 69 73 44 69 73 74 69 6e 63  nct && isDistinc
30b10 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
30b20 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 73 57 42  e, pTabList, sWB
30b30 49 2e 70 57 43 2c 20 70 44 69 73 74 69 6e 63 74  I.pWC, pDistinct
30b40 29 20 29 7b 0a 20 20 20 20 70 44 69 73 74 69 6e  ) ){.    pDistin
30b50 63 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 49 6e  ct = 0;.    pWIn
30b60 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
30b70 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
30b80 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NIQUE;.  }..  /*
30b90 20 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20   Chose the best 
30ba0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
30bb0 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
30bc0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
30bd0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
30be0 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65  oop fills in the
30bf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
30c00 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70  s:.  **.  **   p
30c10 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20  WInfo->a[].pIdx 
30c20 20 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74       The index t
30c30 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c  o use for this l
30c40 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70  evel of the loop
30c50 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  ..  **   pWInfo-
30c60 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57  >a[].wsFlags   W
30c70 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61  HERE_xxx flags a
30c80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
30c90 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  Idx.  **   pWInf
30ca0 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20  o->a[].nEq      
30cb0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
30cc0 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
30cd0 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ints.  **   pWIn
30ce0 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20  fo->a[].iFrom   
30cf0 20 20 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20    Which term of 
30d00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
30d10 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20  is being coded. 
30d20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
30d30 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20  ].iTabCur   The 
30d40 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
30d50 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
30d60 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  le.  **   pWInfo
30d70 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20  ->a[].iIdxCur   
30d80 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
30d90 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20  for the index.  
30da0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
30db0 2e 70 54 65 72 6d 20 20 20 20 20 57 68 65 6e 20  .pTerm     When 
30dc0 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20  wsFlags==WO_OR, 
30dd0 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 74 65  the OR-clause te
30de0 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  rm.  **.  ** Thi
30df0 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75  s loop also figu
30e00 72 65 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74  res out the nest
30e10 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62  ing order of tab
30e20 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
30e30 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a    ** clause..  *
30e40 2f 0a 20 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69  /.  sWBI.notVali
30e50 64 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  d = ~(Bitmask)0;
30e60 0a 20 20 73 57 42 49 2e 70 4f 72 64 65 72 42 79  .  sWBI.pOrderBy
30e70 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 73   = pOrderBy;.  s
30e80 57 42 49 2e 6e 20 3d 20 6e 54 61 62 4c 69 73 74  WBI.n = nTabList
30e90 3b 0a 20 20 73 57 42 49 2e 70 44 69 73 74 69 6e  ;.  sWBI.pDistin
30ea0 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 3b 0a  ct = pDistinct;.
30eb0 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b    andFlags = ~0;
30ec0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
30ed0 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
30ee0 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
30ef0 66 6f 72 28 73 57 42 49 2e 69 3d 69 46 72 6f 6d  for(sWBI.i=iFrom
30f00 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
30f10 6f 2d 3e 61 3b 20 73 57 42 49 2e 69 3c 6e 54 61  o->a; sWBI.i<nTa
30f20 62 4c 69 73 74 3b 20 73 57 42 49 2e 69 2b 2b 2c  bList; sWBI.i++,
30f30 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
30f40 57 68 65 72 65 43 6f 73 74 20 62 65 73 74 50 6c  WhereCost bestPl
30f50 61 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  an;         /* M
30f60 6f 73 74 20 65 66 66 69 63 69 65 6e 74 20 70 6c  ost efficient pl
30f70 61 6e 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a  an seen so far *
30f80 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
30f90 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
30fa0 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46    /* Index for F
30fb0 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61  ROM table at pTa
30fc0 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  bItem */.    int
30fd0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
30fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
30ff0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f  looping over FRO
31000 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  M tables */.    
31010 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d 31 3b 20  int bestJ = -1; 
31020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
31030 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f  he value of j */
31040 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20  .    Bitmask m; 
31050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31060 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75   /* Bitmask valu
31070 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a  e for j or bestJ
31080 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4f 70   */.    int isOp
31090 74 69 6d 61 6c 3b 20 20 20 20 20 20 20 20 20 20  timal;          
310a0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
310b0 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d  for optimal/non-
310c0 6f 70 74 69 6d 61 6c 20 73 65 61 72 63 68 20 2a  optimal search *
310d0 2f 0a 20 20 20 20 69 6e 74 20 63 6b 4f 70 74 69  /.    int ckOpti
310e0 6d 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  mal;            
310f0 20 20 2f 2a 20 44 6f 20 74 68 65 20 6f 70 74 69    /* Do the opti
31100 6d 61 6c 20 73 63 61 6e 20 63 68 65 63 6b 20 2a  mal scan check *
31110 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e 63 6f 6e  /.    int nUncon
31120 73 74 72 61 69 6e 65 64 3b 20 20 20 20 20 20 20  strained;       
31130 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 61 62 6c    /* Number tabl
31140 65 73 20 77 69 74 68 6f 75 74 20 49 4e 44 45 58  es without INDEX
31150 45 44 20 42 59 20 2a 2f 0a 20 20 20 20 42 69 74  ED BY */.    Bit
31160 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78 65 64 3b  mask notIndexed;
31170 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
31180 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
31190 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e  cannot use an in
311a0 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73  dex */..    mems
311b0 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20 30 2c  et(&bestPlan, 0,
311c0 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c 61 6e   sizeof(bestPlan
311d0 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c 61 6e  ));.    bestPlan
311e0 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  .rCost = SQLITE_
311f0 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 57 48 45  BIG_DBL;.    WHE
31200 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 42 65  RETRACE(("*** Be
31210 67 69 6e 20 73 65 61 72 63 68 20 66 6f 72 20 6c  gin search for l
31220 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22 2c 20 73  oop %d ***\n", s
31230 57 42 49 2e 69 29 29 3b 0a 0a 20 20 20 20 2f 2a  WBI.i));..    /*
31240 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
31250 65 20 72 65 6d 61 69 6e 69 6e 67 20 65 6e 74 72  e remaining entr
31260 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
31270 63 6c 61 75 73 65 20 74 6f 20 66 69 6e 64 20 74  clause to find t
31280 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 6e  he.    ** next n
31290 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54 68 65 20  ested loop. The 
312a0 6c 6f 6f 70 20 74 65 73 74 73 20 61 6c 6c 20 46  loop tests all F
312b0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69  ROM clause entri
312c0 65 73 0a 20 20 20 20 2a 2a 20 65 69 74 68 65 72  es.    ** either
312d0 20 6f 6e 63 65 20 6f 72 20 74 77 69 63 65 2e 20   once or twice. 
312e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
312f0 68 65 20 66 69 72 73 74 20 74 65 73 74 20 69 73  he first test is
31300 20 61 6c 77 61 79 73 20 70 65 72 66 6f 72 6d 65   always performe
31310 64 20 69 66 20 74 68 65 72 65 20 61 72 65 20 74  d if there are t
31320 77 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69  wo or more entri
31330 65 73 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e  es.    ** remain
31340 69 6e 67 20 61 6e 64 20 6e 65 76 65 72 20 70 65  ing and never pe
31350 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65  rformed if there
31360 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f   is only one FRO
31370 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 0a 20  M clause entry. 
31380 20 20 20 2a 2a 20 74 6f 20 63 68 6f 6f 73 65 20     ** to choose 
31390 66 72 6f 6d 2e 20 20 54 68 65 20 66 69 72 73 74  from.  The first
313a0 20 74 65 73 74 20 6c 6f 6f 6b 73 20 66 6f 72 20   test looks for 
313b0 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 73 63 61  an "optimal" sca
313c0 6e 2e 20 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68  n.  In.    ** th
313d0 69 73 20 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70  is context an op
313e0 74 69 6d 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e  timal scan is on
313f0 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  e that uses the 
31400 73 61 6d 65 20 73 74 72 61 74 65 67 79 0a 20 20  same strategy.  
31410 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 67 69 76    ** for the giv
31420 65 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  en FROM clause e
31430 6e 74 72 79 20 61 73 20 77 6f 75 6c 64 20 62 65  ntry as would be
31440 20 73 65 6c 65 63 74 65 64 20 69 66 20 74 68 65   selected if the
31450 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 77 65   entry.    ** we
31460 72 65 20 75 73 65 64 20 61 73 20 74 68 65 20 69  re used as the i
31470 6e 6e 65 72 6d 6f 73 74 20 6e 65 73 74 65 64 20  nnermost nested 
31480 6c 6f 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20  loop.  In other 
31490 77 6f 72 64 73 2c 20 61 20 74 61 62 6c 65 0a 20  words, a table. 
314a0 20 20 20 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20     ** is chosen 
314b0 73 75 63 68 20 74 68 61 74 20 74 68 65 20 63 6f  such that the co
314c0 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68  st of running th
314d0 61 74 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  at table cannot 
314e0 62 65 20 72 65 64 75 63 65 64 0a 20 20 20 20 2a  be reduced.    *
314f0 2a 20 62 79 20 77 61 69 74 69 6e 67 20 66 6f 72  * by waiting for
31500 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f   other tables to
31510 20 72 75 6e 20 66 69 72 73 74 2e 20 20 54 68 69   run first.  Thi
31520 73 20 22 6f 70 74 69 6d 61 6c 22 20 74 65 73 74  s "optimal" test
31530 20 77 6f 72 6b 73 0a 20 20 20 20 2a 2a 20 62 79   works.    ** by
31540 20 66 69 72 73 74 20 61 73 73 75 6d 69 6e 67 20   first assuming 
31550 74 68 61 74 20 74 68 65 20 46 52 4f 4d 20 63 6c  that the FROM cl
31560 61 75 73 65 20 69 73 20 6f 6e 20 74 68 65 20 69  ause is on the i
31570 6e 6e 65 72 20 6c 6f 6f 70 20 61 6e 64 20 66 69  nner loop and fi
31580 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 73  nding.    ** its
31590 20 71 75 65 72 79 20 70 6c 61 6e 2c 20 74 68 65   query plan, the
315a0 6e 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65  n checking to se
315b0 65 20 69 66 20 74 68 61 74 20 71 75 65 72 79 20  e if that query 
315c0 70 6c 61 6e 20 75 73 65 73 20 61 6e 79 0a 20 20  plan uses any.  
315d0 20 20 2a 2a 20 6f 74 68 65 72 20 46 52 4f 4d 20    ** other FROM 
315e0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
315f0 74 20 61 72 65 20 73 57 42 49 2e 6e 6f 74 56 61  t are sWBI.notVa
31600 6c 69 64 2e 20 20 49 66 20 6e 6f 20 6e 6f 74 56  lid.  If no notV
31610 61 6c 69 64 20 74 65 72 6d 73 0a 20 20 20 20 2a  alid terms.    *
31620 2a 20 61 72 65 20 75 73 65 64 20 74 68 65 6e 20  * are used then 
31630 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 71 75  the "optimal" qu
31640 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b 73 2e 0a  ery plan works..
31650 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
31660 74 65 20 74 68 61 74 20 74 68 65 20 57 68 65 72  te that the Wher
31670 65 43 6f 73 74 2e 6e 52 6f 77 20 70 61 72 61 6d  eCost.nRow param
31680 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 74 69  eter for an opti
31690 6d 61 6c 20 73 63 61 6e 20 6d 69 67 68 74 0a 20  mal scan might. 
316a0 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 73 20     ** not be as 
316b0 73 6d 61 6c 6c 20 61 73 20 69 74 20 77 6f 75 6c  small as it woul
316c0 64 20 62 65 20 69 66 20 74 68 65 20 74 61 62 6c  d be if the tabl
316d0 65 20 72 65 61 6c 6c 79 20 77 65 72 65 20 74 68  e really were th
316e0 65 20 69 6e 6e 65 72 6d 6f 73 74 0a 20 20 20 20  e innermost.    
316f0 2a 2a 20 6a 6f 69 6e 2e 20 20 54 68 65 20 6e 52  ** join.  The nR
31700 6f 77 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  ow value can be 
31710 72 65 64 75 63 65 64 20 62 79 20 57 48 45 52 45  reduced by WHERE
31720 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
31730 6e 74 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  nts.    ** that 
31740 64 6f 20 6e 6f 74 20 75 73 65 20 69 6e 64 69 63  do not use indic
31750 65 73 2e 20 20 42 75 74 20 74 68 69 73 20 6e 52  es.  But this nR
31760 6f 77 20 72 65 64 75 63 74 69 6f 6e 20 6f 6e 6c  ow reduction onl
31770 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
31780 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 72 65  .    ** table re
31790 61 6c 6c 79 20 69 73 20 74 68 65 20 69 6e 6e 65  ally is the inne
317a0 72 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20 0a 20 20  rmost join.  .  
317b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
317c0 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69 74 65 72  second loop iter
317d0 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 70 65  ation is only pe
317e0 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f 20 6f 70  rformed if no op
317f0 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20 20 20 2a  timal scan.    *
31800 2a 20 73 74 72 61 74 65 67 69 65 73 20 77 65 72  * strategies wer
31810 65 20 66 6f 75 6e 64 20 62 79 20 74 68 65 20 66  e found by the f
31820 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20  irst iteration. 
31830 54 68 69 73 20 73 65 63 6f 6e 64 20 69 74 65 72  This second iter
31840 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20  ation.    ** is 
31850 75 73 65 64 20 74 6f 20 73 65 61 72 63 68 20 66  used to search f
31860 6f 72 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  or the lowest co
31870 73 74 20 73 63 61 6e 20 6f 76 65 72 61 6c 6c 2e  st scan overall.
31880 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
31890 69 74 68 6f 75 74 20 74 68 65 20 6f 70 74 69 6d  ithout the optim
318a0 61 6c 20 73 63 61 6e 20 73 74 65 70 20 28 74 68  al scan step (th
318b0 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
318c0 6e 29 20 61 20 73 75 62 6f 70 74 69 6d 61 6c 0a  n) a suboptimal.
318d0 20 20 20 20 2a 2a 20 70 6c 61 6e 20 6d 69 67 68      ** plan migh
318e0 74 20 62 65 20 63 68 6f 73 65 6e 20 66 6f 72 20  t be chosen for 
318f0 71 75 65 72 69 65 73 20 6c 69 6b 65 20 74 68 69  queries like thi
31900 73 3a 0a 20 20 20 20 2a 2a 20 20 20 0a 20 20 20  s:.    **   .   
31910 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
31920 4c 45 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20  LE t1(a, b); .  
31930 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
31940 42 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a 20 20  BLE t2(c, d);.  
31950 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20    **   SELECT * 
31960 46 52 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52  FROM t2, t1 WHER
31970 45 20 74 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e  E t2.rowid = t1.
31980 61 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  a;.    **.    **
31990 20 54 68 65 20 62 65 73 74 20 73 74 72 61 74 65   The best strate
319a0 67 79 20 69 73 20 74 6f 20 69 74 65 72 61 74 65  gy is to iterate
319b0 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74   through table t
319c0 31 20 66 69 72 73 74 2e 20 48 6f 77 65 76 65 72  1 first. However
319d0 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f   it.    ** is no
319e0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  t possible to de
319f0 74 65 72 6d 69 6e 65 20 74 68 69 73 20 77 69 74  termine this wit
31a00 68 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64  h a simple greed
31a10 79 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20  y algorithm..   
31a20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   ** Since the co
31a30 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73  st of a linear s
31a40 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c  can through tabl
31a50 65 20 74 32 20 69 73 20 74 68 65 20 73 61 6d 65  e t2 is the same
31a60 20 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20   .    ** as the 
31a70 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72  cost of a linear
31a80 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61   scan through ta
31a90 62 6c 65 20 74 31 2c 20 61 20 73 69 6d 70 6c 65  ble t1, a simple
31aa0 20 67 72 65 65 64 79 20 0a 20 20 20 20 2a 2a 20   greedy .    ** 
31ab0 61 6c 67 6f 72 69 74 68 6d 20 6d 61 79 20 63 68  algorithm may ch
31ac0 6f 6f 73 65 20 74 6f 20 75 73 65 20 74 32 20 66  oose to use t2 f
31ad0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  or the outer loo
31ae0 70 2c 20 77 68 69 63 68 20 69 73 20 61 20 6d 75  p, which is a mu
31af0 63 68 0a 20 20 20 20 2a 2a 20 63 6f 73 74 6c 69  ch.    ** costli
31b00 65 72 20 61 70 70 72 6f 61 63 68 2e 0a 20 20 20  er approach..   
31b10 20 2a 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e 73 74   */.    nUnconst
31b20 72 61 69 6e 65 64 20 3d 20 30 3b 0a 20 20 20 20  rained = 0;.    
31b30 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a  notIndexed = 0;.
31b40 0a 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69  .    /* The opti
31b50 6d 61 6c 20 73 63 61 6e 20 63 68 65 63 6b 20 6f  mal scan check o
31b60 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 20 74 68  nly occurs if th
31b70 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d  ere are two or m
31b80 6f 72 65 20 74 61 62 6c 65 73 0a 20 20 20 20 2a  ore tables.    *
31b90 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 62  * available to b
31ba0 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20  e reordered */. 
31bb0 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 6e 54     if( iFrom==nT
31bc0 61 62 4c 69 73 74 2d 31 20 29 7b 0a 20 20 20 20  abList-1 ){.    
31bd0 20 20 63 6b 4f 70 74 69 6d 61 6c 20 3d 20 30 3b    ckOptimal = 0;
31be0 20 20 2f 2a 20 43 6f 6d 6d 6f 6e 20 63 61 73 65    /* Common case
31bf0 20 6f 66 20 6a 75 73 74 20 6f 6e 65 20 74 61 62   of just one tab
31c00 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
31c10 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 7d 65 6c  lause */.    }el
31c20 73 65 7b 0a 20 20 20 20 20 20 63 6b 4f 70 74 69  se{.      ckOpti
31c30 6d 61 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mal = -1;.      
31c40 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 73 57 42  for(j=iFrom, sWB
31c50 49 2e 70 53 72 63 3d 26 70 54 61 62 4c 69 73 74  I.pSrc=&pTabList
31c60 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69  ->a[j]; j<nTabLi
31c70 73 74 3b 20 6a 2b 2b 2c 20 73 57 42 49 2e 70 53  st; j++, sWBI.pS
31c80 72 63 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d  rc++){.        m
31c90 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
31ca0 53 65 74 2c 20 73 57 42 49 2e 70 53 72 63 2d 3e  Set, sWBI.pSrc->
31cb0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
31cc0 20 20 69 66 28 20 28 6d 20 26 20 73 57 42 49 2e    if( (m & sWBI.
31cd0 6e 6f 74 56 61 6c 69 64 29 3d 3d 30 20 29 7b 0a  notValid)==0 ){.
31ce0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
31cf0 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b  =iFrom ) iFrom++
31d00 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
31d10 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
31d20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 69 46          if( j>iF
31d30 72 6f 6d 20 26 26 20 28 73 57 42 49 2e 70 53 72  rom && (sWBI.pSr
31d40 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a  c->jointype & (J
31d50 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
31d60 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
31d70 20 20 20 20 20 20 69 66 28 20 2b 2b 63 6b 4f 70        if( ++ckOp
31d80 74 69 6d 61 6c 20 29 20 62 72 65 61 6b 3b 0a 20  timal ) break;. 
31d90 20 20 20 20 20 20 20 69 66 28 20 28 73 57 42 49         if( (sWBI
31da0 2e 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20  .pSrc->jointype 
31db0 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 20  & JT_LEFT)!=0 ) 
31dc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
31dd0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
31de0 20 63 6b 4f 70 74 69 6d 61 6c 3d 3d 30 20 7c 7c   ckOptimal==0 ||
31df0 20 63 6b 4f 70 74 69 6d 61 6c 3d 3d 31 20 29 3b   ckOptimal==1 );
31e00 0a 0a 20 20 20 20 66 6f 72 28 69 73 4f 70 74 69  ..    for(isOpti
31e10 6d 61 6c 3d 63 6b 4f 70 74 69 6d 61 6c 3b 20 69  mal=ckOptimal; i
31e20 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26 20 62  sOptimal>=0 && b
31e30 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69 6d 61  estJ<0; isOptima
31e40 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  l--){.      for(
31e50 6a 3d 69 46 72 6f 6d 2c 20 73 57 42 49 2e 70 53  j=iFrom, sWBI.pS
31e60 72 63 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  rc=&pTabList->a[
31e70 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74 3b 20  j]; j<nTabList; 
31e80 6a 2b 2b 2c 20 73 57 42 49 2e 70 53 72 63 2b 2b  j++, sWBI.pSrc++
31e90 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  ){.        if( j
31ea0 3e 69 46 72 6f 6d 20 26 26 20 28 73 57 42 49 2e  >iFrom && (sWBI.
31eb0 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  pSrc->jointype &
31ec0 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
31ed0 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
31ee0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 65       /* This bre
31ef0 61 6b 20 61 6e 64 20 6f 6e 65 20 6c 69 6b 65 20  ak and one like 
31f00 69 74 20 69 6e 20 74 68 65 20 63 6b 4f 70 74 69  it in the ckOpti
31f10 6d 61 6c 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  mal computation 
31f20 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20 2a  loop.          *
31f30 2a 20 61 62 6f 76 65 20 70 72 65 76 65 6e 74 20  * above prevent 
31f40 74 61 62 6c 65 20 72 65 6f 72 64 65 72 69 6e 67  table reordering
31f50 20 61 63 72 6f 73 73 20 4c 45 46 54 20 61 6e 64   across LEFT and
31f60 20 43 52 4f 53 53 20 4a 4f 49 4e 73 2e 0a 20 20   CROSS JOINs..  
31f70 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 4c          ** The L
31f80 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 20 69 73  EFT JOIN case is
31f90 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 63   necessary for c
31fa0 6f 72 72 65 63 74 6e 65 73 73 2e 20 20 54 68 65  orrectness.  The
31fb0 20 70 72 6f 68 69 62 69 74 69 6f 6e 0a 20 20 20   prohibition.   
31fc0 20 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 73         ** agains
31fd0 74 20 72 65 6f 72 64 65 72 69 6e 67 20 61 63 72  t reordering acr
31fe0 6f 73 73 20 61 20 43 52 4f 53 53 20 4a 4f 49 4e  oss a CROSS JOIN
31ff0 20 69 73 20 61 6e 20 53 51 4c 69 74 65 20 66 65   is an SQLite fe
32000 61 74 75 72 65 20 74 68 61 74 0a 20 20 20 20 20  ature that.     
32010 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74       ** allows t
32020 68 65 20 64 65 76 65 6c 6f 70 65 72 20 74 6f 20  he developer to 
32030 63 6f 6e 74 72 6f 6c 20 74 61 62 6c 65 20 72 65  control table re
32040 6f 72 64 65 72 69 6e 67 20 2a 2f 0a 20 20 20 20  ordering */.    
32050 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
32070 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
32080 53 65 74 2c 20 73 57 42 49 2e 70 53 72 63 2d 3e  Set, sWBI.pSrc->
32090 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
320a0 20 20 69 66 28 20 28 6d 20 26 20 73 57 42 49 2e    if( (m & sWBI.
320b0 6e 6f 74 56 61 6c 69 64 29 3d 3d 30 20 29 7b 0a  notValid)==0 ){.
320c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
320d0 28 20 6a 3e 69 46 72 6f 6d 20 29 3b 0a 20 20 20  ( j>iFrom );.   
320e0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
320f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32100 20 20 20 73 57 42 49 2e 6e 6f 74 52 65 61 64 79     sWBI.notReady
32110 20 3d 20 28 69 73 4f 70 74 69 6d 61 6c 20 3f 20   = (isOptimal ? 
32120 6d 20 3a 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69  m : sWBI.notVali
32130 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
32140 73 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e 64 65  sWBI.pSrc->pInde
32150 78 3d 3d 30 20 29 20 6e 55 6e 63 6f 6e 73 74 72  x==0 ) nUnconstr
32160 61 69 6e 65 64 2b 2b 3b 0a 20 20 0a 20 20 20 20  ained++;.  .    
32170 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
32180 22 20 20 20 3d 3d 3d 20 74 72 79 69 6e 67 20 74  "   === trying t
32190 61 62 6c 65 20 25 64 20 28 25 73 29 20 77 69 74  able %d (%s) wit
321a0 68 20 69 73 4f 70 74 69 6d 61 6c 3d 25 64 20 3d  h isOptimal=%d =
321b0 3d 3d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ==\n",.         
321c0 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20 73 57             j, sW
321d0 42 49 2e 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  BI.pSrc->pTab->z
321e0 4e 61 6d 65 2c 20 69 73 4f 70 74 69 6d 61 6c 29  Name, isOptimal)
321f0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
32200 74 28 20 73 57 42 49 2e 70 53 72 63 2d 3e 70 54  t( sWBI.pSrc->pT
32210 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ab );.#ifndef SQ
32220 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
32230 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69  LTABLE.        i
32240 66 28 20 49 73 56 69 72 74 75 61 6c 28 73 57 42  f( IsVirtual(sWB
32250 49 2e 70 53 72 63 2d 3e 70 54 61 62 29 20 29 7b  I.pSrc->pTab) ){
32260 0a 20 20 20 20 20 20 20 20 20 20 73 57 42 49 2e  .          sWBI.
32270 70 70 49 64 78 49 6e 66 6f 20 3d 20 26 70 57 49  ppIdxInfo = &pWI
32280 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e  nfo->a[j].pIdxIn
32290 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65  fo;.          be
322a0 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 26  stVirtualIndex(&
322b0 73 57 42 49 29 3b 0a 20 20 20 20 20 20 20 20 7d  sWBI);.        }
322c0 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20  else .#endif.   
322d0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
322e0 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28   bestBtreeIndex(
322f0 26 73 57 42 49 29 3b 0a 20 20 20 20 20 20 20 20  &sWBI);.        
32300 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
32310 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c 7c 20 28  ( isOptimal || (
32320 73 57 42 49 2e 63 6f 73 74 2e 75 73 65 64 26 73  sWBI.cost.used&s
32330 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d 30  WBI.notValid)==0
32340 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   );..        /* 
32350 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  If an INDEXED BY
32360 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65   clause is prese
32370 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 70 6c 61  nt, then the pla
32380 6e 20 6d 75 73 74 20 75 73 65 20 74 68 61 74 0a  n must use that.
32390 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
323a0 20 69 66 20 69 74 20 75 73 65 73 20 61 6e 79 20   if it uses any 
323b0 69 6e 64 65 78 20 61 74 20 61 6c 6c 20 2a 2f 0a  index at all */.
323c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
323d0 73 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e 64 65  sWBI.pSrc->pInde
323e0 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  x==0 .          
323f0 20 20 20 20 20 20 20 20 7c 7c 20 28 73 57 42 49          || (sWBI
32400 2e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  .cost.plan.wsFla
32410 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
32420 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20 20 20  ULLSCAN)==0.    
32430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
32440 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e   sWBI.cost.plan.
32450 75 2e 70 49 64 78 3d 3d 73 57 42 49 2e 70 53 72  u.pIdx==sWBI.pSr
32460 63 2d 3e 70 49 6e 64 65 78 20 29 3b 0a 0a 20 20  c->pIndex );..  
32470 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 74 69        if( isOpti
32480 6d 61 6c 20 26 26 20 28 73 57 42 49 2e 63 6f 73  mal && (sWBI.cos
32490 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  t.plan.wsFlags &
324a0 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
324b0 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  CAN)==0 ){.     
324c0 20 20 20 20 20 6e 6f 74 49 6e 64 65 78 65 64 20       notIndexed 
324d0 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  |= m;.        }.
324e0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70          if( isOp
324f0 74 69 6d 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  timal ){.       
32500 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e     pWInfo->a[j].
32510 72 4f 70 74 43 6f 73 74 20 3d 20 73 57 42 49 2e  rOptCost = sWBI.
32520 63 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20 20 20  cost.rCost;.    
32530 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6b      }else if( ck
32540 4f 70 74 69 6d 61 6c 20 29 7b 0a 20 20 20 20 20  Optimal ){.     
32550 20 20 20 20 20 2f 2a 20 49 66 20 74 77 6f 20 6f       /* If two o
32560 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 20 68 61  r more tables ha
32570 76 65 20 6e 65 61 72 6c 79 20 74 68 65 20 73 61  ve nearly the sa
32580 6d 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 63 6f  me outer loop co
32590 73 74 2c 20 62 75 74 0a 20 20 20 20 20 20 20 20  st, but.        
325a0 20 20 2a 2a 20 76 65 72 79 20 64 69 66 66 65 72    ** very differ
325b0 65 6e 74 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 28  ent inner loop (
325c0 6f 70 74 69 6d 61 6c 29 20 63 6f 73 74 2c 20 77  optimal) cost, w
325d0 65 20 77 61 6e 74 20 74 6f 20 63 68 6f 6f 73 65  e want to choose
325e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  .          ** fo
325f0 72 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  r the outer loop
32600 20 74 68 61 74 20 74 61 62 6c 65 20 77 68 69 63   that table whic
32610 68 20 62 65 6e 65 66 69 74 73 20 74 68 65 20 6c  h benefits the l
32620 65 61 73 74 20 66 72 6f 6d 0a 20 20 20 20 20 20  east from.      
32630 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 69 6e 20      ** being in 
32640 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  the inner loop. 
32650 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
32660 6f 64 65 20 73 63 61 6c 65 73 20 74 68 65 20 0a  ode scales the .
32670 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74            ** out
32680 65 72 20 6c 6f 6f 70 20 63 6f 73 74 20 65 73 74  er loop cost est
32690 69 6d 61 74 65 20 74 6f 20 61 63 63 6f 6d 70 6c  imate to accompl
326a0 69 73 68 20 74 68 61 74 2e 20 2a 2f 0a 20 20 20  ish that. */.   
326b0 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
326c0 45 28 28 22 20 20 20 73 63 61 6c 69 6e 67 20 63  E(("   scaling c
326d0 6f 73 74 20 66 72 6f 6d 20 25 2e 31 66 20 74 6f  ost from %.1f to
326e0 20 25 2e 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20   %.1f\n",.      
326f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32700 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f 73 74 2c  sWBI.cost.rCost,
32710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32720 20 20 20 20 20 20 20 73 57 42 49 2e 63 6f 73 74         sWBI.cost
32730 2e 72 43 6f 73 74 2f 70 57 49 6e 66 6f 2d 3e 61  .rCost/pWInfo->a
32740 5b 6a 5d 2e 72 4f 70 74 43 6f 73 74 29 29 3b 0a  [j].rOptCost));.
32750 20 20 20 20 20 20 20 20 20 20 73 57 42 49 2e 63            sWBI.c
32760 6f 73 74 2e 72 43 6f 73 74 20 2f 3d 20 70 57 49  ost.rCost /= pWI
32770 6e 66 6f 2d 3e 61 5b 6a 5d 2e 72 4f 70 74 43 6f  nfo->a[j].rOptCo
32780 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  st;.        }.. 
32790 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74         /* Condit
327a0 69 6f 6e 73 20 75 6e 64 65 72 20 77 68 69 63 68  ions under which
327b0 20 74 68 69 73 20 74 61 62 6c 65 20 62 65 63 6f   this table beco
327c0 6d 65 73 20 74 68 65 20 62 65 73 74 20 73 6f 20  mes the best so 
327d0 66 61 72 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  far:.        **.
327e0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 31 29          **   (1)
327f0 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   The table must 
32800 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20 6f 74  not depend on ot
32810 68 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20  her tables that 
32820 68 61 76 65 20 6e 6f 74 0a 20 20 20 20 20 20 20  have not.       
32830 20 2a 2a 20 20 20 20 20 20 20 79 65 74 20 72 75   **       yet ru
32840 6e 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  n.  (In other wo
32850 72 64 73 2c 20 69 74 20 6d 75 73 74 20 6e 6f 74  rds, it must not
32860 20 64 65 70 65 6e 64 20 6f 6e 20 74 61 62 6c 65   depend on table
32870 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  s.        **    
32880 20 20 20 69 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70     in inner loop
32890 73 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  s.).        **. 
328a0 20 20 20 20 20 20 20 2a 2a 20 20 20 28 32 29 20         **   (2) 
328b0 28 54 68 69 73 20 72 75 6c 65 20 77 61 73 20 72  (This rule was r
328c0 65 6d 6f 76 65 64 20 6f 6e 20 32 30 31 32 2d 31  emoved on 2012-1
328d0 31 2d 30 39 2e 20 20 54 68 65 20 73 63 61 6c 69  1-09.  The scali
328e0 6e 67 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ng of the.      
328f0 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 73 74 20    **       cost 
32900 75 73 69 6e 67 20 74 68 65 20 6f 70 74 69 6d 61  using the optima
32910 6c 20 73 63 61 6e 20 63 6f 73 74 20 6d 61 64 65  l scan cost made
32920 20 74 68 69 73 20 72 75 6c 65 20 6f 62 73 6f 6c   this rule obsol
32930 65 74 65 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a  ete.).        **
32940 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 33  .        **   (3
32950 29 20 41 6c 6c 20 74 61 62 6c 65 73 20 68 61 76  ) All tables hav
32960 65 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  e an INDEXED BY 
32970 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20 74  clause or this t
32980 61 62 6c 65 20 6c 61 63 6b 73 20 61 6e 0a 20 20  able lacks an.  
32990 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 49        **       I
329a0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
329b0 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 75   or this table u
329c0 73 65 73 20 74 68 65 20 73 70 65 63 69 66 69 63  ses the specific
329d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
329e0 20 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65    index specifie
329f0 64 20 62 79 20 69 74 73 20 49 4e 44 45 58 45 44  d by its INDEXED
32a00 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 69   BY clause.  Thi
32a10 73 20 72 75 6c 65 20 65 6e 73 75 72 65 73 0a 20  s rule ensures. 
32a20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
32a30 74 68 61 74 20 61 20 62 65 73 74 2d 73 6f 2d 66  that a best-so-f
32a40 61 72 20 69 73 20 61 6c 77 61 79 73 20 73 65 6c  ar is always sel
32a50 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 61 6e  ected even if an
32a60 20 69 6d 70 6f 73 73 69 62 6c 65 0a 20 20 20 20   impossible.    
32a70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 6d      **       com
32a80 62 69 6e 61 74 69 6f 6e 20 6f 66 20 49 4e 44 45  bination of INDE
32a90 58 45 44 20 42 59 20 63 6c 61 75 73 65 73 20 61  XED BY clauses a
32aa0 72 65 20 67 69 76 65 6e 2e 20 20 54 68 65 20 65  re given.  The e
32ab0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rror.        ** 
32ac0 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 64 65        will be de
32ad0 74 65 63 74 65 64 20 61 6e 64 20 72 65 6c 61 79  tected and relay
32ae0 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 61  ed back to the a
32af0 70 70 6c 69 63 61 74 69 6f 6e 20 6c 61 74 65 72  pplication later
32b00 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  ..        **    
32b10 20 20 20 54 68 65 20 4e 45 56 45 52 28 29 20 63     The NEVER() c
32b20 6f 6d 65 73 20 61 62 6f 75 74 20 62 65 63 61 75  omes about becau
32b30 73 65 20 72 75 6c 65 20 28 32 29 20 61 62 6f 76  se rule (2) abov
32b40 65 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20  e prevents.     
32b50 20 20 20 2a 2a 20 20 20 20 20 20 20 41 6e 20 69     **       An i
32b60 6e 64 65 78 61 62 6c 65 20 66 75 6c 6c 2d 74 61  ndexable full-ta
32b70 62 6c 65 2d 73 63 61 6e 20 66 72 6f 6d 20 72 65  ble-scan from re
32b80 61 63 68 69 6e 67 20 72 75 6c 65 20 28 33 29 2e  aching rule (3).
32b90 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
32ba0 20 20 20 20 2a 2a 20 20 20 28 34 29 20 54 68 65      **   (4) The
32bb0 20 70 6c 61 6e 20 63 6f 73 74 20 6d 75 73 74 20   plan cost must 
32bc0 62 65 20 6c 6f 77 65 72 20 74 68 61 6e 20 70 72  be lower than pr
32bd0 69 6f 72 20 70 6c 61 6e 73 2c 20 77 68 65 72 65  ior plans, where
32be0 20 22 63 6f 73 74 22 0a 20 20 20 20 20 20 20 20   "cost".        
32bf0 2a 2a 20 20 20 20 20 20 20 69 73 20 64 65 66 69  **       is defi
32c00 6e 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  ned by the compa
32c10 72 65 43 6f 73 74 28 29 20 66 75 6e 63 74 69 6f  reCost() functio
32c20 6e 20 61 62 6f 76 65 2e 20 0a 20 20 20 20 20 20  n above. .      
32c30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
32c40 20 28 73 57 42 49 2e 63 6f 73 74 2e 75 73 65 64   (sWBI.cost.used
32c50 26 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3d  &sWBI.notValid)=
32c60 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
32c70 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
32c80 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
32c90 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3d 3d  nUnconstrained==
32ca0 30 20 7c 7c 20 73 57 42 49 2e 70 53 72 63 2d 3e  0 || sWBI.pSrc->
32cb0 70 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 20 20  pIndex==0       
32cc0 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
32cd0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 4e 45             || NE
32ce0 56 45 52 28 28 73 57 42 49 2e 63 6f 73 74 2e 70  VER((sWBI.cost.p
32cf0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
32d00 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
32d10 29 21 3d 30 29 29 0a 20 20 20 20 20 20 20 20 20  )!=0)).         
32d20 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c     && (bestJ<0 |
32d30 7c 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 26 73  | compareCost(&s
32d40 57 42 49 2e 63 6f 73 74 2c 20 26 62 65 73 74 50  WBI.cost, &bestP
32d50 6c 61 6e 29 29 20 20 20 2f 2a 20 28 34 29 20 2a  lan))   /* (4) *
32d60 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
32d70 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
32d80 45 28 28 22 20 20 20 3d 3d 3d 20 74 61 62 6c 65  E(("   === table
32d90 20 25 64 20 28 25 73 29 20 69 73 20 62 65 73 74   %d (%s) is best
32da0 20 73 6f 20 66 61 72 5c 6e 22 0a 20 20 20 20 20   so far\n".     
32db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dc0 20 22 20 20 20 20 20 20 20 63 6f 73 74 3d 25 2e   "       cost=%.
32dd0 31 66 2c 20 6e 52 6f 77 3d 25 2e 31 66 2c 20 6e  1f, nRow=%.1f, n
32de0 4f 42 53 61 74 3d 25 64 2c 20 77 73 46 6c 61 67  OBSat=%d, wsFlag
32df0 73 3d 25 30 38 78 5c 6e 22 2c 0a 20 20 20 20 20  s=%08x\n",.     
32e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e10 20 6a 2c 20 73 57 42 49 2e 70 53 72 63 2d 3e 70   j, sWBI.pSrc->p
32e20 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
32e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e40 20 20 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f 73    sWBI.cost.rCos
32e50 74 2c 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61  t, sWBI.cost.pla
32e60 6e 2e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  n.nRow,.        
32e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 57                sW
32e80 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42  BI.cost.plan.nOB
32e90 53 61 74 2c 20 73 57 42 49 2e 63 6f 73 74 2e 70  Sat, sWBI.cost.p
32ea0 6c 61 6e 2e 77 73 46 6c 61 67 73 29 29 3b 0a 20  lan.wsFlags));. 
32eb0 20 20 20 20 20 20 20 20 20 62 65 73 74 50 6c 61           bestPla
32ec0 6e 20 3d 20 73 57 42 49 2e 63 6f 73 74 3b 0a 20  n = sWBI.cost;. 
32ed0 20 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d           bestJ =
32ee0 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   j;.        }.. 
32ef0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
32f00 6f 69 6e 20 6c 69 6b 65 20 22 77 20 4a 4f 49 4e  oin like "w JOIN
32f10 20 78 20 4c 45 46 54 20 4a 4f 49 4e 20 79 20 4a   x LEFT JOIN y J
32f20 4f 49 4e 20 7a 22 20 20 6d 61 6b 65 20 73 75 72  OIN z"  make sur
32f30 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
32f40 2a 20 74 61 62 6c 65 20 79 20 28 61 6e 64 20 6e  * table y (and n
32f50 6f 74 20 74 61 62 6c 65 20 7a 29 20 69 73 20 61  ot table z) is a
32f60 6c 77 61 79 73 20 74 68 65 20 6e 65 78 74 20 69  lways the next i
32f70 6e 6e 65 72 20 6c 6f 6f 70 20 69 6e 73 69 64 65  nner loop inside
32f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
32f90 61 62 6c 65 20 78 2e 20 2a 2f 0a 20 20 20 20 20  able x. */.     
32fa0 20 20 20 69 66 28 20 28 73 57 42 49 2e 70 53 72     if( (sWBI.pSr
32fb0 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
32fc0 5f 4c 45 46 54 29 21 3d 30 20 29 20 62 72 65 61  _LEFT)!=0 ) brea
32fd0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
32fe0 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73  .    assert( bes
32ff0 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  tJ>=0 );.    ass
33000 65 72 74 28 20 73 57 42 49 2e 6e 6f 74 56 61 6c  ert( sWBI.notVal
33010 69 64 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61  id & getMask(pMa
33020 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
33030 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f  >a[bestJ].iCurso
33040 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
33050 28 20 62 65 73 74 4a 3d 3d 69 46 72 6f 6d 20 7c  ( bestJ==iFrom |
33060 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  | (pTabList->a[i
33070 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  From].jointype &
33080 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 3b 0a   JT_LEFT)==0 );.
33090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 65      testcase( be
330a0 73 74 4a 3e 69 46 72 6f 6d 20 26 26 20 28 70 54  stJ>iFrom && (pT
330b0 61 62 4c 69 73 74 2d 3e 61 5b 69 46 72 6f 6d 5d  abList->a[iFrom]
330c0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 43  .jointype & JT_C
330d0 52 4f 53 53 29 21 3d 30 20 29 3b 0a 20 20 20 20  ROSS)!=0 );.    
330e0 74 65 73 74 63 61 73 65 28 20 62 65 73 74 4a 3e  testcase( bestJ>
330f0 69 46 72 6f 6d 20 26 26 20 62 65 73 74 4a 3c 6e  iFrom && bestJ<n
33100 54 61 62 4c 69 73 74 2d 31 0a 20 20 20 20 20 20  TabList-1.      
33110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33120 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73 74      && (pTabList
33130 2d 3e 61 5b 62 65 73 74 4a 2b 31 5d 2e 6a 6f 69  ->a[bestJ+1].joi
33140 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
33150 21 3d 30 20 29 3b 0a 20 20 20 20 57 48 45 52 45  !=0 );.    WHERE
33160 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69  TRACE(("*** Opti
33170 6d 69 7a 65 72 20 73 65 6c 65 63 74 73 20 74 61  mizer selects ta
33180 62 6c 65 20 25 64 20 28 25 73 29 20 66 6f 72 20  ble %d (%s) for 
33190 6c 6f 6f 70 20 25 64 20 77 69 74 68 3a 5c 6e 22  loop %d with:\n"
331a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
331b0 20 22 20 20 20 20 63 6f 73 74 3d 25 2e 31 66 2c   "    cost=%.1f,
331c0 20 6e 52 6f 77 3d 25 2e 31 66 2c 20 6e 4f 42 53   nRow=%.1f, nOBS
331d0 61 74 3d 25 64 2c 20 77 73 46 6c 61 67 73 3d 30  at=%d, wsFlags=0
331e0 78 25 30 38 78 5c 6e 22 2c 0a 20 20 20 20 20 20  x%08x\n",.      
331f0 20 20 20 20 20 20 20 20 20 20 62 65 73 74 4a 2c            bestJ,
33200 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
33210 74 4a 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  tJ].pTab->zName,
33220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33230 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e   pLevel-pWInfo->
33240 61 2c 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73  a, bestPlan.rCos
33250 74 2c 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  t, bestPlan.plan
33260 2e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  .nRow,.         
33270 20 20 20 20 20 20 20 62 65 73 74 50 6c 61 6e 2e         bestPlan.
33280 70 6c 61 6e 2e 6e 4f 42 53 61 74 2c 20 62 65 73  plan.nOBSat, bes
33290 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
332a0 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62  gs));.    if( (b
332b0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
332c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
332d0 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20 20 20  TINCT)!=0 ){.   
332e0 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66     assert( pWInf
332f0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 30 20  o->eDistinct==0 
33300 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  );.      pWInfo-
33310 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
33320 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
33330 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  RED;.    }.    a
33340 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 50  ndFlags &= bestP
33350 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
33360 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c  ;.    pLevel->pl
33370 61 6e 20 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c  an = bestPlan.pl
33380 61 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  an;.    pLevel->
33390 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 4c 69  iTabCur = pTabLi
333a0 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
333b0 72 73 6f 72 3b 0a 20 20 20 20 74 65 73 74 63 61  rsor;.    testca
333c0 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  se( bestPlan.pla
333d0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
333e0 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 20  E_INDEXED );.   
333f0 20 74 65 73 74 63 61 73 65 28 20 62 65 73 74 50   testcase( bestP
33400 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
33410 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
33420 44 45 58 20 29 3b 0a 20 20 20 20 69 66 28 20 62  DEX );.    if( b
33430 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
33440 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
33450 44 45 58 45 44 7c 57 48 45 52 45 5f 54 45 4d 50  DEXED|WHERE_TEMP
33460 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 20  _INDEX) ){.     
33470 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
33480 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
33490 45 5f 4f 4e 4c 59 29 20 0a 20 20 20 20 20 20 20  E_ONLY) .       
334a0 26 26 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61  && (bestPlan.pla
334b0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
334c0 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30  E_TEMP_INDEX)==0
334d0 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
334e0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
334f0 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  ur = iIdxCur;.  
33500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33510 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
33520 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
33530 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b++;.      }.   
33540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
33550 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
33560 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 57  -1;.    }.    sW
33570 42 49 2e 6e 6f 74 56 61 6c 69 64 20 26 3d 20 7e  BI.notValid &= ~
33580 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
33590 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65  , pTabList->a[be
335a0 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  stJ].iCursor);. 
335b0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
335c0 20 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a 20 20   = (u8)bestJ;.  
335d0 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e 70    if( bestPlan.p
335e0 6c 61 6e 2e 6e 52 6f 77 3e 3d 28 64 6f 75 62 6c  lan.nRow>=(doubl
335f0 65 29 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  e)1 ){.      pPa
33600 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
33610 2a 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  *= bestPlan.plan
33620 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 0a 20 20  .nRow;.    }..  
33630 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
33640 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  if the table sca
33650 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c 6f 6f  nned by this loo
33660 70 20 69 74 65 72 61 74 69 6f 6e 20 68 61 64 20  p iteration had 
33670 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44 45 58 45  an.    ** INDEXE
33680 44 20 42 59 20 63 6c 61 75 73 65 20 61 74 74 61  D BY clause atta
33690 63 68 65 64 20 74 6f 20 69 74 2c 20 74 68 61 74  ched to it, that
336a0 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
336b0 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a   is being.    **
336c0 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 73 63   used for the sc
336d0 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74 68 65 6e  an. If not, then
336e0 20 71 75 65 72 79 20 63 6f 6d 70 69 6c 61 74 69   query compilati
336f0 6f 6e 20 68 61 73 20 66 61 69 6c 65 64 2e 0a 20  on has failed.. 
33700 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20     ** Return an 
33710 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
33720 20 20 70 49 64 78 20 3d 20 70 54 61 62 4c 69 73    pIdx = pTabLis
33730 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 49 6e 64  t->a[bestJ].pInd
33740 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  ex;.    if( pIdx
33750 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 62   ){.      if( (b
33760 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
33770 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
33780 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20 20 20 20  EXED)==0 ){.    
33790 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
337a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
337b0 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a 20 25  not use index: %
337c0 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
337d0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77  ;.        goto w
337e0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
337f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33800 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e       /* If an IN
33810 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
33820 69 73 20 75 73 65 64 2c 20 74 68 65 20 62 65 73  is used, the bes
33830 74 49 6e 64 65 78 28 29 20 66 75 6e 63 74 69 6f  tIndex() functio
33840 6e 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  n is.        ** 
33850 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
33860 6e 64 20 74 68 65 20 69 6e 64 65 78 20 73 70 65  nd the index spe
33870 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 49 4e  cified in the IN
33880 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 0a  DEXED BY clause.
33890 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 69 74          ** if it
338a0 20 66 69 6e 64 20 61 6e 20 69 6e 64 65 78 20 61   find an index a
338b0 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  t all. */.      
338c0 20 20 61 73 73 65 72 74 28 20 62 65 73 74 50 6c    assert( bestPl
338d0 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  an.plan.u.pIdx==
338e0 70 49 64 78 20 29 3b 0a 20 20 20 20 20 20 7d 0a  pIdx );.      }.
338f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52      }.  }.  WHER
33900 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74  ETRACE(("*** Opt
33910 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
33920 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20  ***\n"));.  if( 
33930 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
33940 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
33950 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
33960 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
33970 7d 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  }.  if( nTabList
33980 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 2d   ){.    pLevel--
33990 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f  ;.    pWInfo->nO
339a0 42 53 61 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  BSat = pLevel->p
339b0 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20 7d 65  lan.nOBSat;.  }e
339c0 6c 73 65 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  lse{.    pWInfo-
339d0 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 7d  >nOBSat = 0;.  }
339e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f  ..  /* If the to
339f0 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73  tal query only s
33a00 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20  elects a single 
33a10 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52  row, then the OR
33a20 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75  DER BY.  ** clau
33a30 73 65 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74  se is irrelevant
33a40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e  ..  */.  if( (an
33a50 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  dFlags & WHERE_U
33a60 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70 4f 72  NIQUE)!=0 && pOr
33a70 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73  derBy ){.    ass
33a80 65 72 74 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30  ert( nTabList==0
33a90 20 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61   || (pLevel->pla
33aa0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
33ab0 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 29 21 3d 30  E_ALL_UNIQUE)!=0
33ac0 20 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   );.    pWInfo->
33ad0 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42  nOBSat = pOrderB
33ae0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20  y->nExpr;.  }.. 
33af0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
33b00 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
33b10 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
33b20 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
33b30 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
33b40 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
33b50 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
33b60 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
33b70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54  ropriate..  ** T
33b80 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f  he one-pass algo
33b90 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73  rithm only works
33ba0 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
33bb0 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
33bc0 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  .  ** the statem
33bd0 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20  ent to update a 
33be0 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f  single row..  */
33bf0 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
33c00 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
33c10 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
33c20 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =0 || pWInfo->nL
33c30 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28  evel==1 );.  if(
33c40 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
33c50 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
33c60 49 52 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64  IRED)!=0 && (and
33c70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e  Flags & WHERE_UN
33c80 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  IQUE)!=0 ){.    
33c90 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
33ca0 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66  s = 1;.    pWInf
33cb0 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46  o->a[0].plan.wsF
33cc0 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49  lags &= ~WHERE_I
33cd0 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20  DX_ONLY;.  }..  
33ce0 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
33cf0 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
33d00 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
33d10 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
33d20 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
33d30 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
33d40 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  /.  sqlite3CodeV
33d50 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
33d60 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65  se, -1); /* Inse
33d70 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  rt the cookie ve
33d80 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20  rifier Goto */. 
33d90 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
33da0 74 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49 6e 66  tmask)0;.  pWInf
33db0 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28 64 6f  o->nRowOut = (do
33dc0 75 62 6c 65 29 31 3b 0a 20 20 66 6f 72 28 69 69  uble)1;.  for(ii
33dd0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
33de0 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73  o->a; ii<nTabLis
33df0 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  t; ii++, pLevel+
33e00 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
33e10 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  Tab;     /* Tabl
33e20 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  e to open */.   
33e30 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
33e40 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61    /* Index of da
33e50 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
33e60 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f  g table/index */
33e70 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
33e80 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
33e90 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65  em;..    pTabIte
33ea0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
33eb0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
33ec0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
33ed0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
33ee0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
33ef0 2a 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  *= pLevel->plan.
33f00 6e 52 6f 77 3b 0a 20 20 20 20 69 44 62 20 3d 20  nRow;.    iDb = 
33f10 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
33f20 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
33f30 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28  Schema);.    if(
33f40 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
33f50 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
33f60 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
33f70 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lect ){.      /*
33f80 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
33f90 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66     }else.#ifndef
33fa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
33fb0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
33fc0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
33fd0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
33fe0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
33ff0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
34000 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63  char *pVTab = (c
34010 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
34020 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
34030 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e   pTab);.      in
34040 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
34050 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
34060 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34070 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c  Op4(v, OP_VOpen,
34080 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54   iCur, 0, 0, pVT
34090 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
340a0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
340b0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
340c0 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a       /* noop */.
340d0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
340e0 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
340f0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
34100 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
34110 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
34120 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
34130 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
34140 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  OSE)==0 ){.     
34150 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f   int op = pWInfo
34160 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50  ->okOnePass ? OP
34170 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f  _OpenWrite : OP_
34180 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
34190 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
341a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
341b0 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c  m->iCursor, iDb,
341c0 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20   pTab, op);.    
341d0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
341e0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
341f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
34200 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
34210 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
34220 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
34230 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
34240 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  MS ){.        Bi
34250 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
34260 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
34270 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
34280 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
34290 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
342a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
342b0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73  dbeChangeP4(v, s
342c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
342d0 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20  tAddr(v)-1, .   
342e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
342f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
34300 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50  INT_TO_PTR(n), P
34310 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
34320 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
34330 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
34340 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
34350 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
34360 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
34370 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
34380 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
34390 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
343a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
343b0 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
343c0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
343d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
343e0 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  EMP_INDEX)!=0 ){
343f0 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74  .      construct
34400 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70  AutomaticIndex(p
34410 50 61 72 73 65 2c 20 73 57 42 49 2e 70 57 43 2c  Parse, sWBI.pWC,
34420 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65   pTabItem, notRe
34430 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20  ady, pLevel);.  
34440 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
34450 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
34460 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
34470 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
34480 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
34490 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  *pIx = pLevel->p
344a0 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
344b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
344c0 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
344d0 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
344e0 78 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  x);.      int iI
344f0 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  ndexCur = pLevel
34500 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
34510 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53   assert( pIx->pS
34520 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
34530 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73  hema );.      as
34540 73 65 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e  sert( iIndexCur>
34550 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
34560 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
34570 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
34580 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e  ndexCur, pIx->tn
34590 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
345a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345b0 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34   (char*)pKey, P4
345c0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
345d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
345e0 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
345f0 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  Ix->zName));.   
34600 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
34610 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
34620 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
34630 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
34640 74 4d 61 73 6b 28 73 57 42 49 2e 70 57 43 2d 3e  tMask(sWBI.pWC->
34650 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74  pMaskSet, pTabIt
34660 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
34670 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  }.  pWInfo->iTop
34680 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
34690 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
346a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
346b0 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
346c0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
346d0 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
346e0 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73  code to do the s
346f0 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65  earch.  Each ite
34700 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  ration of the fo
34710 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f  r.  ** loop belo
34720 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  w generates code
34730 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65   for a single ne
34740 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
34750 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d   VM.  ** program
34760 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
34770 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
34780 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
34790 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b  nTabList; ii++){
347a0 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
347b0 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20  WInfo->a[ii];.  
347c0 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e    explainOneScan
347d0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
347e0 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70  t, pLevel, ii, p
347f0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63  Level->iFrom, wc
34800 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 6e  trlFlags);.    n
34810 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e  otReady = codeOn
34820 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66  eLoopStart(pWInf
34830 6f 2c 20 69 69 2c 20 77 63 74 72 6c 46 6c 61 67  o, ii, wctrlFlag
34840 73 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20  s, notReady);.  
34850 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69    pWInfo->iConti
34860 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  nue = pLevel->ad
34870 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66  drCont;.  }..#if
34880 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20  def SQLITE_TEST 
34890 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20   /* For testing 
348a0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
348b0 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52  e only */.  /* R
348c0 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65  ecord in the que
348d0 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74  ry plan informat
348e0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75  ion about the cu
348f0 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a  rrent table.  **
34900 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75   and the index u
34910 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74  sed to access it
34920 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74   (if any).  If t
34930 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a  he table itself.
34940 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
34950 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75  , its name is ju
34960 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20  st '{}'.  If no 
34970 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20  index is used.  
34980 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
34990 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20  listed as "{}". 
349a0 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
349b0 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a  key is used the.
349c0 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20    ** index name 
349d0 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66  is '*'..  */.  f
349e0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62  or(ii=0; ii<nTab
349f0 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  List; ii++){.   
34a00 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e   char *z;.    in
34a10 74 20 6e 3b 0a 20 20 20 20 69 6e 74 20 77 3b 0a  t n;.    int w;.
34a20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
34a30 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
34a40 6d 3b 0a 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  m;..    pLevel =
34a50 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b   &pWInfo->a[ii];
34a60 0a 20 20 20 20 77 20 3d 20 70 4c 65 76 65 6c 2d  .    w = pLevel-
34a70 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  >plan.wsFlags;. 
34a80 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
34a90 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
34aa0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a  l->iFrom];.    z
34ab0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c   = pTabItem->zAl
34ac0 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  ias;.    if( z==
34ad0 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d  0 ) z = pTabItem
34ae0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  ->pTab->zName;. 
34af0 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
34b00 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
34b10 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
34b20 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
34b30 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20  ry_plan)-10 ){. 
34b40 20 20 20 20 20 69 66 28 20 28 77 20 26 20 57 48       if( (w & WH
34b50 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
34b60 20 26 26 20 28 77 20 26 20 57 48 45 52 45 5f 43   && (w & WHERE_C
34b70 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30 20 29 7b  OVER_SCAN)==0 ){
34b80 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
34b90 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
34ba0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
34bb0 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 6e  ", 2);.        n
34bc0 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20  QPlan += 2;.    
34bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34be0 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
34bf0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
34c00 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  an], z, n);.    
34c10 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b      nQPlan += n;
34c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
34c30 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
34c40 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20  n[nQPlan++] = ' 
34c50 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  ';.    }.    tes
34c60 74 63 61 73 65 28 20 77 20 26 20 57 48 45 52 45  tcase( w & WHERE
34c70 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20 20 20  _ROWID_EQ );.   
34c80 20 74 65 73 74 63 61 73 65 28 20 77 20 26 20 57   testcase( w & W
34c90 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
34ca0 20 29 3b 0a 20 20 20 20 69 66 28 20 77 20 26 20   );.    if( w & 
34cb0 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c  (WHERE_ROWID_EQ|
34cc0 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
34cd0 45 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  E) ){.      memc
34ce0 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
34cf0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
34d00 22 2a 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20  "* ", 2);.      
34d10 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
34d20 20 7d 65 6c 73 65 20 69 66 28 20 28 77 20 26 20   }else if( (w & 
34d30 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
34d40 30 20 26 26 20 28 77 20 26 20 57 48 45 52 45 5f  0 && (w & WHERE_
34d50 43 4f 56 45 52 5f 53 43 41 4e 29 3d 3d 30 20 29  COVER_SCAN)==0 )
34d60 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69  {.      n = sqli
34d70 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65 76  te3Strlen30(pLev
34d80 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d  el->plan.u.pIdx-
34d90 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
34da0 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
34db0 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
34dc0 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20  ry_plan)-2 ){.  
34dd0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
34de0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
34df0 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c  [nQPlan], pLevel
34e00 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a  ->plan.u.pIdx->z
34e10 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
34e20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20    nQPlan += n;. 
34e30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71         sqlite3_q
34e40 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
34e50 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
34e60 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
34e70 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
34e80 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
34e90 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33  QPlan], "{} ", 3
34ea0 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  );.      nQPlan 
34eb0 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 3;.    }.  }.
34ec0 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e    while( nQPlan>
34ed0 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65  0 && sqlite3_que
34ee0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31  ry_plan[nQPlan-1
34ef0 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71  ]==' ' ){.    sq
34f00 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
34f10 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  [--nQPlan] = 0;.
34f20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75    }.  sqlite3_qu
34f30 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
34f40 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d   = 0;.  nQPlan =
34f50 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   0;.#endif /* SQ
34f60 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73  LITE_TEST // Tes
34f70 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
34f80 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a  ng use only */..
34f90 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
34fa0 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64  continuation add
34fb0 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72  ress in the Wher
34fc0 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  eInfo structure.
34fd0 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61    Then.  ** clea
34fe0 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e  n up and return.
34ff0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  .  */.  return p
35000 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
35010 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
35020 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
35030 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28  eginError:.  if(
35040 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70   pWInfo ){.    p
35050 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
35060 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
35070 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  dNQueryLoop;.   
35080 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
35090 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
350a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
350b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
350c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
350d0 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
350e0 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
350f0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
35100 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
35110 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
35120 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
35130 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
35140 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73  *pWInfo){.  Pars
35150 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
35160 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64  fo->pParse;.  Vd
35170 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
35180 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
35190 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
351a0 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20  evel;.  SrcList 
351b0 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
351c0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
351d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
351e0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
351f0 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
35200 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
35210 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
35220 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
35230 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  rse);.  for(i=pW
35240 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
35250 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
35260 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
35270 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69  ->a[i];.    sqli
35280 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
35290 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
352a0 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66  ddrCont);.    if
352b0 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
352c0 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
352d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
352e0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20  (v, pLevel->op, 
352f0 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
35300 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73  el->p2);.      s
35310 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
35320 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35  P5(v, pLevel->p5
35330 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
35340 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
35350 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
35360 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d  _ABLE && pLevel-
35370 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20  >u.in.nIn>0 ){. 
35380 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
35390 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69  op *pIn;.      i
353a0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt j;.      sqli
353b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
353c0 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
353d0 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66  ddrNxt);.      f
353e0 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69  or(j=pLevel->u.i
353f0 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76  n.nIn, pIn=&pLev
35400 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
35410 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  [j-1]; j>0; j--,
35420 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20   pIn--){.       
35430 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
35440 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
35450 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20  rInTop+1);.     
35460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
35470 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  dOp2(v, pIn->eEn
35480 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43  dLoopOp, pIn->iC
35490 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  ur, pIn->addrInT
354a0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  op);.        sql
354b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
354c0 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
354d0 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  op-1);.      }. 
354e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
354f0 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  ee(db, pLevel->u
35500 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  .in.aInLoop);.  
35510 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
35520 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
35530 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
35540 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  rk);.    if( pLe
35550 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
35560 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
35570 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
35580 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
35590 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c  (v, OP_IfPos, pL
355a0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
355b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
355c0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
355d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
355e0 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
355f0 20 20 20 20 20 20 7c 7c 20 28 70 4c 65 76 65 6c        || (pLevel
35600 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
35610 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
35620 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
35630 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
35640 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
35650 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
35660 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35670 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
35680 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
35690 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
356a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
356b0 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
356c0 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
356d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
356e0 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
356f0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
35700 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35710 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d   if( pLevel->op=
35720 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20  =OP_Return ){.  
35730 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35740 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
35750 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  sub, pLevel->p1,
35760 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
35770 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
35780 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
35790 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
357a0 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65  P_Goto, 0, pLeve
357b0 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
357c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
357d0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
357e0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
357f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22  .  }..  /* The "
35800 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20  break" point is 
35810 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20  here, just past 
35820 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
35830 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  uter loop..  ** 
35840 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  Set it..  */.  s
35850 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
35860 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f  eLabel(v, pWInfo
35870 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a  ->iBreak);..  /*
35880 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68   Close all of th
35890 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
358a0 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71  ere opened by sq
358b0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e  lite3WhereBegin.
358c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
358d0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
358e0 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  1 || pWInfo->nLe
358f0 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  vel==pTabList->n
35900 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Src );.  for(i=0
35910 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
35920 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  >a; i<pWInfo->nL
35930 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  evel; i++, pLeve
35940 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l++){.    Index 
35950 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73  *pIdx = 0;.    s
35960 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
35970 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26  em *pTabItem = &
35980 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
35990 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
359a0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
359b0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
359c0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
359d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  0 );.    if( (pT
359e0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
359f0 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a  F_Ephemeral)==0.
35a00 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53       && pTab->pS
35a10 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26  elect==0.     &&
35a20 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
35a30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
35a40 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
35a50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
35a60 74 20 77 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  t ws = pLevel->p
35a70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20  lan.wsFlags;.   
35a80 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
35a90 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73  okOnePass && (ws
35aa0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
35ab0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
35ac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35ad0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
35ae0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
35af0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
35b00 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
35b10 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26  E_INDEXED)!=0 &&
35b20 20 28 77 73 20 26 20 57 48 45 52 45 5f 54 45 4d   (ws & WHERE_TEM
35b30 50 5f 49 4e 44 45 58 29 3d 3d 30 20 29 7b 0a 20  P_INDEX)==0 ){. 
35b40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
35b50 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
35b60 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lose, pLevel->iI
35b70 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
35b80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
35b90 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20   this scan uses 
35ba0 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63  an index, make c
35bb0 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
35bc0 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
35bd0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
35be0 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e  ndex in preferen
35bf0 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e  ce to the table.
35c00 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73   Sometimes, this
35c10 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
35c20 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76  e table need nev
35c30 65 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e  er be read from.
35c40 20 54 68 69 73 20 69 73 20 61 20 70 65 72 66 6f   This is a perfo
35c50 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20  rmance boost,.  
35c60 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65    ** as the vdbe
35c70 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74   level waits unt
35c80 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  il the table is 
35c90 72 65 61 64 20 62 65 66 6f 72 65 20 61 63 74 75  read before actu
35ca0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b  ally.    ** seek
35cb0 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63 75  ing the table cu
35cc0 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f  rsor to the reco
35cd0 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  rd corresponding
35ce0 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a   to the current.
35cf0 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20      ** position 
35d00 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  in the index..  
35d10 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c    ** .    ** Cal
35d20 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ls to the code g
35d30 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77  enerator in betw
35d40 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  een sqlite3Where
35d50 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  Begin and.    **
35d60 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
35d70 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74   will have creat
35d80 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66  ed code that ref
35d90 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c  erences the tabl
35da0 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  e.    ** directl
35db0 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63  y.  This loop sc
35dc0 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64  ans all that cod
35dd0 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70  e looking for op
35de0 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  codes.    ** tha
35df0 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
35e00 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72  table and conver
35e10 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63  ts them into opc
35e20 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a  odes that.    **
35e30 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69   reference the i
35e40 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
35e50 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
35e60 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
35e70 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
35e80 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
35e90 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
35ea0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
35eb0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
35ec0 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
35ed0 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  OR ){.      pIdx
35ee0 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f   = pLevel->u.pCo
35ef0 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  vidx;.    }.    
35f00 69 66 28 20 70 49 64 78 20 26 26 20 21 64 62 2d  if( pIdx && !db-
35f10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 7b 0a  >mallocFailed){.
35f20 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20        int k, j, 
35f30 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65  last;.      Vdbe
35f40 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20  Op *pOp;..      
35f50 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
35f60 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f  eGetOp(v, pWInfo
35f70 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c  ->iTop);.      l
35f80 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
35f90 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
35fa0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49  .      for(k=pWI
35fb0 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73  nfo->iTop; k<las
35fc0 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; k++, pOp++){.
35fd0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
35fe0 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
35ff0 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
36000 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
36010 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
36020 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
36030 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
36040 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
36050 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
36060 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e   pOp->p2==pIdx->
36070 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20  aiColumn[j] ){. 
36080 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
36090 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20  ->p2 = j;.      
360a0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
360b0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
360c0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
360d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
360e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
360f0 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
36100 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  rt( (pLevel->pla
36110 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
36120 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
36130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
36140 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
36150 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
36160 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
36170 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
36180 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
36190 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
361a0 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
361b0 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
361c0 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
361d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
361e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  .  }..  /* Final
361f0 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20   cleanup.  */.  
36200 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
36210 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
36220 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
36230 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
36240 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  , pWInfo);.  ret
36250 75 72 6e 3b 0a 7d 0a                             urn;.}.