/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 8b7690cae8700b385d8a53a39387cf8054d8cc47:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29 20  e WHERETRACE(X) 
0430: 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72 65   if(sqlite3Where
0440: 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65  Trace) sqlite3De
0450: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0460: 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  e.# define WHERE
0470: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
0480: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
0490: 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66  rence.*/.typedef
04a0: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
04b0: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
04c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68 65  WhereMaskSet Whe
04e0: 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65 64  reMaskSet;.typed
04f0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0500: 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e 66  rInfo WhereOrInf
0510: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0520: 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 57  t WhereAndInfo W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70  hereAndInfo;.typ
0540: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
0550: 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74 3b  eCost WhereCost;
0560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0570: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0580: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0590: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
05a0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
05b0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
05c0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
05d0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05e0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05f0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0600: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0610: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0620: 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f   others by AND o
0630: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75  perators,.** usu
0640: 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d  ally, or sometim
0650: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
0660: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  s separated by O
0670: 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  R..**.** All Whe
0680: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
0690: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
06a0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06b0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
06c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
06d0: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
06e0: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
06f0: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
0700: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0710: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0720: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0730: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0750: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
0760: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
0770: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
0780: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
0790: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
07a0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07b0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
07c0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
07d0: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
07e0: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
07f0: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
0800: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
0810: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
0820: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
0830: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0840: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0850: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
0860: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0870: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0880: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0890: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
08a0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
08b0: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
08c0: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
08d0: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
08e0: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
08f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
0900: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
0910: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
0920: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
0930: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
0940: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
0950: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
0960: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
0970: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
0980: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
0990: 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68 65  e, wtFlag as the
09a0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74   TERM_ORINFO set
09b0: 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d   and eOperator==
09c0: 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65  WO_OR.** and the
09d0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
09e0: 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74  Info field point
09f0: 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69  s to auxiliary i
0a00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a  nformation that.
0a10: 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ** is collected 
0a20: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20  about the.**.** 
0a30: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
0a40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
0a50: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
0a60: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
0a70: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
0a80: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
0a90: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
0aa0: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
0ab0: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
0ac0: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
0ad0: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
0ae0: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
0af0: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
0b00: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
0b10: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
0b20: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
0b30: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
0b40: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
0b50: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
0b60: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
0b70: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0b80: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0ba0: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0bb0: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0bc0: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
0bd0: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
0be0: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
0bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
0c00: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
0c10: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
0c20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
0c30: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
0c40: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
0c50: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
0c60: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
0c70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
0c80: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
0c90: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
0ca0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0cb0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0cc0: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
0cd0: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
0ce0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
0cf0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
0d00: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
0d10: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
0d20: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
0d30: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
0d40: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
0d50: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0d60: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0d70: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0d80: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0d90: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0da0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0db0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0dc0: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0dd0: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0de0: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0df0: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0e00: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0e10: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0e20: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0e30: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0e40: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0e50: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
0e60: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
0e70: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
0e80: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
0e90: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
0ea0: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
0eb0: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
0ec0: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
0ed0: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
0ee0: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
0ef0: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
0f00: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
0f10: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65   tables..*/.type
0f20: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0f30: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0f40: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f50: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0f70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0f80: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
0f90: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
0fa0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0fc0: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
0fd0: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
0fe0: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
0ff0: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
1000: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
1010: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1020: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
1030: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
1040: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
1050: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
1060: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
1070: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
1080: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
1090: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
10a0: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
10b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65  nformation if (e
10c0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
10d0: 29 21 3d 30 20 2a 2f 0a 20 20 20 20 57 68 65 72  )!=0 */.    Wher
10e0: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
10f0: 66 6f 3b 20 2f 2a 20 45 78 74 72 61 20 69 6e 66  fo; /* Extra inf
1100: 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70  ormation if (eOp
1110: 65 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21  erator& WO_AND)!
1120: 3d 30 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75  =0 */.  } u;.  u
1130: 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20  16 eOperator;   
1140: 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78         /* A WO_x
1150: 78 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69  x value describi
1160: 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20  ng <op> */.  u8 
1170: 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wtFlags;        
1180: 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78       /* TERM_xxx
1190: 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65   bit flags.  See
11a0: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e   below */.  u8 n
11b0: 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
11c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11d0: 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d   children that m
11e0: 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a  ust disable us *
11f0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
1200: 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54  *pWC;       /* T
1210: 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20 74  he clause this t
1220: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a  erm is part of *
1230: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
1240: 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42  eqRight;    /* B
1250: 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  itmask of tables
1260: 20 75 73 65 64 20 62 79 20 70 45 78 70 72 2d 3e   used by pExpr->
1270: 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d  pRight */.  Bitm
1280: 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20  ask prereqAll;  
1290: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
12a0: 66 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  f tables referen
12b0: 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a  ced by pExpr */.
12c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
12d0: 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72  d values of Wher
12e0: 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f  eTerm.wtFlags.*/
12f0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59  .#define TERM_DY
1300: 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20 20  NAMIC    0x01   
1310: 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20  /* Need to call 
1320: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1330: 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a  e(db, pExpr) */.
1340: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52  #define TERM_VIR
1350: 54 55 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f  TUAL    0x02   /
1360: 2a 20 41 64 64 65 64 20 62 79 20 74 68 65 20 6f  * Added by the o
1370: 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f  ptimizer.  Do no
1380: 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e  t code */.#defin
1390: 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20  e TERM_CODED    
13a0: 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73    0x04   /* This
13b0: 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79   term is already
13c0: 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e   coded */.#defin
13d0: 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20  e TERM_COPIED   
13e0: 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20    0x08   /* Has 
13f0: 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69  a child */.#defi
1400: 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20  ne TERM_ORINFO  
1410: 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65 65     0x10   /* Nee
1420: 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68  d to free the Wh
1430: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
1440: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66  o object */.#def
1450: 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  ine TERM_ANDINFO
1460: 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e 65      0x20   /* Ne
1470: 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57  ed to free the W
1480: 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49  hereTerm.u.pAndI
1490: 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69  nfo obj */.#defi
14a0: 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20  ne TERM_OR_OK   
14b0: 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73 65     0x40   /* Use
14c0: 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75  d during OR-clau
14d0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  se processing */
14e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14f0: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 23 20 20 64  NABLE_STAT3.#  d
1500: 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  efine TERM_VNULL
1510: 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20 4d 61      0x80   /* Ma
1520: 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e 55 4c  nufactured x>NUL
1530: 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72  L or x<=NULL ter
1540: 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65  m */.#else.#  de
1550: 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  fine TERM_VNULL 
1560: 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44 69 73     0x00   /* Dis
1570: 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75 73 69  abled if not usi
1580: 6e 67 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64  ng stat3 */.#end
1590: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  if../*.** An ins
15a0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
15b0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
15c0: 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72   holds all infor
15d0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a  mation about a.*
15e0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  * WHERE clause. 
15f0: 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20   Mostly this is 
1600: 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  a container for 
1610: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72  one or more Wher
1620: 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 45 78  eTerms..**.** Ex
1630: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70 4f 75  planation of pOu
1640: 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48 45 52  ter:  For a WHER
1650: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
1660: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
1670: 20 20 20 20 20 61 20 41 4e 44 20 28 28 62 20 41       a AND ((b A
1680: 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e 44 20  ND c) OR (d AND 
1690: 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a 2a 20  e)) AND f.**.** 
16a0: 54 68 65 72 65 20 61 72 65 20 73 65 70 61 72 61  There are separa
16b0: 74 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  te WhereClause o
16c0: 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65 20 77  bjects for the w
16d0: 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e 64 20  hole clause and 
16e0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62 63 6c  for.** the subcl
16f0: 61 75 73 65 73 20 22 28 62 20 41 4e 44 20 63 29  auses "(b AND c)
1700: 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20 65 29  " and "(d AND e)
1710: 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72 20 66  ".  The pOuter f
1720: 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 73  ield of the.** s
1730: 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e 74 73  ubclauses points
1740: 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61   to the WhereCla
1750: 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  use object for t
1760: 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 2e  he whole clause.
1770: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
1780: 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65  Clause {.  Parse
1790: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
17a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
17b0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  r context */.  W
17c0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
17d0: 73 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70 70 69  skSet;  /* Mappi
17e0: 6e 67 20 6f 66 20 74 61 62 6c 65 20 63 75 72 73  ng of table curs
17f0: 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69  or numbers to bi
1800: 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72  tmasks */.  Wher
1810: 65 43 6c 61 75 73 65 20 2a 70 4f 75 74 65 72 3b  eClause *pOuter;
1820: 20 20 20 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f       /* Outer co
1830: 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  njunction */.  u
1840: 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 op;           
1850: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74          /* Split
1860: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41   operator.  TK_A
1870: 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20  ND or TK_OR */. 
1880: 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 3b   u16 wctrlFlags;
1890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
18a0: 68 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45  ht include WHERE
18b0: 5f 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69  _AND_ONLY */.  i
18c0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
18d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18e0: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
18f0: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1900: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1910: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1920: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1930: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1940: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1950: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1960: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1970: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
1980: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
1990: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
19a0: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
19b0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
19c0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
19d0: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
19e0: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
19f0: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
1a00: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
1a10: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
1a20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
1a30: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
1a40: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
1a50: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1a60: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1a70: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1a80: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1a90: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1aa0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1ab0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1ac0: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1ad0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1ae0: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1af0: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1b00: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
1b10: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
1b20: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
1b30: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
1b40: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
1b50: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1b60: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1b70: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1b80: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1b90: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1ba0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1bb0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1bc0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1bd0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1be0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1bf0: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
1c00: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
1c10: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
1c20: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
1c30: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
1c40: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1c50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1c60: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1c70: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1c80: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1c90: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ca0: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1cb0: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1cc0: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1cd0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1ce0: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1cf0: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1d00: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1d10: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1d20: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1d30: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1d40: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1d50: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1d60: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1d70: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1d80: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1d90: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1da0: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1db0: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1dc0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1dd0: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1de0: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1df0: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1e00: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1e10: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1e20: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1e30: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1e40: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1e50: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1e60: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1e70: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1e80: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1e90: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1ea0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1eb0: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1ec0: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1ed0: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1ee0: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1ef0: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1f00: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f10: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1f20: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1f30: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1f40: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1f50: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1f60: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1f70: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1f80: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1f90: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1fa0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1fb0: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1fc0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1fd0: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1fe0: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1ff0: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
2000: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
2010: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
2020: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
2030: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
2040: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
2050: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
2060: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
2070: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
2080: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
2090: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
20a0: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
20b0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
20c0: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
20d0: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
20e0: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
20f0: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
2100: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
2110: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
2120: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
2130: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
2140: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2170: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
2180: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
2190: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
21a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21b0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
21c0: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
21d0: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
21e0: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
21f0: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
2200: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
2210: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
2220: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
2230: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
2240: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
2250: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
2260: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
2270: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
2280: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
2290: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
22a0: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
22b0: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
22c0: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
22d0: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
22e0: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
22f0: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
2300: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
2310: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
2320: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2330: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
2340: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
2350: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
2360: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
2370: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
2380: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
2390: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
23a0: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
23b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
23c0: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
23d0: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
23e0: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
23f0: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
2400: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
2410: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
2420: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
2430: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2440: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
2450: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
2460: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
2470: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
2480: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
2490: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
24a0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
24b0: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
24c0: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
24d0: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
24e0: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
24f0: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
2500: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
2510: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
2520: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
2530: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
2540: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 55 49 56  #define WO_EQUIV
2550: 20 20 30 78 34 30 30 20 20 20 20 20 20 20 2f 2a    0x400       /*
2560: 20 4f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d   Of the form A==
2570: 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20  B, both columns 
2580: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
2590: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
25a0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
25b0: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
25c0: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
25d0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
25e0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
25f0: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2600: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2610: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2620: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2630: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2640: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2650: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2660: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2670: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2680: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
2690: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
26a0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
26b0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
26c0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
26d0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
26e0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
26f0: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2700: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2710: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2720: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2730: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2740: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2750: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2760: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2770: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2780: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
2790: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
27a0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
27b0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
27c0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
27d0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
27e0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
27f0: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2800: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2810: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2820: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2830: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2840: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2850: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2860: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2870: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2880: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
2890: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
28a0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
28b0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
28c0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
28d0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
28e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
28f0: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2900: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2910: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2920: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2930: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2940: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2950: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2960: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2970: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2980: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
2990: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
29a0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
29b0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
29c0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
29d0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
29e0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
29f0: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2a00: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2a10: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2a20: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2a30: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2a40: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2a50: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2a60: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2a70: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2a80: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
2a90: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
2aa0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
2ab0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
2ac0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
2ad0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
2ae0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2af0: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2b00: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2b10: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2b20: 45 20 20 20 20 20 20 30 78 30 38 30 66 31 30 30  E      0x080f100
2b30: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2b40: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2b50: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2b60: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2b70: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2b80: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
2b90: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
2ba0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2bb0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
2bc0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
2bd0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
2be0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2bf0: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2c00: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2c10: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2c20: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2c30: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
2c40: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 34  X_ONLY     0x004
2c50: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
2c60: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
2c70: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
2c80: 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 20 20   WHERE_ORDERED  
2c90: 20 20 20 20 30 78 30 30 38 30 30 30 30 30 20 20      0x00800000  
2ca0: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
2cb0: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
2cc0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2cd0: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
2ce0: 20 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20       0x01000000 
2cf0: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2d00: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2d10: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2d20: 45 20 20 20 20 20 20 20 30 78 30 32 30 30 30 30  E       0x020000
2d30: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2d40: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2d50: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2d60: 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45 20  HERE_ALL_UNIQUE 
2d70: 20 20 30 78 30 34 30 30 30 30 30 30 20 20 2f 2a    0x04000000  /*
2d80: 20 54 68 69 73 20 61 6e 64 20 61 6c 6c 20 70 72   This and all pr
2d90: 69 6f 72 20 68 61 76 65 20 6f 6e 65 20 72 6f 77  ior have one row
2da0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2db0: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30  E_VIRTUALTABLE 0
2dc0: 78 30 38 30 30 30 30 30 30 20 20 2f 2a 20 55 73  x08000000  /* Us
2dd0: 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20  e virtual-table 
2de0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64  processing */.#d
2df0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54  efine WHERE_MULT
2e00: 49 5f 4f 52 20 20 20 20 20 30 78 31 30 30 30 30  I_OR     0x10000
2e10: 30 30 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67  000  /* OR using
2e20: 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65   multiple indice
2e30: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  s */.#define WHE
2e40: 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20  RE_TEMP_INDEX   
2e50: 30 78 32 30 30 30 30 30 30 30 20 20 2f 2a 20 55  0x20000000  /* U
2e60: 73 65 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ses an ephemeral
2e70: 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e   index */.#defin
2e80: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
2e90: 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30 20       0x40000000 
2ea0: 20 2f 2a 20 43 6f 72 72 65 63 74 20 6f 72 64 65   /* Correct orde
2eb0: 72 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a  r for DISTINCT *
2ec0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2ed0: 43 4f 56 45 52 5f 53 43 41 4e 20 20 20 30 78 38  COVER_SCAN   0x8
2ee0: 30 30 30 30 30 30 30 20 20 2f 2a 20 46 75 6c 6c  0000000  /* Full
2ef0: 20 73 63 61 6e 20 6f 66 20 61 20 63 6f 76 65 72   scan of a cover
2f00: 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a  ing index */../*
2f10: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
2f20: 63 6f 6e 74 61 69 6e 73 20 6d 61 6e 79 20 73 65  contains many se
2f30: 70 61 72 61 74 65 20 73 75 62 72 6f 75 74 69 6e  parate subroutin
2f40: 65 73 20 74 68 61 74 20 77 6f 72 6b 20 74 6f 67  es that work tog
2f50: 65 74 68 65 72 20 74 6f 0a 2a 2a 20 66 69 6e 64  ether to.** find
2f60: 20 74 68 65 20 62 65 73 74 20 69 6e 64 69 63 65   the best indice
2f70: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 61 63 63  s to use for acc
2f80: 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75  essing a particu
2f90: 6c 61 72 20 74 61 62 6c 65 20 69 6e 20 61 20 71  lar table in a q
2fa0: 75 65 72 79 2e 0a 2a 2a 20 41 6e 20 69 6e 73 74  uery..** An inst
2fb0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2fc0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2fd0: 68 6f 6c 64 73 20 63 6f 6e 74 65 78 74 20 69 6e  holds context in
2fe0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
2ff0: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 73 65 61  the.** index sea
3000: 72 63 68 20 73 6f 20 74 68 61 74 20 69 74 20 63  rch so that it c
3010: 61 6e 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c  an be more easil
3020: 79 20 70 61 73 73 65 64 20 62 65 74 77 65 65 6e  y passed between
3030: 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20   the various.** 
3040: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 74 79 70  routines..*/.typ
3050: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
3060: 65 42 65 73 74 49 64 78 20 57 68 65 72 65 42 65  eBestIdx WhereBe
3070: 73 74 49 64 78 3b 0a 73 74 72 75 63 74 20 57 68  stIdx;.struct Wh
3080: 65 72 65 42 65 73 74 49 64 78 20 7b 0a 20 20 50  ereBestIdx {.  P
3090: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
30c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
30d0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
30e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
30f0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
3100: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3110: 65 6d 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  em *pSrc;      /
3120: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
3130: 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
3140: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
3150: 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
3160: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3170: 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61   cursors not ava
3180: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 42 69 74 6d  ilable */.  Bitm
3190: 61 73 6b 20 6e 6f 74 56 61 6c 69 64 3b 20 20 20  ask notValid;   
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
31b0: 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c  ursors not avail
31c0: 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72  able for any pur
31d0: 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pose */.  ExprLi
31e0: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
31f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3200: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
3210: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3220: 70 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  pDistinct;      
3230: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 6c        /* The sel
3240: 65 63 74 2d 6c 69 73 74 20 69 66 20 71 75 65 72  ect-list if quer
3250: 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  y is DISTINCT */
3260: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
3270: 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66  _info **ppIdxInf
3280: 6f 3b 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f  o; /* Index info
3290: 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74  rmation passed t
32a0: 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  o xBestIndex */.
32b0: 20 20 69 6e 74 20 69 2c 20 6e 3b 20 20 20 20 20    int i, n;     
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 20 2f 2a 20 57 68 69 63 68 20 6c 6f 6f 70 20    /* Which loop 
32e0: 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 3b 20  is being coded; 
32f0: 23 20 6f 66 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  # of loops */.  
3300: 57 68 65 72 65 4c 65 76 65 6c 20 2a 61 4c 65 76  WhereLevel *aLev
3310: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
3320: 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6f 75  /* Info about ou
3330: 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 57  ter loops */.  W
3340: 68 65 72 65 43 6f 73 74 20 63 6f 73 74 3b 20 20  hereCost cost;  
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3360: 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75  * Lowest cost qu
3370: 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a  ery plan */.};..
3380: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
3390: 45 20 69 66 20 74 68 65 20 70 72 6f 62 65 20 63  E if the probe c
33a0: 6f 73 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ost is less than
33b0: 20 74 68 65 20 62 61 73 65 6c 69 6e 65 20 63 6f   the baseline co
33c0: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  st.*/.static int
33d0: 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 63 6f 6e   compareCost(con
33e0: 73 74 20 57 68 65 72 65 43 6f 73 74 20 2a 70 50  st WhereCost *pP
33f0: 72 6f 62 65 2c 20 63 6f 6e 73 74 20 57 68 65 72  robe, const Wher
3400: 65 43 6f 73 74 20 2a 70 42 61 73 65 6c 69 6e 65  eCost *pBaseline
3410: 29 7b 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d  ){.  if( pProbe-
3420: 3e 72 43 6f 73 74 3c 70 42 61 73 65 6c 69 6e 65  >rCost<pBaseline
3430: 2d 3e 72 43 6f 73 74 20 29 20 72 65 74 75 72 6e  ->rCost ) return
3440: 20 31 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65   1;.  if( pProbe
3450: 2d 3e 72 43 6f 73 74 3e 70 42 61 73 65 6c 69 6e  ->rCost>pBaselin
3460: 65 2d 3e 72 43 6f 73 74 20 29 20 72 65 74 75 72  e->rCost ) retur
3470: 6e 20 30 3b 0a 20 20 69 66 28 20 70 50 72 6f 62  n 0;.  if( pProb
3480: 65 2d 3e 70 6c 61 6e 2e 6e 4f 42 53 61 74 3e 70  e->plan.nOBSat>p
3490: 42 61 73 65 6c 69 6e 65 2d 3e 70 6c 61 6e 2e 6e  Baseline->plan.n
34a0: 4f 42 53 61 74 20 29 20 72 65 74 75 72 6e 20 31  OBSat ) return 1
34b0: 3b 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  ;.  if( pProbe->
34c0: 70 6c 61 6e 2e 6e 52 6f 77 3c 70 42 61 73 65 6c  plan.nRow<pBasel
34d0: 69 6e 65 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 29  ine->plan.nRow )
34e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
34f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
3500: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65  Initialize a pre
3510: 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43  allocated WhereC
3520: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
3530: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3540: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
3550: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
3560: 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  pWC,        /* T
3570: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  he WhereClause t
3580: 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  o be initialized
3590: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
35a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
35b0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
35c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
35d0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
35e0: 74 2c 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  t,  /* Mapping f
35f0: 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72  rom table cursor
3600: 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d   numbers to bitm
3610: 61 73 6b 73 20 2a 2f 0a 20 20 75 31 36 20 77 63  asks */.  u16 wc
3620: 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
3630: 20 20 20 2f 2a 20 4d 69 67 68 74 20 69 6e 63 6c     /* Might incl
3640: 75 64 65 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  ude WHERE_AND_ON
3650: 4c 59 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e  LY */.){.  pWC->
3660: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
3670: 0a 20 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  .  pWC->pMaskSet
3680: 20 3d 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70   = pMaskSet;.  p
3690: 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a  WC->pOuter = 0;.
36a0: 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30    pWC->nTerm = 0
36b0: 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d  ;.  pWC->nSlot =
36c0: 20 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e   ArraySize(pWC->
36d0: 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d  aStatic);.  pWC-
36e0: 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69  >a = pWC->aStati
36f0: 63 3b 0a 20 20 70 57 43 2d 3e 77 63 74 72 6c 46  c;.  pWC->wctrlF
3700: 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
3710: 73 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  s;.}../* Forward
3720: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
3730: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
3740: 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65  lauseClear(Where
3750: 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  Clause*);../*.**
3760: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20   Deallocate all 
3770: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
3780: 64 20 77 69 74 68 20 61 20 57 68 65 72 65 4f 72  d with a WhereOr
3790: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
37a0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
37b0: 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71  eOrInfoDelete(sq
37c0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
37d0: 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  OrInfo *p){.  wh
37e0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
37f0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
3800: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
3810: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
3820: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
3830: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
3840: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62   WhereAndInfo ob
3850: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
3860: 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66  void whereAndInf
3870: 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  oDelete(sqlite3 
3880: 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66  *db, WhereAndInf
3890: 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c  o *p){.  whereCl
38a0: 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63  auseClear(&p->wc
38b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
38c0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
38d0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
38e0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
38f0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65  ucture.  The Whe
3900: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
3910: 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20  re.** itself is 
3920: 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73  not freed.  This
3930: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
3940: 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72 65  inverse of where
3950: 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f  ClauseInit()..*/
3960: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
3970: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68  reClauseClear(Wh
3980: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
3990: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
39a0: 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69  eTerm *a;.  sqli
39b0: 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70  te3 *db = pWC->p
39c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72  Parse->db;.  for
39d0: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c  (i=pWC->nTerm-1,
39e0: 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b   a=pWC->a; i>=0;
39f0: 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20   i--, a++){.    
3a00: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
3a10: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
3a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3a30: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  prDelete(db, a->
3a40: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
3a50: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
3a60: 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
3a70: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49  {.      whereOrI
3a80: 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  nfoDelete(db, a-
3a90: 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20  >u.pOrInfo);.   
3aa0: 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74   }else if( a->wt
3ab0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44  Flags & TERM_AND
3ac0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
3ad0: 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65  ereAndInfoDelete
3ae0: 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e  (db, a->u.pAndIn
3af0: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  fo);.    }.  }. 
3b00: 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43   if( pWC->a!=pWC
3b10: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
3b20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3b30: 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a  b, pWC->a);.  }.
3b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
3b50: 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54  ingle new WhereT
3b60: 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65  erm entry to the
3b70: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
3b80: 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20  ect pWC..** The 
3b90: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62  new WhereTerm ob
3ba0: 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63  ject is construc
3bb0: 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20  ted from Expr p 
3bc0: 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73  and with wtFlags
3bd0: 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  ..** The index i
3be0: 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68  n pWC->a[] of th
3bf0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
3c00: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
3c10: 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20  uccess..** 0 is 
3c20: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
3c30: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f  new WhereTerm co
3c40: 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64  uld not be added
3c50: 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79   due to a memory
3c60: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  .** allocation e
3c70: 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72  rror.  The memor
3c80: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
3c90: 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63  lure will be rec
3ca0: 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  orded in.** the 
3cb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3cc0: 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69   flag so that hi
3cd0: 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74  gher-level funct
3ce0: 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20  ions can detect 
3cf0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  it..**.** This r
3d00: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72  outine will incr
3d10: 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
3d20: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
3d30: 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
3d40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
3d50: 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20  tFlags argument 
3d60: 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59  includes TERM_DY
3d70: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70  NAMIC, then resp
3d80: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f  onsibility.** fo
3d90: 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78  r freeing the ex
3da0: 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73  pression p is as
3db0: 73 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65  sumed by the Whe
3dc0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
3dd0: 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  pWC..** This is 
3de0: 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69  true even if thi
3df0: 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
3e00: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
3e10: 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  w WhereTerm..**.
3e20: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69  ** WARNING:  Thi
3e30: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
3e40: 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  reallocate the s
3e50: 70 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f  pace used to sto
3e60: 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73  re.** WhereTerms
3e70: 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20  .  All pointers 
3e80: 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68  to WhereTerms sh
3e90: 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61  ould be invalida
3ea0: 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c  ted after.** cal
3eb0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
3ec0: 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72  e.  Such pointer
3ed0: 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69  s may be reiniti
3ee0: 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65  alized by refere
3ef0: 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43  ncing.** the pWC
3f00: 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ->a[] array..*/.
3f10: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
3f20: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65  ClauseInsert(Whe
3f30: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
3f40: 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61  xpr *p, u8 wtFla
3f50: 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  gs){.  WhereTerm
3f60: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
3f70: 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  dx;.  testcase( 
3f80: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
3f90: 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 45 56  IRTUAL );  /* EV
3fa0: 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 20  : R-00211-15100 
3fb0: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  */.  if( pWC->nT
3fc0: 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20  erm>=pWC->nSlot 
3fd0: 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
3fe0: 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b   *pOld = pWC->a;
3ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4000: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e   = pWC->pParse->
4010: 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d  db;.    pWC->a =
4020: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
4030: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  Raw(db, sizeof(p
4040: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
4050: 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66  Slot*2 );.    if
4060: 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20  ( pWC->a==0 ){. 
4070: 20 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73       if( wtFlags
4080: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
4090: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
40a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
40b0: 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   p);.      }.   
40c0: 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64     pWC->a = pOld
40d0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
40e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
40f0: 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c  py(pWC->a, pOld,
4100: 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30   sizeof(pWC->a[0
4110: 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a  ])*pWC->nTerm);.
4120: 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57      if( pOld!=pW
4130: 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20  C->aStatic ){.  
4140: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4150: 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20  e(db, pOld);.   
4160: 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f   }.    pWC->nSlo
4170: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
4180: 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d  locSize(db, pWC-
4190: 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e  >a)/sizeof(pWC->
41a0: 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65  a[0]);.  }.  pTe
41b0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
41c0: 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d   = pWC->nTerm++]
41d0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  ;.  pTerm->pExpr
41e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
41f0: 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20  ipCollate(p);.  
4200: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d  pTerm->wtFlags =
4210: 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72   wtFlags;.  pTer
4220: 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  m->pWC = pWC;.  
4230: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
4240: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64   -1;.  return id
4250: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  x;.}../*.** This
4260: 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66   routine identif
4270: 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f  ies subexpressio
4280: 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ns in the WHERE 
4290: 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20  clause where.** 
42a0: 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
42b0: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
42c0: 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61  by the AND opera
42d0: 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  tor or some othe
42e0: 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70  r.** operator sp
42f0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f  ecified in the o
4300: 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68  p parameter.  Th
4310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
4320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69  ructure.** is fi
4330: 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65  lled with pointe
4340: 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73  rs to subexpress
4350: 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ions.  For examp
4360: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45  le:.**.**    WHE
4370: 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41  RE  a=='hello' A
4380: 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31  ND coalesce(b,11
4390: 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d  )<10 AND (c+12!=
43a0: 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20  d OR c==22).**  
43b0: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
43c0: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
43d0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
43e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
43f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73  .**            s
4400: 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20  lot[0]          
4410: 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20    slot[1]       
4420: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a          slot[2].
4430: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
4440: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
4450: 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c  in pExpr is unal
4460: 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73  tered.  All this
4470: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
4480: 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20   is make slot[] 
4490: 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f  entries point to
44a0: 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69   substructure wi
44b0: 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a  thin pExpr..**.*
44c0: 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75  * In the previou
44d0: 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69  s sentence and i
44e0: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22  n the diagram, "
44f0: 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74  slot[]" refers t
4500: 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c  o.** the WhereCl
4510: 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20  ause.a[] array. 
4520: 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61   The slot[] arra
4530: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65  y grows as neede
4540: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  d to contain.** 
4550: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
4560: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
4570: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
4580: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c  ereSplit(WhereCl
4590: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
45a0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b  *pExpr, int op){
45b0: 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38  .  pWC->op = (u8
45c0: 29 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72  )op;.  if( pExpr
45d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
45e0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f  if( pExpr->op!=o
45f0: 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  p ){.    whereCl
4600: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
4610: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c  pExpr, 0);.  }el
4620: 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  se{.    whereSpl
4630: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
4640: 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77  Left, op);.    w
4650: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
4660: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
4670: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4680: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78  Initialize an ex
4690: 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
46a0: 74 20 28 61 20 57 68 65 72 65 4d 61 73 6b 53 65  t (a WhereMaskSe
46b0: 74 20 6f 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65  t object).*/.#de
46c0: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
46d0: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
46e0: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
46f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4700: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
4710: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
4720: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
4730: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
4740: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
4750: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
4760: 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d  k getMask(WhereM
4770: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4780: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
4790: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
47a0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d  t( pMaskSet->n<=
47b0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d  (int)sizeof(Bitm
47c0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
47d0: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
47e0: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
47f0: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
4800: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
4810: 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74      return ((Bit
4820: 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20  mask)1)<<i;.    
4830: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
4840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
4850: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
4860: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
4870: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
4880: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
4890: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
48a0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
48b0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
48c0: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
48d0: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
48e0: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
48f0: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
4900: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
4910: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
4920: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
4930: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
4940: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
4950: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
4960: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
4970: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
4980: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
4990: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
49a0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
49b0: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
49c0: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
49d0: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
49e0: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
49f0: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sor;.}../*.** Th
4a00: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
4a10: 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61   (recursively) a
4a20: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
4a30: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a  e and generates.
4a40: 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64  ** a bitmask ind
4a50: 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61  icating which ta
4a60: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  bles are used in
4a70: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
4a80: 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  .** tree..**.** 
4a90: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  In order for thi
4aa0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72  s routine to wor
4ab0: 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  k, the calling f
4ac0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76  unction must hav
4ad0: 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  e.** previously 
4ae0: 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52  invoked sqlite3R
4af0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4b00: 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  ) on the express
4b10: 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65  ion.  See.** the
4b20: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
4b30: 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
4b40: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
4b50: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54  nformation..** T
4b60: 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  he sqlite3Resolv
4b70: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75  eExprNames() rou
4b80: 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20  tines looks for 
4b90: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
4ba0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f  .** sets their o
4bb0: 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c  pcodes to TK_COL
4bc0: 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78  UMN and their Ex
4bd0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
4be0: 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   to.** the VDBE 
4bf0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
4c00: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
4c10: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68  s routine just h
4c20: 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61  as to.** transla
4c30: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
4c40: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61  mbers into bitma
4c50: 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52  sk values and OR
4c60: 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d   all.** the bitm
4c70: 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  asks together..*
4c80: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
4c90: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4ca0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
4cb0: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
4cc0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
4cd0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
4ce0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
4cf0: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
4d00: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
4d10: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4d20: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4d30: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
4d40: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
4d50: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4d60: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
4d70: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
4d80: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
4d90: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
4da0: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
4db0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
4dc0: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
4dd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4de0: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
4df0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4e00: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4e10: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
4e20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4e30: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
4e40: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
4e50: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
4e60: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4e70: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
4e80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
4e90: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
4ea0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4eb0: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
4ec0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
4ed0: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
4ee0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
4ef0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
4f00: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
4f10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
4f20: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
4f30: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
4f40: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
4f50: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
4f60: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4f70: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4f80: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4f90: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
4fa0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
4fb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
4fc0: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
4fd0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
4fe0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4ff0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
5000: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
5010: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
5020: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
5030: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
5040: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
5050: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
5060: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
5070: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
5080: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
5090: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
50a0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
50b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
50c0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
50d0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
50e0: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
50f0: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
5100: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
5110: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
5120: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
5130: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
5140: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
5150: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
5160: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
5170: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
5180: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
5190: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
51a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
51b0: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
51c0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
51d0: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
51e0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
51f0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
5200: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
5210: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
5220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5230: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
5240: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
5250: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
5260: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5270: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
5280: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
5290: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
52a0: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
52b0: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
52c0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
52d0: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
52e0: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
52f0: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
5300: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
5310: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45  IN"..**.** IMPLE
5320: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
5330: 35 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62  59926-26393 To b
5340: 65 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69  e usable by an i
5350: 6e 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74  ndex a term must
5360: 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66   be.** of one of
5370: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
5380: 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65  orms: column = e
5390: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
53a0: 20 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a   > expression.**
53b0: 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65   column >= expre
53c0: 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65  ssion column < e
53d0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
53e0: 20 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   <= expression.*
53f0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63  * expression = c
5400: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
5410: 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73   > column expres
5420: 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a  sion >= column.*
5430: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63  * expression < c
5440: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
5450: 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d   <= column colum
5460: 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73  n IN.** (express
5470: 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e  ion-list) column
5480: 20 49 4e 20 28 73 75 62 71 75 65 72 79 29 20 63   IN (subquery) c
5490: 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f  olumn IS NULL.*/
54a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
54b0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
54c0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
54d0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
54e0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
54f0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
5500: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
5510: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
5520: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
5530: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
5540: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
5550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
5560: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
5570: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
5580: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
5590: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
55a0: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
55b0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
55c0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
55d0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
55e0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
55f0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
5600: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
5610: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
5620: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
5630: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
5640: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
5650: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
5660: 74 2f 72 69 67 68 74 20 70 72 65 63 65 6e 64 65  t/right precende
5670: 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69  nce rules come i
5680: 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65  nto play when de
5690: 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  termining the.**
56a0: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 69   collating.** si
56b0: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
56c0: 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73  ison, it remains
56d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
56e0: 20 74 68 65 20 73 61 6d 65 20 73 69 64 65 20 61   the same side a
56f0: 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d  fter.** the comm
5700: 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63  utation. So "Y c
5710: 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70  ollate NOCASE op
5720: 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20   X" becomes .** 
5730: 22 58 20 6f 70 20 59 22 2e 20 54 68 69 73 20 69  "X op Y". This i
5740: 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f  s because any co
5750: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
5760: 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20   on.** the left 
5770: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63  hand side of a c
5780: 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69  omparison overri
5790: 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  des any collatio
57a0: 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61  n sequence .** a
57b0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72  ttached to the r
57c0: 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61  ight. For the sa
57d0: 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50  me reason the EP
57e0: 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a  _Collate flag.**
57f0: 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64   is not commuted
5800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5810: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72   exprCommute(Par
5820: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5830: 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20   *pExpr){.  u16 
5840: 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70  expRight = (pExp
5850: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
5860: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a   & EP_Collate);.
5870: 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20    u16 expLeft = 
5880: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66  (pExpr->pLeft->f
5890: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
58a0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c  e);.  assert( al
58b0: 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f  lowedOp(pExpr->o
58c0: 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21  p) && pExpr->op!
58d0: 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28 20  =TK_IN );.  if( 
58e0: 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c 65 66  expRight==expLef
58f0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  t ){.    /* Eith
5900: 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74 68 20  er X and Y both 
5910: 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65  have COLLATE ope
5920: 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68 65 72  rator or neither
5930: 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20 65   do */.    if( e
5940: 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  xpRight ){.     
5950: 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64 20 59   /* Both X and Y
5960: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
5970: 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20 73  erators.  Make s
5980: 75 72 65 20 58 20 69 73 20 61 6c 77 61 79 73 0a  ure X is always.
5990: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79        ** used by
59a0: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 45 50   clearing the EP
59b0: 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66 72  _Collate flag fr
59c0: 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20 70  om Y. */.      p
59d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
59e0: 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61  ags &= ~EP_Colla
59f0: 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  te;.    }else if
5a00: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  ( sqlite3ExprCol
5a10: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
5a20: 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
5a30: 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  .      /* Neithe
5a40: 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65 20 43  r X nor Y have C
5a50: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
5a60: 2c 20 62 75 74 20 58 20 68 61 73 20 61 20 6e 6f  , but X has a no
5a70: 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20 20 20  n-default.      
5a80: 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ** collating seq
5a90: 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64 20 74  uence.  So add t
5aa0: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d 61  he EP_Collate ma
5ab0: 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63 61 75  rker on X to cau
5ac0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 74  se.      ** it t
5ad0: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 66 69  o be searched fi
5ae0: 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45  rst. */.      pE
5af0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
5b00: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b  s |= EP_Collate;
5b10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57 41  .    }.  }.  SWA
5b20: 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70  P(Expr*,pExpr->p
5b30: 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65  Right,pExpr->pLe
5b40: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
5b50: 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op>=TK_GT ){. 
5b60: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
5b70: 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20  ==TK_GT+2 );.   
5b80: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
5b90: 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61  TK_LE+2 );.    a
5ba0: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
5bb0: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
5bc0: 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b  ( TK_GT<TK_LE );
5bd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
5be0: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26  pr->op>=TK_GT &&
5bf0: 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47   pExpr->op<=TK_G
5c00: 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  E );.    pExpr->
5c10: 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
5c20: 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54  -TK_GT)^2)+TK_GT
5c30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
5c40: 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b  ranslate from TK
5c50: 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  _xx operator to 
5c60: 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a  WO_xx bitmask..*
5c70: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70 65  /.static u16 ope
5c80: 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70  ratorMask(int op
5c90: 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73  ){.  u16 c;.  as
5ca0: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
5cb0: 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d  op) );.  if( op=
5cc0: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20  =TK_IN ){.    c 
5cd0: 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65  = WO_IN;.  }else
5ce0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
5cf0: 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  LL ){.    c = WO
5d00: 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  _ISNULL;.  }else
5d10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57  {.    assert( (W
5d20: 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29  O_EQ<<(op-TK_EQ)
5d30: 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20  ) < 0x7fff );.  
5d40: 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45    c = (u16)(WO_E
5d50: 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a  Q<<(op-TK_EQ));.
5d60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70    }.  assert( op
5d70: 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63  !=TK_ISNULL || c
5d80: 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
5d90: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5da0: 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29  IN || c==WO_IN )
5db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
5dc0: 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45  TK_EQ || c==WO_E
5dd0: 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  Q );.  assert( o
5de0: 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57  p!=TK_LT || c==W
5df0: 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_LT );.  assert
5e00: 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63  ( op!=TK_LE || c
5e10: 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73  ==WO_LE );.  ass
5e20: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c  ert( op!=TK_GT |
5e30: 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20  | c==WO_GT );.  
5e40: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47  assert( op!=TK_G
5e50: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b  E || c==WO_GE );
5e60: 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
5e70: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
5e80: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
5e90: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
5ea0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
5eb0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
5ec0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
5ed0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
5ee0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
5ef0: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
5f00: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
5f10: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
5f20: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
5f30: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
5f40: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
5f50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
5f60: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
5f70: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
5f80: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74  .** The term ret
5f90: 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59  urned might by Y
5fa0: 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65  =<expr> if there
5fb0: 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73   is another cons
5fc0: 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  traint in.** the
5fd0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
5fe0: 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61  at specifies tha
5ff0: 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68  t X=Y.  Any such
6000: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c   constraints wil
6010: 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69  l be.** identifi
6020: 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55  ed by the WO_EQU
6030: 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54  IV bit in the pT
6040: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66  erm->eOperator f
6050: 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45  ield.  The.** aE
6060: 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c  quiv[] array hol
6070: 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73  ds X and all its
6080: 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69   equivalents, wi
6090: 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69  th each SQL vari
60a0: 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75  able.** taking u
60b0: 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61  p two slots in a
60c0: 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69  Equiv[].  The fi
60d0: 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20  rst slot is for 
60e0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
60f0: 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63  r.** and the sec
6100: 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63  ond is for the c
6110: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54  olumn number.  T
6120: 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74  here are 22 slot
6130: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a  s in aEquiv[].**
6140: 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77   so that means w
6150: 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58  e can look for X
6160: 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f   plus up to 10 o
6170: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ther equivalent 
6180: 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65  values..** Hence
6190: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20   a search for X 
61a0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70  will return <exp
61b0: 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41  r> if X=A1 and A
61c0: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a  1=A2 and A2=A3.*
61d0: 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39  * and ... and A9
61e0: 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78  =A10 and A10=<ex
61f0: 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pr>..**.** If th
6200: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
6210: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
6220: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
6230: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
6240: 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74  expr>".** then t
6250: 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77  ry for the one w
6260: 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63  ith no dependenc
6270: 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20  ies on <expr> - 
6280: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77  in other words w
6290: 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69  here.** <expr> i
62a0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  s a constant exp
62b0: 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  ression of some 
62c0: 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75  kind.  Only retu
62d0: 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a  rn entries of.**
62e0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
62f0: 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20  > Y" where Y is 
6300: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74  a column in anot
6310: 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20  her table if no 
6320: 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20  terms of.** the 
6330: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f  form "X <op> <co
6340: 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74  nst-expr>" exist
6350: 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20  .   If no terms 
6360: 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
6370: 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72  RHS.** exist, tr
6380: 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65  y to return a te
6390: 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  rm that does not
63a0: 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a   use WO_EQUIV..*
63b0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
63c0: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
63d0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
63e0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
63f0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
6400: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
6410: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
6420: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
6430: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
6440: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
6450: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
6460: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
6470: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
6480: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
6490: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
64a0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
64b0: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
64d0: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
64e0: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
64f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
6500: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
6510: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
6520: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
6530: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
6540: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
6550: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
6560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
6570: 72 6d 20 62 65 69 6e 67 20 65 78 61 6d 69 6e 65  rm being examine
6580: 64 20 61 73 20 70 6f 73 73 69 62 6c 65 20 72 65  d as possible re
6590: 73 75 6c 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  sult */.  WhereT
65a0: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
65b0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  ;      /* The an
65c0: 73 77 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a  swer to return *
65d0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
65e0: 2a 70 57 43 4f 72 69 67 20 3d 20 70 57 43 3b 20  *pWCOrig = pWC; 
65f0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 57 43   /* Original pWC
6600: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
6610: 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
6620: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
6630: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 45   counters */.  E
6640: 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
6650: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
6660: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
6670: 69 6f 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ion */.  Parse *
6680: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
6690: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
66a0: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  text */.  int iO
66b0: 72 69 67 43 6f 6c 20 3d 20 69 43 6f 6c 75 6d 6e  rigCol = iColumn
66c0: 3b 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76  ;  /* Original v
66d0: 61 6c 75 65 20 6f 66 20 69 43 6f 6c 75 6d 6e 20  alue of iColumn 
66e0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 75 69 76 20  */.  int nEquiv 
66f0: 3d 20 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 2;          /*
6700: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 69 72   Number of entir
6710: 65 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a  es in aEquiv[] *
6720: 2f 0a 20 20 69 6e 74 20 69 45 71 75 69 76 20 3d  /.  int iEquiv =
6730: 20 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   2;          /* 
6740: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
6750: 73 20 6f 66 20 61 45 71 75 69 76 5b 5d 20 70 72  s of aEquiv[] pr
6760: 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 20 2a  ocessed so far *
6770: 2f 0a 20 20 69 6e 74 20 61 45 71 75 69 76 5b 32  /.  int aEquiv[2
6780: 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2];          /* 
6790: 69 43 75 72 2c 69 43 6f 6c 75 6d 6e 20 61 6e 64  iCur,iColumn and
67a0: 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20   up to 10 other 
67b0: 65 71 75 69 76 61 6c 65 6e 74 73 20 2a 2f 0a 0a  equivalents */..
67c0: 20 20 61 73 73 65 72 74 28 20 69 43 75 72 3e 3d    assert( iCur>=
67d0: 30 20 29 3b 0a 20 20 61 45 71 75 69 76 5b 30 5d  0 );.  aEquiv[0]
67e0: 20 3d 20 69 43 75 72 3b 0a 20 20 61 45 71 75 69   = iCur;.  aEqui
67f0: 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a  v[1] = iColumn;.
6800: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 66    for(;;){.    f
6810: 6f 72 28 70 57 43 3d 70 57 43 4f 72 69 67 3b 20  or(pWC=pWCOrig; 
6820: 70 57 43 3b 20 70 57 43 3d 70 57 43 2d 3e 70 4f  pWC; pWC=pWC->pO
6830: 75 74 65 72 29 7b 0a 20 20 20 20 20 20 66 6f 72  uter){.      for
6840: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b  (pTerm=pWC->a, k
6850: 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20  =pWC->nTerm; k; 
6860: 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k--, pTerm++){. 
6870: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
6880: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
6890: 75 72 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ur.          && 
68a0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
68b0: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
68c0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
68d0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
68e0: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
68f0: 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20  eady)==0.       
6900: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
6910: 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 20 26 20  Operator & op & 
6920: 57 4f 5f 41 4c 4c 29 21 3d 30 0a 20 20 20 20 20  WO_ALL)!=0.     
6930: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
6940: 20 20 20 20 69 66 28 20 69 4f 72 69 67 43 6f 6c      if( iOrigCol
6950: 3e 3d 30 20 26 26 20 70 49 64 78 20 26 26 20 28  >=0 && pIdx && (
6960: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
6970: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30   & WO_ISNULL)==0
6980: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6990: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
69a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
69b0: 63 68 61 72 20 69 64 78 61 66 66 3b 0a 20 20 20  char idxaff;.   
69c0: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
69d0: 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pX = pTerm->pE
69e0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
69f0: 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 43 2d     pParse = pWC-
6a00: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
6a10: 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20         idxaff = 
6a20: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
6a30: 6f 6c 5b 69 4f 72 69 67 43 6f 6c 5d 2e 61 66 66  ol[iOrigCol].aff
6a40: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20  inity;.         
6a50: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
6a60: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
6a70: 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 7b 0a  (pX, idxaff) ){.
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6aa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
6ac0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
6ad0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
6ae0: 6e 63 65 20 72 65 71 75 69 72 65 64 20 66 72 6f  nce required fro
6af0: 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20  m an index for. 
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
6b10: 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  it to be useful 
6b20: 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20 65  for optimising e
6b30: 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53 74  xpression pX. St
6b40: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20 20  ore this.       
6b50: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
6b60: 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c  in variable pCol
6b70: 6c 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l..             
6b80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6b90: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
6ba0: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ft);.           
6bb0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
6bc0: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
6bd0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 70 58  ollSeq(pParse,pX
6be0: 2d 3e 70 4c 65 66 74 2c 70 58 2d 3e 70 52 69 67  ->pLeft,pX->pRig
6bf0: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
6c00: 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
6c10: 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ) pColl = pParse
6c20: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
6c30: 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20  .      .        
6c40: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70        for(j=0; p
6c50: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
6c60: 21 3d 69 4f 72 69 67 43 6f 6c 3b 20 6a 2b 2b 29  !=iOrigCol; j++)
6c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6c80: 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70    if( NEVER(j>=p
6c90: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
6ca0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6cb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6cc0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6cd0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
6ce0: 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
6cf0: 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20  zColl[j]) ){.   
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
6d10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
6d20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6d30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
6d40: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
6d50: 65 71 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20  eqRight==0 ){.  
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65 73              pRes
6d70: 75 6c 74 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ult = pTerm;.   
6d80: 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
6d90: 66 69 6e 64 54 65 72 6d 5f 73 75 63 63 65 73 73  findTerm_success
6da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
6db0: 6c 73 65 20 69 66 28 20 70 52 65 73 75 6c 74 3d  lse if( pResult=
6dc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6dd0: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 70 54      pResult = pT
6de0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  erm;.           
6df0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
6e00: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
6e10: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
6e20: 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a 20 20   WO_EQUIV)!=0.  
6e30: 20 20 20 20 20 20 20 20 20 26 26 20 6e 45 71 75           && nEqu
6e40: 69 76 3c 41 72 72 61 79 53 69 7a 65 28 61 45 71  iv<ArraySize(aEq
6e50: 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20 29  uiv).          )
6e60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 58  {.            pX
6e70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
6e80: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
6e90: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
6ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
6eb0: 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
6ec0: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
6ed0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
6ee0: 3c 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a  <nEquiv; j+=2){.
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6f00: 28 20 61 45 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d  ( aEquiv[j]==pX-
6f10: 3e 69 54 61 62 6c 65 20 26 26 20 61 45 71 75 69  >iTable && aEqui
6f20: 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c  v[j+1]==pX->iCol
6f30: 75 6d 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  umn ) break;.   
6f40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6f50: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
6f60: 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20  quiv ){.        
6f70: 20 20 20 20 20 20 61 45 71 75 69 76 5b 6a 5d 20        aEquiv[j] 
6f80: 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pX->iTable;.  
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 61 45 71 75              aEqu
6fa0: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
6fb0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
6fc0: 20 20 20 20 20 6e 45 71 75 69 76 20 2b 3d 20 32       nEquiv += 2
6fd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6fe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7000: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 45 71 75    }.    if( iEqu
7010: 69 76 3e 3d 6e 45 71 75 69 76 20 29 20 62 72 65  iv>=nEquiv ) bre
7020: 61 6b 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 61  ak;.    iCur = a
7030: 45 71 75 69 76 5b 69 45 71 75 69 76 2b 2b 5d 3b  Equiv[iEquiv++];
7040: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 61  .    iColumn = a
7050: 45 71 75 69 76 5b 69 45 71 75 69 76 2b 2b 5d 3b  Equiv[iEquiv++];
7060: 0a 20 20 7d 0a 66 69 6e 64 54 65 72 6d 5f 73 75  .  }.findTerm_su
7070: 63 63 65 73 73 3a 0a 20 20 72 65 74 75 72 6e 20  ccess:.  return 
7080: 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46  pResult;.}../* F
7090: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
70a0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
70b0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
70c0: 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73  ist*, WhereClaus
70d0: 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  e*, int);../*.**
70e0: 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a   Call exprAnalyz
70f0: 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69  e on all terms i
7100: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
7110: 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61  .  .**.**.*/.sta
7120: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
7130: 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69  lyzeAll(.  SrcLi
7140: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
7150: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
7160: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
7170: 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20  eClause *pWC    
7180: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
7190: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61  E clause to be a
71a0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
71b0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
71c0: 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  WC->nTerm-1; i>=
71d0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70  0; i--){.    exp
71e0: 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
71f0: 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a  t, pWC, i);.  }.
7200: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7210: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
7220: 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43  MIZATION./*.** C
7230: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
7240: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
7250: 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72  ion is a LIKE or
7260: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74   GLOB operator t
7270: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70  hat.** can be op
7280: 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e  timized using in
7290: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
72a0: 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52  ints.  Return TR
72b0: 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73  UE if it is.** s
72c0: 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  o and false if n
72d0: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  ot..**.** In ord
72e0: 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  er for the opera
72f0: 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69  tor to be optimi
7300: 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d  zible, the RHS m
7310: 75 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a  ust be a string.
7320: 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ** literal that 
7330: 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77  does not begin w
7340: 69 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20  ith a wildcard. 
7350: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
7360: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20  isLikeOrGlob(.  
7370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7380: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
7390: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
73a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
73b0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
73c0: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
73d0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  ression */.  Exp
73e0: 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f  r **ppPrefix,  /
73f0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f  * Pointer to TK_
7400: 53 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f  STRING expressio
7410: 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70  n with pattern p
7420: 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a  refix */.  int *
7430: 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20  pisComplete, /* 
7440: 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79  True if the only
7450: 20 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69   wildcard is % i
7460: 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  n the last chara
7470: 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cter */.  int *p
7480: 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54  noCase      /* T
7490: 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65  rue if uppercase
74a0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
74b0: 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29  o lowercase */.)
74c0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
74d0: 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  z = 0;         /
74e0: 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20  * String on RHS 
74f0: 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  of LIKE operator
7500: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
7510: 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  ht, *pLeft;     
7520: 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65   /* Right and le
7530: 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20  ft size of LIKE 
7540: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78  operator */.  Ex
7550: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
7560: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
7570: 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20   of operands to 
7580: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
7590: 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20  r */.  int c;   
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74    /* One charact
75c0: 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69  er in z[] */.  i
75d0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
75e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
75f0: 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63  ber of non-wildc
7600: 61 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61  ard prefix chara
7610: 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20  cters */.  char 
7620: 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  wc[3];          
7630: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
7640: 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  d characters */.
7650: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7660: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
7670: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
7680: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
7690: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30  _value *pVal = 0
76a0: 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  ;.  int op;     
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
76c0: 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67  * Opcode of pRig
76d0: 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71  ht */..  if( !sq
76e0: 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74  lite3IsLikeFunct
76f0: 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70  ion(db, pExpr, p
7700: 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20  noCase, wc) ){. 
7710: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7730: 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f  BCDIC.  if( *pno
7740: 43 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b  Case ) return 0;
7750: 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20  .#endif.  pList 
7760: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
7770: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73  ;.  pLeft = pLis
7780: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
7790: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d   if( pLeft->op!=
77a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c  TK_COLUMN .   ||
77b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
77c0: 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c  nity(pLeft)!=SQL
77d0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20  ITE_AFF_TEXT .  
77e0: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c   || IsVirtual(pL
77f0: 65 66 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a  eft->pTab).  ){.
7800: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32      /* IMP: R-02
7810: 30 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65  065-49465 The le
7820: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
7830: 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  the LIKE or GLOB
7840: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20   operator must. 
7850: 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d     ** be the nam
7860: 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  e of an indexed 
7870: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54  column with TEXT
7880: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
7890: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
78a0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d    assert( pLeft-
78b0: 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29  >iColumn!=(-1) )
78c0: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b  ; /* Because IPK
78d0: 20 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f 54   never has AFF_T
78e0: 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74  EXT */..  pRight
78f0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70   = pList->a[0].p
7900: 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69  Expr;.  op = pRi
7910: 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  ght->op;.  if( o
7920: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
7930: 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68  {.    op = pRigh
7940: 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66  t->op2;.  }.  if
7950: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
7960: 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70  E ){.    Vdbe *p
7970: 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72  Reprepare = pPar
7980: 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a  se->pReprepare;.
7990: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
79a0: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  Right->iColumn;.
79b0: 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
79c0: 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 70  e3VdbeGetValue(p
79d0: 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c  Reprepare, iCol,
79e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
79f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20  );.    if( pVal 
7a00: 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
7a10: 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c  _type(pVal)==SQL
7a20: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
7a30: 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71    z = (char *)sq
7a40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7a50: 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pVal);.    }.  
7a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7a70: 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
7a80: 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20  pVdbe, iCol);.  
7a90: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
7aa0: 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
7ab0: 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d  E || pRight->op=
7ac0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
7ad0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
7ae0: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
7af0: 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a   z = pRight->u.z
7b00: 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  Token;.  }.  if(
7b10: 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20   z ){.    cnt = 
7b20: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
7b30: 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63  =z[cnt])!=0 && c
7b40: 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63  !=wc[0] && c!=wc
7b50: 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20  [1] && c!=wc[2] 
7b60: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
7b70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e      }.    if( cn
7b80: 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38  t!=0 && 255!=(u8
7b90: 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20  )z[cnt-1] ){.   
7ba0: 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69 78     Expr *pPrefix
7bb0: 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70  ;.      *pisComp
7bc0: 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20  lete = c==wc[0] 
7bd0: 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a  && z[cnt+1]==0;.
7be0: 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d 20        pPrefix = 
7bf0: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
7c00: 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20  TK_STRING, z);. 
7c10: 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69 78       if( pPrefix
7c20: 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54   ) pPrefix->u.zT
7c30: 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20  oken[cnt] = 0;. 
7c40: 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d       *ppPrefix =
7c50: 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20   pPrefix;.      
7c60: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
7c70: 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56  BLE ){.        V
7c80: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
7c90: 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20  >pVdbe;.        
7ca0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
7cb0: 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d  rmask(v, pRight-
7cc0: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
7cd0: 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c     if( *pisCompl
7ce0: 65 74 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75  ete && pRight->u
7cf0: 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20  .zToken[1] ){.  
7d00: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
7d10: 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b  e rhs of the LIK
7d20: 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  E expression is 
7d30: 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20  a variable, and 
7d40: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
7d50: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
7d60: 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d  f the variable m
7d70: 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f  eans there is no
7d80: 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20   need to invoke 
7d90: 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20  the LIKE.       
7da0: 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20     ** function, 
7db0: 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61  then no OP_Varia
7dc0: 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65  ble will be adde
7dd0: 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  d to the program
7de0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54  ..          ** T
7df0: 68 69 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c  his causes probl
7e00: 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ems for the sqli
7e10: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
7e20: 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20  er_name().      
7e30: 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77      ** API. To w
7e40: 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20  orkaround them, 
7e50: 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56  add a dummy OP_V
7e60: 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20  ariable here..  
7e70: 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
7e80: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
7e90: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7ea0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7eb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7ec0: 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
7ed0: 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20  , pRight, r1);. 
7ee0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7ef0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7f00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
7f10: 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b  ntAddr(v)-1, 0);
7f20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7f30: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7f40: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
7f50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7f60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7f70: 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   z = 0;.    }.  
7f80: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  }..  sqlite3Valu
7f90: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72  eFree(pVal);.  r
7fa0: 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a  eturn (z!=0);.}.
7fb0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7fc0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
7fd0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66  IZATION */...#if
7fe0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7ff0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
8000: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
8010: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
8020: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
8030: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
8040: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54        column MAT
8050: 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66  CH expr.**.** If
8060: 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74 75   it is then retu
8070: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74  rn TRUE.  If not
8080: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
8090: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
80a0: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20  MatchOfColumn(. 
80b0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
80c0: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
80d0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
80e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
80f0: 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t;..  if( pExpr-
8100: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
8110: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8120: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
8130: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
8140: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63  ->u.zToken,"matc
8150: 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  h")!=0 ){.    re
8160: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
8170: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
8180: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73  List;.  if( pLis
8190: 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20  t->nExpr!=2 ){. 
81a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
81b0: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b  .  if( pList->a[
81c0: 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20  1].pExpr->op != 
81d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
81e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
81f0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
8200: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
8210: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
8220: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  */../*.** If the
8230: 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69 6f   pBase expressio
8240: 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  n originated in 
8250: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
8260: 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a  clause of.** a j
8270: 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  oin, then transf
8280: 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  er the appropria
8290: 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72  te markings over
82a0: 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a   to derived..*/.
82b0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e  static void tran
82c0: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
82d0: 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c  (Expr *pDerived,
82e0: 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20   Expr *pBase){. 
82f0: 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73   pDerived->flags
8300: 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73   |= pBase->flags
8310: 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a   & EP_FromJoin;.
8320: 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67    pDerived->iRig
8330: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42  htJoinTable = pB
8340: 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ase->iRightJoinT
8350: 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  able;.}..#if !de
8360: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8370: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
8380: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
8390: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
83a0: 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ERY)./*.** Analy
83b0: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 63  ze a term that c
83c0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f  onsists of two o
83d0: 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63  r more OR-connec
83e0: 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e  ted.** subterms.
83f0: 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20    So in:.**.**  
8400: 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61     ... WHERE  (a
8410: 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20  =5) AND (b=7 OR 
8420: 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44  c=9 OR d=13) AND
8430: 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20   (d=13).**      
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e      ^^^^^^^^^^^^
8460: 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54  ^^^^^^^^.**.** T
8470: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
8480: 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68 20  yzes terms such 
8490: 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65  as the middle te
84a0: 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  rm in the above 
84b0: 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68  example..** A Wh
84c0: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
84d0: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
84e0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
84f0: 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61   term under.** a
8500: 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c  nalysis, regardl
8510: 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f  ess of the outco
8520: 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73  me of the analys
8530: 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a  is.  Hence:.**.*
8540: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
8550: 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45  wtFlags   |=  TE
8560: 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20  RM_ORINFO.**    
8570: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
8580: 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d  Info  =  a dynam
8590: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
85a0: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
85b0: 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ect.**.** The te
85c0: 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
85d0: 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20  d must have two 
85e0: 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f  or more of OR-co
85f0: 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d 73  nnected subterms
8600: 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75  ..** A single su
8610: 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61  bterm might be a
8620: 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e   set of AND-conn
8630: 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65 72  ected sub-subter
8640: 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20  ms..** Examples 
8650: 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61  of terms under a
8660: 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  nalysis:.**.**  
8670: 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d     (A)     t1.x=
8680: 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e  t2.y OR t1.x=t2.
8690: 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20  z OR t1.y=15 OR 
86a0: 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20  t1.z=t3.a+5.**  
86b0: 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78 70     (B)     x=exp
86c0: 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52  r1 OR expr2=x OR
86d0: 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20   x=expr3.**     
86e0: 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (C)     t1.x=t2.
86f0: 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20  y OR (t1.x=t2.z 
8700: 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20  AND t1.y=15).** 
8710: 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65 78      (D)     x=ex
8720: 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44  pr1 OR (y>11 AND
8730: 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45   y<22 AND z LIKE
8740: 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20   '*hello*').**  
8750: 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d     (E)     (p.a=
8760: 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20  1 AND q.b=2 AND 
8770: 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34  r.c=3) OR (p.x=4
8780: 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72   AND q.y=5 AND r
8790: 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  .z=6).**.** CASE
87a0: 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   1:.**.** If all
87b0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66   subterms are of
87c0: 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78   the form T.C=ex
87d0: 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  pr for some sing
87e0: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61  le column of C a
87f0: 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74  nd.** a single t
8800: 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e  able T (as shown
8810: 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62   in example B ab
8820: 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65  ove) then create
8830: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
8840: 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61  * term that is a
8850: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20  n equivalent IN 
8860: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20  expression.  In 
8870: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
8880: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e  the term.** bein
8890: 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a  g analyzed is:.*
88a0: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78  *.**      x = ex
88b0: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
88c0: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
88d0: 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65  3.**.** then cre
88e0: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
88f0: 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73  l term like this
8900: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  :.**.**      x I
8910: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
8920: 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  xpr3).**.** CASE
8930: 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   2:.**.** If all
8940: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
8950: 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e  dexable by a sin
8960: 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65  gle table T, the
8970: 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n set.**.**     
8980: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
8990: 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  tor             
89a0: 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20   =  WO_OR.**    
89b0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
89c0: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
89d0: 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20   |=  the cursor 
89e0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
89f0: 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65   T.**.** A subte
8a00: 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65  rm is "indexable
8a10: 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68  " if it is of th
8a20: 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c  e form.** "T.C <
8a30: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
8a40: 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d  e C is any colum
8a50: 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64  n of table T and
8a60: 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   .** <op> is one
8a70: 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c   of "=", "<", "<
8a80: 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22  =", ">", ">=", "
8a90: 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e  IS NULL", or "IN
8aa0: 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  "..** A subterm 
8ab0: 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c  is also indexabl
8ac0: 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e  e if it is an AN
8ad0: 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  D of two or more
8ae0: 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20  .** subsubterms 
8af0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
8b00: 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62  which is indexab
8b10: 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41  le.  Indexable A
8b20: 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20  ND .** subterms 
8b30: 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72  have their eOper
8b40: 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41  ator set to WO_A
8b50: 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65  ND and they have
8b60: 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73  .** u.pAndInfo s
8b70: 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  et to a dynamica
8b80: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
8b90: 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63  ereAndTerm objec
8ba0: 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e  t..**.** From an
8bb0: 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76  other point of v
8bc0: 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22  iew, "indexable"
8bd0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
8be0: 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a  subterm could.**
8bf0: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
8c00: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
8c10: 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  ex if an appropr
8c20: 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74  iate index exist
8c30: 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79  s..** This analy
8c40: 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  sis does not con
8c50: 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72  sider whether or
8c60: 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65   not the index e
8c70: 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69  xists; that.** i
8c80: 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20  s something the 
8c90: 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74  bestIndex() rout
8ca0: 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69  ine will determi
8cb0: 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73  ne.  This analys
8cc0: 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73  is.** only looks
8cd0: 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74   at whether subt
8ce0: 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65  erms appropriate
8cf0: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78   for indexing ex
8d00: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65  ist..**.** All e
8d10: 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67  xamples A throug
8d20: 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61  h E above all sa
8d30: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42  tisfy case 2.  B
8d40: 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20  ut if a term.** 
8d50: 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20  also statisfies 
8d60: 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20  case 1 (such as 
8d70: 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  B) we know that 
8d80: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69  the optimizer wi
8d90: 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65  ll.** always pre
8da0: 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69  fer case 1, so i
8db0: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70  n that case we p
8dc0: 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65  retend that case
8dd0: 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74   2 is not.** sat
8de0: 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74  isfied..**.** It
8df0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
8e00: 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  se that multiple
8e10: 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65   tables are inde
8e20: 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d  xable.  For exam
8e30: 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76  ple,.** (E) abov
8e40: 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f  e is indexable o
8e50: 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61  n tables P, Q, a
8e60: 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  nd R..**.** Term
8e70: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
8e80: 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64  ase 2 are candid
8e90: 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20  ates for lookup 
8ea0: 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61  by using.** sepa
8eb0: 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20  rate indices to 
8ec0: 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20  find rowids for 
8ed0: 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64  each subterm and
8ee0: 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68   composing.** th
8ef0: 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72  e union of all r
8f00: 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f  owids using a Ro
8f10: 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  wSet object.  Th
8f20: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  is is similar.**
8f30: 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69   to "bitmap indi
8f40: 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61  ces" in other da
8f50: 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a  tabase engines..
8f60: 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a  **.** OTHERWISE:
8f70: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
8f80: 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73  r case 1 nor cas
8f90: 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20  e 2 apply, then 
8fa0: 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61  leave the eOpera
8fb0: 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65  tor set to.** ze
8fc0: 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69  ro.  This term i
8fd0: 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72  s not useful for
8fe0: 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74   search..*/.stat
8ff0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
9000: 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63  yzeOrTerm(.  Src
9010: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
9020: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
9030: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
9040: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
9050: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
9060: 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63  complete WHERE c
9070: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
9080: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
9090: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
90a0: 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20   the OR-term to 
90b0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
90c0: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
90d0: 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b  e = pWC->pParse;
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
90f0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
9100: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9110: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
9120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
9130: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9140: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
9150: 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e   *pTerm = &pWC->
9160: 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f  a[idxTerm];    /
9170: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
9180: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45   analyzed */.  E
9190: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
91a0: 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20  rm->pExpr;      
91b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
91c0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
91d0: 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d  term */.  WhereM
91e0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
91f0: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
9200: 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65 20 6d  ; /* Table use m
9210: 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  asks */.  int i;
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9250: 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  rs */.  WhereCla
9260: 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20  use *pOrWc;     
9270: 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20    /* Breakup of 
9280: 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65  pTerm into subte
9290: 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  rms */.  WhereTe
92a0: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20  rm *pOrTerm;    
92b0: 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d     /* A Sub-term
92c0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57   within the pOrW
92d0: 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e  c */.  WhereOrIn
92e0: 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20  fo *pOrInfo;    
92f0: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69   /* Additional i
9300: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63  nformation assoc
9310: 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d  iated with pTerm
9320: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68   */.  Bitmask ch
9330: 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20  ngToIN;         
9340: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
9350: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
9360: 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  e 1 */.  Bitmask
9370: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
9380: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
9390: 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c  t are indexable,
93a0: 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65   satisfying case
93b0: 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   2 */..  /*.  **
93c0: 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c   Break the OR cl
93d0: 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65  ause into its se
93e0: 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e  parate subterms.
93f0: 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61    The subterms a
9400: 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  re.  ** stored i
9410: 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  n a WhereClause 
9420: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
9430: 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20  ning within the 
9440: 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a  WhereOrInfo.  **
9450: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
9460: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
9470: 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75  original OR clau
9480: 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20  se term..  */.  
9490: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
94a0: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
94b0: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49  DYNAMIC|TERM_ORI
94c0: 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  NFO|TERM_ANDINFO
94d0: 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
94e0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
94f0: 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  _OR );.  pTerm->
9500: 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49  u.pOrInfo = pOrI
9510: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
9520: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
9530: 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b  zeof(*pOrInfo));
9540: 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d  .  if( pOrInfo==
9550: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  0 ) return;.  pT
9560: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
9570: 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70  TERM_ORINFO;.  p
9580: 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d  OrWc = &pOrInfo-
9590: 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  >wc;.  whereClau
95a0: 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57  seInit(pOrWc, pW
95b0: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C->pParse, pMask
95c0: 53 65 74 2c 20 70 57 43 2d 3e 77 63 74 72 6c 46  Set, pWC->wctrlF
95d0: 6c 61 67 73 29 3b 0a 20 20 77 68 65 72 65 53 70  lags);.  whereSp
95e0: 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72  lit(pOrWc, pExpr
95f0: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72  , TK_OR);.  expr
9600: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
9610: 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64   pOrWc);.  if( d
9620: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9630: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
9640: 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  rt( pOrWc->nTerm
9650: 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  >=2 );..  /*.  *
9660: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65  * Compute the se
9670: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
9680: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
9690: 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a  ases 1 or 2..  *
96a0: 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20  /.  indexable = 
96b0: 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63  ~(Bitmask)0;.  c
96c0: 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d  hngToIN = ~(Bitm
96d0: 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70  ask)0;.  for(i=p
96e0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
96f0: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
9700: 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62   i>=0 && indexab
9710: 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  le; i--, pOrTerm
9720: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f  ++){.    if( (pO
9730: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
9740: 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30   & WO_SINGLE)==0
9750: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41   ){.      WhereA
9760: 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f  ndInfo *pAndInfo
9770: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9780: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
9790: 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46  s & (TERM_ANDINF
97a0: 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d  O|TERM_ORINFO))=
97b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67  =0 );.      chng
97c0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
97d0: 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pAndInfo = sqlit
97e0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
97f0: 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e  , sizeof(*pAndIn
9800: 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fo));.      if( 
9810: 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pAndInfo ){.    
9820: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
9830: 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20  *pAndWC;.       
9840: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64   WhereTerm *pAnd
9850: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Term;.        in
9860: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74  t j;.        Bit
9870: 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20  mask b = 0;.    
9880: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70      pOrTerm->u.p
9890: 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e  AndInfo = pAndIn
98a0: 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54  fo;.        pOrT
98b0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
98c0: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20  TERM_ANDINFO;.  
98d0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65        pOrTerm->e
98e0: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e  Operator = WO_AN
98f0: 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  D;.        pAndW
9900: 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77  C = &pAndInfo->w
9910: 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  c;.        where
9920: 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57  ClauseInit(pAndW
9930: 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  C, pWC->pParse, 
9940: 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77  pMaskSet, pWC->w
9950: 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
9960: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
9970: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
9980: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
9990: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
99a0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
99b0: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
99c0: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
99d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
99e0: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
99f0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
9a00: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
9a10: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
9a20: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
9a30: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
9a40: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
9a50: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
9a60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
9a70: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
9a80: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
9a90: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
9aa0: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
9ab0: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
9ad0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
9ae0: 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66  t, pAndTerm->lef
9af0: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
9b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9b10: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9b20: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
9b30: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
9b40: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
9b50: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
9b60: 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20  ERM_COPIED ){.  
9b70: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73      /* Skip this
9b80: 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20   term for now.  
9b90: 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68  We revisit it wh
9ba0: 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68  en we process th
9bb0: 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65  e.      ** corre
9bc0: 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49  sponding TERM_VI
9bd0: 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20  RTUAL term */.  
9be0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
9bf0: 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20  itmask b;.      
9c00: 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  b = getMask(pMas
9c10: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
9c20: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
9c30: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77    if( pOrTerm->w
9c40: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
9c50: 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  RTUAL ){.       
9c60: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
9c70: 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70  er = &pOrWc->a[p
9c80: 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  OrTerm->iParent]
9c90: 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67  ;.        b |= g
9ca0: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
9cb0: 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72   pOther->leftCur
9cc0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
9cd0: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
9ce0: 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   b;.      if( (p
9cf0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9d00: 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b  r & WO_EQ)==0 ){
9d10: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
9d20: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  N = 0;.      }el
9d30: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67  se{.        chng
9d40: 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20  ToIN &= b;.     
9d50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
9d60: 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74  /*.  ** Record t
9d70: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
9d80: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
9d90: 73 65 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d  se 2.  The set m
9da0: 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70  ight be.  ** emp
9db0: 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e  ty..  */.  pOrIn
9dc0: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20  fo->indexable = 
9dd0: 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65  indexable;.  pTe
9de0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
9df0: 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30  indexable==0 ? 0
9e00: 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a   : WO_OR;..  /*.
9e10: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f    ** chngToIN ho
9e20: 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62  lds a set of tab
9e30: 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a  les that *might*
9e40: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e   satisfy case 1.
9e50: 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61    But.  ** we ha
9e60: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64  ve to do some ad
9e70: 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e  ditional checkin
9e80: 67 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65  g to see if case
9e90: 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69   1 really.  ** i
9ea0: 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a  s satisfied..  *
9eb0: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
9ec0: 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72  will hold either
9ed0: 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73   0, 1, or 2 bits
9ee0: 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73  .  The 0-bit cas
9ef0: 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  e means.  ** tha
9f00: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  t there is no po
9f10: 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61  ssibility of tra
9f20: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52  nsforming the OR
9f30: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a   clause into an.
9f40: 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72    ** IN operator
9f50: 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20   because one or 
9f60: 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68  more terms in th
9f70: 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74  e OR clause cont
9f80: 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69  ain.  ** somethi
9f90: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d  ng other than ==
9fa0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   on a column in 
9fb0: 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  the single table
9fc0: 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a  .  The 1-bit.  *
9fd0: 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61  * case means tha
9fe0: 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  t every term of 
9ff0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73  the OR clause is
a000: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a   of the form.  *
a010: 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d  * "table.column=
a020: 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73  expr" for some s
a030: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
a040: 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69  e one bit that i
a050: 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20  s set.  ** will 
a060: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
a070: 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20  e common table. 
a080: 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   We still need t
a090: 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a  o check to make.
a0a0: 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61    ** sure the sa
a0b0: 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  me column is use
a0c0: 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20  d on all terms. 
a0d0: 20 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   The 2-bit case 
a0e0: 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65  is when.  ** the
a0f0: 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f   all terms are o
a100: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
a110: 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32  e1.column=table2
a120: 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20  .column".  It.  
a130: 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73  ** might be poss
a140: 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20  ible to form an 
a150: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
a160: 20 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63   either table1.c
a170: 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61  olumn.  ** or ta
a180: 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74  ble2.column as t
a190: 68 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72  he LHS if either
a1a0: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76   is common to ev
a1b0: 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a  ery term of.  **
a1c0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a   the OR clause..
a1d0: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
a1e0: 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  hat terms of the
a1f0: 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c   form "table.col
a200: 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d  umn1=table.colum
a210: 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61  n2" (the.  ** sa
a220: 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68  me table on both
a230: 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d   sizes of the ==
a240: 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  ) cannot be opti
a250: 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  mized..  */.  if
a260: 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ( chngToIN ){.  
a270: 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    int okToChngTo
a280: 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  IN = 0;     /* T
a290: 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65  rue if the conve
a2a0: 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76  rsion to IN is v
a2b0: 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alid */.    int 
a2c0: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  iColumn = -1;   
a2d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
a2e0: 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20  index on lhs of 
a2f0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
a300: 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d     int iCursor =
a310: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
a320: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d  Table cursor com
a330: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73  mon to all terms
a340: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20   */.    int j = 
a350: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
a360: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a370: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  r */..    /* Sea
a380: 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20  rch for a table 
a390: 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  and column that 
a3a0: 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73  appears on one s
a3b0: 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ide or the.    *
a3c0: 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d  * other of the =
a3d0: 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76  = operator in ev
a3e0: 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68  ery subterm.  Th
a3f0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  at table and col
a400: 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  umn.    ** will 
a410: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69  be recorded in i
a420: 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75  Cursor and iColu
a430: 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74  mn.  There might
a440: 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20   not be any.    
a450: 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e  ** such table an
a460: 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f  d column.  Set o
a470: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61  kToChngToIN if a
a480: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61  n appropriate ta
a490: 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63  ble.    ** and c
a4a0: 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62  olumn is found b
a4b0: 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e  ut leave okToChn
a4c0: 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e  gToIN false if n
a4d0: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f  ot found..    */
a4e0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
a4f0: 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f  2 && !okToChngTo
a500: 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  IN; j++){.      
a510: 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d  pOrTerm = pOrWc-
a520: 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  >a;.      for(i=
a530: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20  pOrWc->nTerm-1; 
a540: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
a550: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
a560: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
a570: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
a580: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  Q );.        pOr
a590: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
a5a0: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
a5b0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
a5c0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
a5d0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
a5e0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
a5f0: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e  he 2-bit case an
a600: 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20  d we are on the 
a610: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
a620: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
a630: 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  * current term i
a640: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  s from the first
a650: 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20   iteration.  So 
a660: 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20  skip this term. 
a670: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
a680: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
a690: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
a6a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a6b0: 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e     if( (chngToIN
a6c0: 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
a6d0: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
a6e0: 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b  ftCursor))==0 ){
a6f0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
a700: 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  is term must be 
a710: 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61  of the form t1.a
a720: 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20  ==t2.b where t2 
a730: 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  is in the.      
a740: 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20      ** chngToIN 
a750: 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f  set but t1 is no
a760: 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69  t.  This term wi
a770: 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65  ll be either pre
a780: 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20 20  ceeded.         
a790: 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62   ** or follwed b
a7a0: 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f  y an inverted co
a7b0: 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e  py (t2.b==t1.a).
a7c0: 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d    Skip this term
a7d0: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
a7e0: 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65 72  nd use its inver
a7f0: 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  sion. */.       
a800: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72     testcase( pOr
a810: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
a820: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20  TERM_COPIED );. 
a830: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
a840: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
a850: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
a860: 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  AL );.          
a870: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
a880: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
a890: 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52  _COPIED|TERM_VIR
a8a0: 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20  TUAL) );.       
a8b0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
a8c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a8d0: 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d  Column = pOrTerm
a8e0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
a8f0: 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 20          iCursor 
a900: 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  = pOrTerm->leftC
a910: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62  ursor;.        b
a920: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a930: 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
a940: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e         /* No can
a950: 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c  didate table+col
a960: 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  umn was found.  
a970: 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
a980: 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  cur.        ** o
a990: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65  n the second ite
a9a0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
a9b0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
a9c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a9d0: 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63  ( IsPowerOfTwo(c
a9e0: 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20  hngToIN) );.    
a9f0: 20 20 20 20 61 73 73 65 72 74 28 20 63 68 6e 67      assert( chng
aa00: 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d  ToIN==getMask(pM
aa10: 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29  askSet, iCursor)
aa20: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
aa30: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
aa40: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20   testcase( j==1 
aa50: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  );..      /* We 
aa60: 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e  have found a can
aa70: 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64  didate table and
aa80: 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20   column.  Check 
aa90: 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20  to see if that. 
aaa0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e       ** table an
aab0: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d  d column is comm
aac0: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
aad0: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
aae0: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43  e */.      okToC
aaf0: 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  hngToIN = 1;.   
ab00: 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26     for(; i>=0 &&
ab10: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69   okToChngToIN; i
ab20: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
ab30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ab40: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
ab50: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
ab60: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
ab70: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
ab80: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
ab90: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
aba0: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
abb0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
abc0: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
abd0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
abe0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
abf0: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
ac00: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
ac10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
ac20: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
ac30: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
ac40: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
ac50: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
ac60: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
ac70: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
ac80: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
ac90: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
aca0: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
acb0: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
acc0: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
acd0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
ace0: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
acf0: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
ad00: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
ad10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
ad20: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
ad30: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
ad40: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
ad50: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
ad60: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
ad70: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
ad80: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
ad90: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
ada0: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
adb0: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
adc0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
add0: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
ade0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
adf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ae00: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
ae10: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
ae20: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
ae30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ae40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
ae50: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
ae60: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
ae70: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
ae80: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
ae90: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
aea0: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
aeb0: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
aec0: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
aed0: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
aee0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
aef0: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
af00: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a     **.    ** EV:
af10: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20   R-00211-15100. 
af20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
af30: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
af40: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
af50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
af60: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
af70: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
af80: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
af90: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
afa0: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
afb0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
afc0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
afd0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
afe0: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
aff0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
b000: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
b010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b020: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
b030: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
b040: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
b050: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
b060: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
b070: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
b080: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
b090: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
b0a0: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
b0b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b0c0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
b0d0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
b0e0: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
b0f0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
b100: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
b110: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
b120: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
b130: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
b140: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
b150: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
b160: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
b170: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
b180: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
b190: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
b1a0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
b1b0: 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  WC->pParse, pLis
b1c0: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
b1d0: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
b1e0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
b1f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
b200: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
b210: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
b220: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b230: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
b240: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
b250: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
b260: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
b270: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
b280: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
b290: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
b2a0: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
b2b0: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
b2c0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
b2d0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
b2e0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
b2f0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
b300: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
b310: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
b320: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
b330: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
b340: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
b350: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
b360: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
b370: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
b380: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
b390: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
b3a0: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
b3b0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
b3c0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
b3d0: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
b3e0: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
b3f0: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
b400: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
b410: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
b420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b430: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
b440: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
b450: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
b460: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
b470: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
b480: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
b490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
b4a0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
b4b0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
b4c0: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
b4d0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
b4e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
b4f0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
b500: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
b510: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
b520: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
b530: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
b540: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
b550: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
b560: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
b570: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
b580: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
b590: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
b5a0: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
b5b0: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
b5c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
b5d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
b5e0: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
b5f0: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
b600: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
b610: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
b620: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
b630: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
b640: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b650: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
b660: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
b670: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
b680: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
b690: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
b6a0: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
b6b0: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
b6c0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
b6d0: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
b6e0: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
b6f0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
b700: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
b710: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
b720: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
b730: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
b740: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
b750: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
b760: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
b770: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
b780: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
b790: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
b7a0: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
b7b0: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
b7c0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
b7d0: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
b7e0: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
b7f0: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
b800: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
b810: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
b820: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
b830: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
b840: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
b850: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
b860: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
b870: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
b880: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
b890: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
b8a0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
b8b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
b8c0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
b8d0: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
b8e0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
b8f0: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
b900: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
b910: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
b920: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
b930: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  /* The term to b
b960: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
b970: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
b980: 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20  askSet;         
b990: 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65   /* Set of table
b9a0: 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a   index masks */.
b9b0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
b9e0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
b9f0: 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  zed */.  Bitmask
ba00: 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20   prereqLeft;    
ba10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
ba20: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74 68  requesites of th
ba30: 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a  e pExpr->pLeft *
ba40: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
ba50: 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  eqAll;          
ba60: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
ba70: 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a  sites of pExpr *
ba80: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
ba90: 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20  aRight = 0;     
baa0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65       /* Extra de
bab0: 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45  pendencies on LE
bac0: 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70  FT JOIN */.  Exp
bad0: 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20  r *pStr1 = 0;   
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
baf0: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
bb00: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
bb10: 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d  int isComplete =
bb20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bb30: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
bb40: 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77  GLOB ends with w
bb50: 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74  ildcard */.  int
bb60: 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20   noCase = 0;    
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb80: 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69   LIKE/GLOB disti
bb90: 6e 67 75 69 73 68 65 73 20 63 61 73 65 20 2a 2f  nguishes case */
bba0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c      /* Top-level
bbd0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70   operator.  pExp
bbe0: 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65  r->op */.  Parse
bbf0: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
bc00: 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50  pParse;     /* P
bc10: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
bc20: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
bc30: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
bc40: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
bc50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
bc60: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
bc70: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
bc80: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72  turn;.  }.  pTer
bc90: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
bca0: 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74  erm];.  pMaskSet
bcb0: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
bcc0: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
bcd0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
bce0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
bcf0: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
bd00: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
bd10: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
bd20: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
bd30: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
bd40: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
bd50: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
bd60: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
bd70: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
bd80: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
bd90: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
bda0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
bdb0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
bdc0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
bdd0: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
bde0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
bdf0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
be00: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
be10: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
be20: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
be30: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
be40: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
be50: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
be60: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
be70: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
be80: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
be90: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
bea0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
beb0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
bec0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
bed0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
bee0: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
bef0: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
bf00: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
bf10: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
bf20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
bf30: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
bf40: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
bf50: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
bf60: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
bf70: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
bf80: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
bf90: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
bfa0: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
bfb0: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
bfc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
bfd0: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
c000: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
c010: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
c020: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
c030: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
c040: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
c050: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
c060: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
c070: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
c080: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c090: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
c0a0: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
c0b0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
c0c0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
c0d0: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
c0e0: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
c0f0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
c100: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
c110: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
c120: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
c130: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
c140: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
c150: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
c160: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
c170: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
c180: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
c190: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
c1a0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
c1b0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
c1c0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
c1d0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
c1e0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
c1f0: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
c200: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
c210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c220: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
c230: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
c240: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
c250: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
c260: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
c270: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
c280: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
c290: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
c2a0: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
c2b0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
c2c0: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
c2d0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
c2e0: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
c2f0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
c300: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
c310: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
c320: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c330: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
c340: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
c350: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
c360: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c370: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
c380: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
c390: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
c3a0: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
c3b0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
c3c0: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
c3d0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
c3e0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
c3f0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
c400: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
c410: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
c420: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
c430: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
c440: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
c450: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
c460: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
c470: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
c480: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
c490: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
c4a0: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
c4b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
c4c0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
c4d0: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
c4e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
c4f0: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
c500: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
c510: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
c520: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c530: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
c540: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
c550: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
c560: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
c570: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
c580: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
c590: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
c5a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
c5b0: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
c5c0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
c5d0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
c5e0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
c5f0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
c600: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
c610: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
c620: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
c630: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
c640: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
c650: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
c660: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
c670: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
c680: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
c690: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
c6a0: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
c6b0: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
c6c0: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
c6d0: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
c6e0: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
c6f0: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
c700: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
c710: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
c720: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
c730: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c740: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
c750: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
c760: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
c770: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
c780: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
c790: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
c7a0: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
c7b0: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
c7c0: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
c7d0: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
c7e0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
c7f0: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
c800: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
c810: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
c820: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
c830: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
c840: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
c850: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
c860: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
c870: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
c880: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
c890: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
c8a0: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
c8b0: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
c8c0: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
c8d0: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
c8e0: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
c8f0: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
c900: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
c910: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
c920: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
c930: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
c940: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
c950: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
c960: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
c970: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
c980: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
c990: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
c9a0: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
c9b0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
c9c0: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
c9d0: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
c9e0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
c9f0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
ca00: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
ca10: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
ca20: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
ca30: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
ca40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
ca50: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
ca60: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
ca70: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
ca80: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
ca90: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
caa0: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
cab0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
cac0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
cad0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
cae0: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
cb10: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
cb20: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cb50: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
cb60: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
cb70: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
cb80: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
cb90: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
cba0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
cbb0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
cbc0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
cbd0: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
cbe0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
cbf0: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
cc00: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
cc10: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
cc20: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
cc30: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
cc40: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
cc50: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
cc60: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
cc70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
cc80: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
cc90: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64  ATION */..#if !d
cca0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ccb0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
ccc0: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
ccd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
cce0: 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79  UERY).  /* Analy
ccf0: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69  ze a term that i
cd00: 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77  s composed of tw
cd10: 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72  o or more subter
cd20: 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  ms connected by.
cd30: 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61    ** an OR opera
cd40: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  tor..  */.  else
cd50: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
cd60: 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73  TK_OR ){.    ass
cd70: 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  ert( pWC->op==TK
cd80: 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72  _AND );.    expr
cd90: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53  AnalyzeOrTerm(pS
cda0: 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d  rc, pWC, idxTerm
cdb0: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
cdc0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
cdd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
cde0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
cdf0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
ce00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ce10: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
ce20: 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f  TION.  /* Add co
ce30: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64  nstraints to red
ce40: 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
ce50: 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f  pace on a LIKE o
ce60: 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72  r GLOB.  ** oper
ce70: 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
ce80: 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f  A like pattern o
ce90: 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49  f the form "x LI
cea0: 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68  KE 'abc%'" is ch
ceb0: 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74  anged into const
cec0: 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a  raints.  **.  **
ced0: 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62            x>='ab
cee0: 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41  c' AND x<'abd' A
cef0: 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  ND x LIKE 'abc%'
cf00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
cf10: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ast character of
cf20: 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63   the prefix "abc
cf30: 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  " is incremented
cf40: 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a   to form the.  *
cf50: 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  * termination co
cf60: 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20  ndition "abd".. 
cf70: 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f   */.  if( pWC->o
cf80: 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26  p==TK_AND .   &&
cf90: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50   isLikeOrGlob(pP
cfa0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53  arse, pExpr, &pS
cfb0: 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65  tr1, &isComplete
cfc0: 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a  , &noCase).  ){.
cfd0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
cfe0: 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66         /* LHS of
cff0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
d000: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
d010: 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a  *pStr2;       /*
d020: 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d   Copy of pStr1 -
d030: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
d040: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
d050: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
d060: 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  1;.    Expr *pNe
d070: 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20  wExpr2;.    int 
d080: 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74  idxNew1;.    int
d090: 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f   idxNew2;.    To
d0a0: 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  ken sCollSeqName
d0b0: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ;  /* Name of co
d0c0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d0d0: 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d   */..    pLeft =
d0e0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
d0f0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
d100: 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33   pStr2 = sqlite3
d110: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72  ExprDup(db, pStr
d120: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 0);.    if( !
d130: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d140: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20   ){.      u8 c, 
d150: 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61  *pC;       /* La
d160: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
d170: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69  ore the first wi
d180: 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20  ldcard */.      
d190: 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32  pC = (u8*)&pStr2
d1a0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74  ->u.zToken[sqlit
d1b0: 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32  e3Strlen30(pStr2
d1c0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a  ->u.zToken)-1];.
d1d0: 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20        c = *pC;. 
d1e0: 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20       if( noCase 
d1f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
d200: 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e  e point is to in
d210: 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74  crement the last
d220: 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72   character befor
d230: 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  e the first.    
d240: 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e      ** wildcard.
d250: 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72    But if we incr
d260: 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20  ement '@', that 
d270: 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74  will push it int
d280: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
d290: 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67   alphabetic rang
d2a0: 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e  e where case con
d2b0: 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65  versions will me
d2c0: 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20  ss up the .     
d2d0: 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79     ** inequality
d2e0: 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73  .  To avoid this
d2f0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61  , make sure to a
d300: 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c  lso run the full
d310: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45  .        ** LIKE
d320: 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74   on all candidat
d330: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  e expressions by
d340: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73   clearing the is
d350: 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20  Complete flag.  
d360: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d370: 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20   if( c=='A'-1 ) 
d380: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
d390: 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33 39    /* EV: R-64339
d3a0: 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20 20  -08207 */...    
d3b0: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
d3c0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
d3d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
d3e0: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
d3f0: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
d400: 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
d410: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
d420: 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
d430: 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
d440: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
d450: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
d460: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
d470: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
d480: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
d490: 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
d4a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
d4b0: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
d4c0: 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
d4d0: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
d4e0: 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
d4f0: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20  0);.    idxNew1 
d500: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
d510: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
d520: 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r1, TERM_VIRTUAL
d530: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
d540: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
d550: 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20  xNew1==0 );.    
d560: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
d570: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b  , pWC, idxNew1);
d580: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
d590: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
d5a0: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
d5b0: 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
d5c0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
d5d0: 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20  se, TK_LT,.     
d5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d5f0: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
d600: 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72  (pParse,pNewExpr
d610: 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29  2,&sCollSeqName)
d620: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74  ,.           pSt
d630: 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e  r2, 0);.    idxN
d640: 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
d650: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
d660: 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
d670: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
d680: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
d690: 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a  ( idxNew2==0 );.
d6a0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
d6b0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
d6c0: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
d6d0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
d6e0: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
d6f0: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
d700: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
d710: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
d720: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
d730: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
d740: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
d750: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
d760: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
d770: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d780: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
d790: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
d7a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
d7b0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
d7c0: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
d7d0: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
d7e0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
d7f0: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
d800: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
d810: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
d820: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
d830: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
d840: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
d850: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
d860: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
d870: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
d880: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
d890: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
d8a0: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
d8b0: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
d8c0: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
d8d0: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
d8e0: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
d8f0: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
d900: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
d910: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
d920: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
d930: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
d940: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
d950: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
d960: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
d970: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
d980: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
d990: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
d9a0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
d9b0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
d9c0: 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
d9d0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
d9e0: 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
d9f0: 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
da00: 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
da10: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
da20: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
da30: 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
da40: 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
da50: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
da60: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
da70: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
da80: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
da90: 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
dac0: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
dad0: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
dae0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
daf0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
db00: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
db10: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
db20: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
db30: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
db40: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
db50: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
db60: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
db70: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
db80: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
db90: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
dba0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
dbb0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
dbc0: 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
dbd0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
dbe0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
dbf0: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
dc00: 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
dc10: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
dc20: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
dc30: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
dc40: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
dc50: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
dc60: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
dc70: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
dc80: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
dc90: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
dca0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
dcb0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
dcc0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
dcd0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
dce0: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
dcf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
dd00: 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20  ABLE_STAT3.  /* 
dd10: 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74  When sqlite_stat
dd20: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
dd30: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e   is available an
dd40: 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65   operator of the
dd50: 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53  .  ** form "x IS
dd60: 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73   NOT NULL" can s
dd70: 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c  ometimes be eval
dd80: 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63  uated more effic
dd90: 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22  iently.  ** as "
dda0: 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20  x>NULL" if x is 
ddb0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
ddc0: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20  RIMARY KEY.  So 
ddd0: 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a  construct a.  **
dde0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66   virtual term of
ddf0: 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a   that form..  **
de00: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
de10: 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  the virtual term
de20: 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20   must be tagged 
de30: 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e  with TERM_VNULL.
de40: 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d    This.  ** TERM
de50: 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20  _VNULL tag will 
de60: 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74  suppress the not
de70: 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74  -null check at t
de80: 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
de90: 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  * of the loop.  
dea0: 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d  Without the TERM
deb0: 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65  _VNULL flag, the
dec0: 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
ded0: 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72  at.  ** the star
dee0: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69  t of the loop wi
def0: 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72  ll prevent any r
df00: 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e  esults from bein
df10: 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  g returned..  */
df20: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
df30: 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
df40: 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
df50: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
df60: 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
df70: 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  t->iColumn>=0.  
df80: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
df90: 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
dfa0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
dfb0: 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
dfc0: 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
dfd0: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
dfe0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
dff0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
e000: 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e030: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
e040: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
e070: 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
e080: 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
e090: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
e0a0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
e0b0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
e0e0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
e0f0: 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
e100: 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
e110: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
e120: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
e130: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
e140: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
e150: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
e160: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
e170: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
e180: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
e190: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
e1a0: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
e1b0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
e1c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
e1d0: 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  _GT;.      pNewT
e1e0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
e1f0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
e200: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
e210: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
e220: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
e230: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
e240: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
e250: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
e260: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
e270: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
e280: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
e290: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
e2a0: 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20  NABLE_STAT */.. 
e2b0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63   /* Prevent ON c
e2c0: 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61  lause terms of a
e2d0: 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20   LEFT JOIN from 
e2e0: 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72  being used to dr
e2f0: 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ive.  ** an inde
e300: 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  x for tables to 
e310: 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
e320: 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  join..  */.  pTe
e330: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
e340: 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d  |= extraRight;.}
e350: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
e360: 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74  ction searches t
e370: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
e380: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
e390: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
e3a0: 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78 70 72 65  .** for an expre
e3b0: 73 73 69 6f 6e 20 6f 66 20 74 79 70 65 20 54 4b  ssion of type TK
e3c0: 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65 66  _COLUMN that ref
e3d0: 65 72 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ers to the same 
e3e0: 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a 20 75 73  column and.** us
e3f0: 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
e400: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
e410: 73 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f  s the iCol'th co
e420: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
e430: 64 78 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  dx..** Argument 
e440: 69 42 61 73 65 20 69 73 20 74 68 65 20 63 75 72  iBase is the cur
e450: 73 6f 72 20 6e 75 6d 62 65 72 20 75 73 65 64 20  sor number used 
e460: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 68  for the table th
e470: 61 74 20 70 49 64 78 20 72 65 66 65 72 73 0a 2a  at pIdx refers.*
e480: 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  * to..**.** If s
e490: 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f  uch an expressio
e4a0: 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20  n is found, its 
e4b0: 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e  index in pList->
e4c0: 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  a[] is returned.
e4d0: 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73   If.** no expres
e4e0: 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d  sion is found, -
e4f0: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
e500: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
e510: 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72  dIndexCol(.  Par
e520: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e540: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
e550: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
e560: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
e570: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
e580: 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20   list to search 
e590: 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20  */.  int iBase, 
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66       /* Cursor f
e5c0: 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  or table associa
e5d0: 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f  ted with pIdx */
e5e0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d     /* Index to m
e610: 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a  atch column of *
e620: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66      /* Column of
e650: 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20   index to match 
e660: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
e670: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
e680: 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
e690: 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28  l[iCol];..  for(
e6a0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
e6b0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
e6c0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
e6d0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
e6e0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
e6f0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  r);.    if( p->o
e700: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
e710: 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d    && p->iColumn=
e720: 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
e730: 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d  iCol].     && p-
e740: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20  >iTable==iBase. 
e750: 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c     ){.      Coll
e760: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
e770: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
e780: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
e790: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
e7a0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f    if( ALWAYS(pCo
e7b0: 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  ll) && 0==sqlite
e7c0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
e7d0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  zName, zColl) ){
e7e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e7f0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
e800: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d  .  }..  return -
e810: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  1;.}../*.** This
e820: 20 72 6f 75 74 69 6e 65 20 64 65 74 65 72 6d 69   routine determi
e830: 6e 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20  nes if pIdx can 
e840: 62 65 20 75 73 65 64 20 74 6f 20 61 73 73 69 73  be used to assis
e850: 74 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  t in processing 
e860: 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 71 75  a.** DISTINCT qu
e870: 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f 74 68 65  alifier. In othe
e880: 72 20 77 6f 72 64 73 2c 20 69 74 20 74 65 73 74  r words, it test
e890: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
e8a0: 20 75 73 69 6e 67 20 74 68 69 73 0a 2a 2a 20 69   using this.** i
e8b0: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6f 75 74  ndex for the out
e8c0: 65 72 20 6c 6f 6f 70 20 67 75 61 72 61 6e 74 65  er loop guarante
e8d0: 65 73 20 74 68 61 74 20 72 6f 77 73 20 77 69 74  es that rows wit
e8e0: 68 20 65 71 75 61 6c 20 76 61 6c 75 65 73 20 66  h equal values f
e8f0: 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70 72 65 73  or.** all expres
e900: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 70 44 69  sions in the pDi
e910: 73 74 69 6e 63 74 20 6c 69 73 74 20 61 72 65 20  stinct list are 
e920: 64 65 6c 69 76 65 72 65 64 20 67 72 6f 75 70 65  delivered groupe
e930: 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a  d together..**.*
e940: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  * For example, t
e950: 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a 2a 2a 20  he query .**.** 
e960: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
e970: 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  T a, b, c FROM t
e980: 62 6c 20 57 48 45 52 45 20 61 20 3d 20 3f 0a 2a  bl WHERE a = ?.*
e990: 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65 66 69 74  *.** can benefit
e9a0: 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64 65 78 20   from any index 
e9b0: 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62 22 20 61  on columns "b" a
e9c0: 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74 61 74 69  nd "c"..*/.stati
e9d0: 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74  c int isDistinct
e9e0: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
e9f0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
ea00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
ea10: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ea20: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
ea30: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
ea40: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
ea50: 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ause */.  Index 
ea60: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
ea70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ea80: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e   index being con
ea90: 73 69 64 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  sidered */.  int
eaa0: 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20   base,          
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eac0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
ead0: 72 20 74 68 65 20 74 61 62 6c 65 20 70 49 64 78  r the table pIdx
eae0: 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45 78 70 72   is on */.  Expr
eaf0: 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c  List *pDistinct,
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
eb10: 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72  he DISTINCT expr
eb20: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  essions */.  int
eb30: 20 6e 45 71 43 6f 6c 20 20 20 20 20 20 20 20 20   nEqCol         
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb50: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
eb60: 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20  columns with == 
eb70: 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  */.){.  Bitmask 
eb80: 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  mask = 0;       
eb90: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
eba0: 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65 64 20 66  of unaccounted f
ebb0: 6f 72 20 70 44 69 73 74 69 6e 63 74 20 65 78 70  or pDistinct exp
ebc0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rs */.  int i;  
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
ebf0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
ec00: 0a 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74  .  assert( pDist
ec10: 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  inct!=0 );.  if(
ec20: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 3d 3d 30 20   pIdx->zName==0 
ec30: 7c 7c 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45  || pDistinct->nE
ec40: 78 70 72 3e 3d 42 4d 53 20 29 20 72 65 74 75 72  xpr>=BMS ) retur
ec50: 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65 28  n 0;.  testcase(
ec60: 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70   pDistinct->nExp
ec70: 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 0a 20 20 2f  r==BMS-1 );..  /
ec80: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
ec90: 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
eca0: 6e 73 20 69 6e 20 74 68 65 20 64 69 73 74 69 6e  ns in the distin
ecb0: 63 74 20 6c 69 73 74 2e 20 49 66 20 61 6e 79 20  ct list. If any 
ecc0: 6f 66 20 74 68 65 6d 0a 20 20 2a 2a 20 61 72 65  of them.  ** are
ecd0: 20 6e 6f 74 20 73 69 6d 70 6c 65 20 63 6f 6c 75   not simple colu
ece0: 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 2c 20 72  mn references, r
ecf0: 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 4f 74 68  eturn early. Oth
ed00: 65 72 77 69 73 65 2c 20 74 65 73 74 20 69 66 20  erwise, test if 
ed10: 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 20 63  the.  ** WHERE c
ed20: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
ed30: 20 22 63 6f 6c 3d 58 22 20 63 6c 61 75 73 65 2e   "col=X" clause.
ed40: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65   If it does, the
ed50: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
ed60: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
ed70: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
ed80: 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20   and the column 
ed90: 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20  does not belong 
eda0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  to the.  ** same
edb0: 20 74 61 62 6c 65 20 61 73 20 69 6e 64 65 78 20   table as index 
edc0: 70 49 64 78 2c 20 72 65 74 75 72 6e 20 65 61 72  pIdx, return ear
edd0: 6c 79 2e 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  ly. Finally, if 
ede0: 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 2a 2a  there is no.  **
edf0: 20 6d 61 74 63 68 69 6e 67 20 22 63 6f 6c 3d 58   matching "col=X
ee00: 22 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  " expression and
ee10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6f   the column is o
ee20: 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
ee30: 20 61 73 20 70 49 64 78 2c 0a 20 20 2a 2a 20 73   as pIdx,.  ** s
ee40: 65 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  et the correspon
ee50: 64 69 6e 67 20 62 69 74 20 69 6e 20 76 61 72 69  ding bit in vari
ee60: 61 62 6c 65 20 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  able mask..  */.
ee70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
ee80: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
ee90: 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  ++){.    WhereTe
eea0: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 45  rm *pTerm;.    E
eeb0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
eec0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
eed0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
eee0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
eef0: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
ef00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
ef10: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
ef20: 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61 62 6c 65  m(pWC, p->iTable
ef30: 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7e 28  , p->iColumn, ~(
ef40: 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
ef50: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
ef60: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  erm ){.      Exp
ef70: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
ef80: 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
ef90: 53 65 71 20 2a 70 31 20 3d 20 73 71 6c 69 74 65  Seq *p1 = sqlite
efa0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
efb0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
efc0: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
efd0: 67 68 74 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  ght);.      Coll
efe0: 53 65 71 20 2a 70 32 20 3d 20 73 71 6c 69 74 65  Seq *p2 = sqlite
eff0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
f000: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  rse, p);.      i
f010: 66 28 20 70 31 3d 3d 70 32 20 29 20 63 6f 6e 74  f( p1==p2 ) cont
f020: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
f030: 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 62  if( p->iTable!=b
f040: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
f050: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28 28 28 42      mask |= (((B
f060: 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 29 3b  itmask)1) << i);
f070: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 45  .  }..  for(i=nE
f080: 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26 20 69 3c  qCol; mask && i<
f090: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
f0a0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 78  ++){.    int iEx
f0b0: 70 72 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f  pr = findIndexCo
f0c0: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
f0d0: 6e 63 74 2c 20 62 61 73 65 2c 20 70 49 64 78 2c  nct, base, pIdx,
f0e0: 20 69 29 3b 0a 20 20 20 20 69 66 28 20 69 45 78   i);.    if( iEx
f0f0: 70 72 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  pr<0 ) break;.  
f100: 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28 28 42 69    mask &= ~(((Bi
f110: 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 45 78 70  tmask)1) << iExp
f120: 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
f130: 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d 0a 0a  n (mask==0);.}..
f140: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
f150: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
f160: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
f170: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
f180: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
f190: 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
f1a0: 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74   A DISTINCT list
f1b0: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66   is redundant if
f1c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
f1d0: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e 49 51  ntains a.** UNIQ
f1e0: 55 45 20 69 6e 64 65 78 20 74 68 61 74 20 67 75  UE index that gu
f1f0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
f200: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
f210: 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 64 69  query will be di
f220: 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77 61 79  stinct.** anyway
f230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f240: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
f250: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
f260: 61 72 73 65 2c 0a 20 20 53 72 63 4c 69 73 74 20  arse,.  SrcList 
f270: 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20 57 68 65  *pTabList,.  Whe
f280: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
f290: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
f2a0: 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c 65 20  inct.){.  Table 
f2b0: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
f2c0: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2e0: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
f2f0: 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
f300: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
f310: 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
f320: 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
f330: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
f340: 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
f350: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
f360: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
f370: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
f380: 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
f390: 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
f3a0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
f3b0: 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
f3c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
f3d0: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
f3e0: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
f3f0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
f400: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
f410: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
f420: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
f430: 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
f440: 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
f450: 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
f460: 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
f470: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
f480: 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
f490: 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
f4a0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
f4b0: 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
f4c0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
f4d0: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
f4e0: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
f4f0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f500: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
f510: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
f520: 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e 61  ate(pDistinct->a
f530: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
f540: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
f550: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
f560: 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69  e==iBase && p->i
f570: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
f580: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  n 1;.  }..  /* L
f590: 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
f5a0: 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
f5b0: 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65  able, checking e
f5c0: 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69 74  ach to see if it
f5d0: 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20   makes.  ** the 
f5e0: 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
f5f0: 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74  er redundant. It
f600: 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a   does so if:.  *
f610: 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20  *.  **   1. The 
f620: 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66 20  index is itself 
f630: 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a  UNIQUE, and.  **
f640: 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f  .  **   2. All o
f650: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
f660: 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 65   the index are e
f670: 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74 68  ither part of th
f680: 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a  e pDistinct.  **
f690: 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65        list, or e
f6a0: 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  lse the WHERE cl
f6b0: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ause contains a 
f6c0: 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
f6d0: 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20   "col=X",.  **  
f6e0: 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20 61      where X is a
f6f0: 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e   constant value.
f700: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
f710: 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  equences of the.
f720: 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72    **      compar
f730: 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d  ison and select-
f740: 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  list expressions
f750: 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73   must match thos
f760: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  e of the index..
f770: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41    **.  **   3. A
f780: 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64 65  ll of those inde
f790: 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68  x columns for wh
f7a0: 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  ich the WHERE cl
f7b0: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ause does not.  
f7c0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
f7d0: 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61  a "col=X" term a
f7e0: 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61 20  re subject to a 
f7f0: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
f800: 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
f810: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f820: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f830: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f840: 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
f850: 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e  r==OE_None ) con
f860: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
f870: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
f880: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
f890: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78   int iCol = pIdx
f8a0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
f8b0: 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64       if( 0==find
f8c0: 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c  Term(pWC, iBase,
f8d0: 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b   iCol, ~(Bitmask
f8e0: 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
f8f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
f900: 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e  iIdxCol = findIn
f910: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
f920: 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c  Distinct, iBase,
f930: 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20   pIdx, i);.     
f940: 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30     if( iIdxCol<0
f950: 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   || pTab->aCol[p
f960: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
f970: 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  ].notNull==0 ){.
f980: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f990: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f9a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
f9b0: 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
f9c0: 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  n ){.      /* Th
f9d0: 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73  is index implies
f9e0: 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
f9f0: 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  CT qualifier is 
fa00: 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20  redundant. */.  
fa10: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
fa20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
fa30: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
fa40: 65 70 61 72 65 20 61 20 63 72 75 64 65 20 65 73  epare a crude es
fa50: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f  timate of the lo
fa60: 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69  garithm of the i
fa70: 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  nput value..** T
fa80: 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20  he results need 
fa90: 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20 54  not be exact.  T
faa0: 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  his is only used
fab0: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
fac0: 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73  ** the total cos
fad0: 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20  t of performing 
fae0: 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20  operations with 
faf0: 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f  O(logN) or O(Nlo
fb00: 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74  gN).** complexit
fb10: 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69 73  y.  Because N is
fb20: 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20 69   just a guess, i
fb30: 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72  t is no great tr
fb40: 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e  agedy if.** logN
fb50: 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66   is a little off
fb60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  ..*/.static doub
fb70: 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65  le estLog(double
fb80: 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f   N){.  double lo
fb90: 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65  gN = 1;.  double
fba0: 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65   x = 10;.  while
fbb0: 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67  ( N>x ){.    log
fbc0: 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d  N += 1;.    x *=
fbd0: 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   10;.  }.  retur
fbe0: 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n logN;.}../*.**
fbf0: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
fc00: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
fc10: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
fc20: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
fc30: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
fc40: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
fc50: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
fc60: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
fc70: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
fc80: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
fc90: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
fca0: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
fcb0: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
fcc0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
fcd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
fce0: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
fcf0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
fd00: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  ).static void TR
fd10: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73  ACE_IDX_INPUTS(s
fd20: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
fd30: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
fd40: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
fd50: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
fd60: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
fd70: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
fd80: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
fd90: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
fda0: 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20  constraint[%d]: 
fdb0: 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64  col=%d termid=%d
fdc0: 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25   op=%d usabled=%
fdd0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
fde0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
fdf0: 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  raint[i].iColumn
fe00: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
fe10: 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d  straint[i].iTerm
fe20: 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70  Offset,.       p
fe30: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
fe40: 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  .op,.       p->a
fe50: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
fe60: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  able);.  }.  for
fe70: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65  (i=0; i<p->nOrde
fe80: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  rBy; i++){.    s
fe90: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
fea0: 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d  f("  orderby[%d]
feb0: 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64  : col=%d desc=%d
fec0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
fed0: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
fee0: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  y[i].iColumn,.  
fef0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
ff00: 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d  [i].desc);.  }.}
ff10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
ff20: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73  CE_IDX_OUTPUTS(s
ff30: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
ff40: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
ff50: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
ff60: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
ff70: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
ff80: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
ff90: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
ffa0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
ffb0: 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49  usage[%d]: argvI
ffc0: 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22  dx=%d omit=%d\n"
ffd0: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
ffe0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
fff0: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
10000 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  dex,.       p->a
10010 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10020 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  i].omit);.  }.  
10030 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
10040 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c  tf("  idxNum=%d\
10050 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a  n", p->idxNum);.
10060 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
10070 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25  intf("  idxStr=%
10080 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29  s\n", p->idxStr)
10090 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
100a0 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42  Printf("  orderB
100b0 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c  yConsumed=%d\n",
100c0 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75   p->orderByConsu
100d0 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  med);.  sqlite3D
100e0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
100f0 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e  timatedCost=%g\n
10100 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43  ", p->estimatedC
10110 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ost);.}.#else.#d
10120 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
10130 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
10140 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
10150 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 2f  UTS(A).#endif../
10160 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65 64 20 62  * .** Required b
10170 65 63 61 75 73 65 20 62 65 73 74 49 6e 64 65 78  ecause bestIndex
10180 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  () is called by 
10190 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
101a0 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  x() .*/.static v
101b0 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 57 68  oid bestIndex(Wh
101c0 65 72 65 42 65 73 74 49 64 78 2a 29 3b 0a 0a 2f  ereBestIdx*);../
101d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
101e0 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  e attempts to fi
101f0 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20 73  nd an scanning s
10200 74 72 61 74 65 67 79 20 74 68 61 74 20 63 61 6e  trategy that can
10210 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   be used .** to 
10220 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52 27  optimize an 'OR'
10230 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
10240 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 57 48   is part of a WH
10250 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a  ERE clause. .**.
10260 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 73 73  ** The table ass
10270 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 52 4f  ociated with FRO
10280 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 53  M clause term pS
10290 72 63 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  rc may be either
102a0 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42 2d   a.** regular B-
102b0 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20 61 20  Tree table or a 
102c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
102d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
102e0 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
102f0 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70 29  WhereBestIdx *p)
10300 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
10310 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
10320 41 54 49 4f 4e 0a 20 20 57 68 65 72 65 43 6c 61  ATION.  WhereCla
10330 75 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57  use *pWC = p->pW
10340 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
10350 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
10360 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
10370 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20  List_item *pSrc 
10380 3d 20 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68  = p->pSrc; /* Th
10390 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
103a0 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
103b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 75 72    const int iCur
103c0 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
103d0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ;      /* The cu
103e0 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
103f0 65 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69  e  */.  const Bi
10400 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20  tmask maskSrc = 
10410 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
10420 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20 2f  skSet, iCur);  /
10430 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 70 53  * Bitmask for pS
10440 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  rc */.  WhereTer
10450 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e 64  m * const pWCEnd
10460 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
10470 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f  nTerm];        /
10480 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
10490 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
104a0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
104b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
104c0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
104d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
104e0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 52   */..  /* The OR
104f0 2d 63 6c 61 75 73 65 20 6f 70 74 69 6d 69 7a 61  -clause optimiza
10500 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
10510 65 64 20 69 66 20 74 68 65 20 49 4e 44 45 58 45  ed if the INDEXE
10520 44 20 42 59 20 6f 72 0a 20 20 2a 2a 20 4e 4f 54  D BY or.  ** NOT
10530 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 73   INDEXED clauses
10540 20 61 72 65 20 75 73 65 64 20 6f 72 20 69 66 20   are used or if 
10550 74 68 65 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  the WHERE_AND_ON
10560 4c 59 20 62 69 74 20 69 73 20 73 65 74 2e 20 2a  LY bit is set. *
10570 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f  /.  if( pSrc->no
10580 74 49 6e 64 65 78 65 64 20 7c 7c 20 70 53 72 63  tIndexed || pSrc
10590 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  ->pIndex!=0 ){. 
105a0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
105b0 20 69 66 28 20 70 57 43 2d 3e 77 63 74 72 6c 46   if( pWC->wctrlF
105c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44  lags & WHERE_AND
105d0 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 72 65 74  _ONLY ){.    ret
105e0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  urn;.  }..  /* S
105f0 65 61 72 63 68 20 74 68 65 20 57 48 45 52 45 20  earch the WHERE 
10600 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72  clause terms for
10610 20 61 20 75 73 61 62 6c 65 20 57 4f 5f 4f 52 20   a usable WO_OR 
10620 74 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  term. */.  for(p
10630 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
10640 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
10650 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
10660 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
10670 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
10680 26 26 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72  && ((pTerm->prer
10690 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63  eqAll & ~maskSrc
106a0 29 20 26 20 70 2d 3e 6e 6f 74 52 65 61 64 79 29  ) & p->notReady)
106b0 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  ==0.     && (pTe
106c0 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
106d0 6e 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53  ndexable & maskS
106e0 72 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  rc)!=0 .    ){. 
106f0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
10700 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
10710 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
10720 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
10730 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
10740 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
10750 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
10760 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
10770 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
10780 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
10790 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
107a0 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f        double rTo
107b0 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  tal = 0;.      d
107c0 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a  ouble nRow = 0;.
107d0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73        Bitmask us
107e0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 57 68  ed = 0;.      Wh
107f0 65 72 65 42 65 73 74 49 64 78 20 73 42 4f 49 3b  ereBestIdx sBOI;
10800 0a 0a 20 20 20 20 20 20 73 42 4f 49 20 3d 20 2a  ..      sBOI = *
10810 70 3b 0a 20 20 20 20 20 20 73 42 4f 49 2e 70 4f  p;.      sBOI.pO
10820 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
10830 20 20 73 42 4f 49 2e 70 44 69 73 74 69 6e 63 74    sBOI.pDistinct
10840 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 42 4f 49   = 0;.      sBOI
10850 2e 70 70 49 64 78 49 6e 66 6f 20 3d 20 30 3b 0a  .ppIdxInfo = 0;.
10860 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72        for(pOrTer
10870 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54  m=pOrWC->a; pOrT
10880 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
10890 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
108a0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
108b0 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f  .. Multi-index O
108c0 52 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 65  R testing for te
108d0 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c  rm %d of %d....\
108e0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  n", .          (
108f0 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72 57 43 2d  pOrTerm - pOrWC-
10900 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d 20 70 57  >a), (pTerm - pW
10910 43 2d 3e 61 29 0a 20 20 20 20 20 20 20 20 29 29  C->a).        ))
10920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
10930 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
10940 72 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b  r& WO_AND)!=0 ){
10950 0a 20 20 20 20 20 20 20 20 20 20 73 42 4f 49 2e  .          sBOI.
10960 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
10970 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
10980 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49 6e            bestIn
10990 64 65 78 28 26 73 42 4f 49 29 3b 0a 20 20 20 20  dex(&sBOI);.    
109a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
109b0 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
109c0 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
109d0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
109e0 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20   tempWC;.       
109f0 20 20 20 74 65 6d 70 57 43 2e 70 50 61 72 73 65     tempWC.pParse
10a00 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a   = pWC->pParse;.
10a10 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
10a20 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d  .pMaskSet = pWC-
10a30 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20 20  >pMaskSet;.     
10a40 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74       tempWC.pOut
10a50 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20  er = pWC;.      
10a60 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20      tempWC.op = 
10a70 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  TK_AND;.        
10a80 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
10a90 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
10aa0 74 65 6d 70 57 43 2e 77 63 74 72 6c 46 6c 61 67  tempWC.wctrlFlag
10ab0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
10ac0 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20   tempWC.nTerm = 
10ad0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 42 4f  1;.          sBO
10ae0 49 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b  I.pWC = &tempWC;
10af0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49  .          bestI
10b00 6e 64 65 78 28 26 73 42 4f 49 29 3b 0a 20 20 20  ndex(&sBOI);.   
10b10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10b20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
10b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10b40 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 42 4f 49    rTotal += sBOI
10b50 2e 63 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20 20  .cost.rCost;.   
10b60 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73 42 4f       nRow += sBO
10b70 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77  I.cost.plan.nRow
10b80 3b 0a 20 20 20 20 20 20 20 20 75 73 65 64 20 7c  ;.        used |
10b90 3d 20 73 42 4f 49 2e 63 6f 73 74 2e 75 73 65 64  = sBOI.cost.used
10ba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 54  ;.        if( rT
10bb0 6f 74 61 6c 3e 3d 70 2d 3e 63 6f 73 74 2e 72 43  otal>=p->cost.rC
10bc0 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ost ) break;.   
10bd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
10be0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
10bf0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
10c00 6e 63 72 65 61 73 65 20 74 68 65 20 73 63 61 6e  ncrease the scan
10c10 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75 6e 74   cost to account
10c20 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74   .      ** for t
10c30 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73  he cost of the s
10c40 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ort. */.      if
10c50 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ( p->pOrderBy!=0
10c60 20 29 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52   ){.        WHER
10c70 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72  ETRACE(("... sor
10c80 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 4f  ting increases O
10c90 52 20 63 6f 73 74 20 25 2e 39 67 20 74 6f 20 25  R cost %.9g to %
10ca0 2e 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  .9g\n",.        
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 72 54 6f 74              rTot
10cc0 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f 77 2a  al, rTotal+nRow*
10cd0 65 73 74 4c 6f 67 28 6e 52 6f 77 29 29 29 3b 0a  estLog(nRow)));.
10ce0 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b          rTotal +
10cf0 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52  = nRow*estLog(nR
10d00 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ow);.      }..  
10d10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
10d20 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75  st of scanning u
10d30 73 69 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72  sing this OR ter
10d40 6d 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69  m for optimizati
10d50 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  on is.      ** l
10d60 65 73 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ess than the cur
10d70 72 65 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64  rent cost stored
10d80 20 69 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61   in pCost, repla
10d90 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ce the contents.
10da0 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73        ** of pCos
10db0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52  t. */.      WHER
10dc0 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c  ETRACE(("... mul
10dd0 74 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74  ti-index OR cost
10de0 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c  =%.9g nrow=%.9g\
10df0 6e 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77  n", rTotal, nRow
10e00 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54  ));.      if( rT
10e10 6f 74 61 6c 3c 70 2d 3e 63 6f 73 74 2e 72 43 6f  otal<p->cost.rCo
10e20 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  st ){.        p-
10e30 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 72 54  >cost.rCost = rT
10e40 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  otal;.        p-
10e50 3e 63 6f 73 74 2e 75 73 65 64 20 3d 20 75 73 65  >cost.used = use
10e60 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  d;.        p->co
10e70 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e  st.plan.nRow = n
10e80 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Row;.        p->
10e90 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  cost.plan.nOBSat
10ea0 20 3d 20 70 2d 3e 69 20 3f 20 70 2d 3e 61 4c 65   = p->i ? p->aLe
10eb0 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e  vel[p->i-1].plan
10ec0 2e 6e 4f 42 53 61 74 20 3a 20 30 3b 0a 20 20 20  .nOBSat : 0;.   
10ed0 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61       p->cost.pla
10ee0 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c 61 67  n.wsFlags = flag
10ef0 73 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  s;.        p->co
10f00 73 74 2e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 20  st.plan.u.pTerm 
10f10 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
10f20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
10f30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
10f40 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
10f50 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   */.}..#ifndef S
10f60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
10f70 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
10f80 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10f90 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10fa0 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
10fb0 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
10fc0 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
10fd0 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
10fe0 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
10ff0 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
11000 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
11010 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
11020 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
11030 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
11040 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11060 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11070 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
11080 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
11090 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
110a0 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
110b0 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
110c0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
110d0 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
110e0 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
110f0 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
11100 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
11110 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
11120 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
11130 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
11140 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
11150 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
11160 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d  rator & WO_EQ)==
11170 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11180 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
11190 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
111a0 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  dy)!=0 ) return 
111b0 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
111c0 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
111d0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
111e0 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
111f0 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
11200 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
11210 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
11220 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
11230 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   1;.}.#endif..#i
11240 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11250 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
11260 58 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71  X./*.** If the q
11270 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 70 53  uery plan for pS
11280 72 63 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  rc specified in 
11290 70 43 6f 73 74 20 69 73 20 61 20 66 75 6c 6c 20  pCost is a full 
112a0 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 61 6e  table scan.** an
112b0 64 20 69 6e 64 65 78 69 6e 67 20 69 73 20 61 6c  d indexing is al
112c0 6c 6f 77 73 20 28 69 66 20 74 68 65 72 65 20 69  lows (if there i
112d0 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44  s no NOT INDEXED
112e0 20 63 6c 61 75 73 65 29 20 61 6e 64 20 69 74 0a   clause) and it.
112f0 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ** possible to c
11300 6f 6e 73 74 72 75 63 74 20 61 20 74 72 61 6e 73  onstruct a trans
11310 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61 74 20  ient index that 
11320 77 6f 75 6c 64 20 70 65 72 66 6f 72 6d 20 62 65  would perform be
11330 74 74 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20 66  tter.** than a f
11340 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 65  ull table scan e
11350 76 65 6e 20 77 68 65 6e 20 74 68 65 20 63 6f 73  ven when the cos
11360 74 20 6f 66 20 63 6f 6e 73 74 72 75 63 74 69 6e  t of constructin
11370 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69  g the index.** i
11380 73 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63  s taken into acc
11390 6f 75 6e 74 2c 20 74 68 65 6e 20 61 6c 74 65 72  ount, then alter
113a0 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
113b0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 74 72  to use the.** tr
113c0 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 2e 0a 2a  ansient index..*
113d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
113e0 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  stAutomaticIndex
113f0 28 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70  (WhereBestIdx *p
11400 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
11410 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 20  se = p->pParse; 
11420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11430 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
11440 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
11450 73 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43  se *pWC = p->pWC
11460 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
11470 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
11480 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
11490 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20  List_item *pSrc 
114a0 3d 20 70 2d 3e 70 53 72 63 3b 20 20 2f 2a 20 54  = p->pSrc;  /* T
114b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
114c0 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
114d0 0a 20 20 64 6f 75 62 6c 65 20 6e 54 61 62 6c 65  .  double nTable
114e0 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
114f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
11500 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61   in the input ta
11510 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ble */.  double 
11520 6c 6f 67 4e 3b 20 20 20 20 20 20 20 20 20 20 20  logN;           
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11540 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29  * log(nTableRow)
11550 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73   */.  double cos
11560 74 54 65 6d 70 49 64 78 3b 20 20 20 20 20 20 20  tTempIdx;       
11570 20 20 2f 2a 20 70 65 72 2d 71 75 65 72 79 20 63    /* per-query c
11580 6f 73 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ost of the trans
11590 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
115a0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
115b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
115c0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
115d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
115e0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
115f0 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20  *pWCEnd;        
11600 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
11610 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20  >a[] */.  Table 
11620 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
11630 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
11640 68 74 20 6d 69 67 68 74 20 62 65 20 69 6e 64 65  ht might be inde
11650 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  xed */..  if( pP
11660 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
11670 3c 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20  <=(double)1 ){. 
11680 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
11690 6f 20 70 6f 69 6e 74 20 69 6e 20 62 75 69 6c 64  o point in build
116a0 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
116b0 20 69 6e 64 65 78 20 66 6f 72 20 61 20 73 69 6e   index for a sin
116c0 67 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  gle scan */.    
116d0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
116e0 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  ( (pParse->db->f
116f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
11700 74 6f 49 6e 64 65 78 29 3d 3d 30 20 29 7b 0a 20  toIndex)==0 ){. 
11710 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20     /* Automatic 
11720 69 6e 64 69 63 65 73 20 61 72 65 20 64 69 73 61  indices are disa
11730 62 6c 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  bled at run-time
11740 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
11750 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 63 6f    }.  if( (p->co
11760 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
11770 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
11780 53 43 41 4e 29 21 3d 30 0a 20 20 20 26 26 20 28  SCAN)!=0.   && (
11790 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46  p->cost.plan.wsF
117a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 56  lags & WHERE_COV
117b0 45 52 5f 53 43 41 4e 29 3d 3d 30 0a 20 20 29 7b  ER_SCAN)==0.  ){
117c0 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c 72 65 61  .    /* We alrea
117d0 64 79 20 68 61 76 65 20 73 6f 6d 65 20 6b 69 6e  dy have some kin
117e0 64 20 6f 66 20 69 6e 64 65 78 20 69 6e 20 75 73  d of index in us
117f0 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
11800 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
11810 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
11820 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  >viaCoroutine ){
11830 0a 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 69  .    /* Cannot i
11840 6e 64 65 78 20 61 20 63 6f 2d 72 6f 75 74 69 6e  ndex a co-routin
11850 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  e */.    return;
11860 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
11870 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a 20  >notIndexed ){. 
11880 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20 49 4e     /* The NOT IN
11890 44 45 58 45 44 20 63 6c 61 75 73 65 20 61 70 70  DEXED clause app
118a0 65 61 72 73 20 69 6e 20 74 68 65 20 53 51 4c 2e  ears in the SQL.
118b0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
118c0 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
118d0 69 73 43 6f 72 72 65 6c 61 74 65 64 20 29 7b 0a  isCorrelated ){.
118e0 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63      /* The sourc
118f0 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
11900 64 20 73 75 62 2d 71 75 65 72 79 2e 20 4e 6f 20  d sub-query. No 
11910 70 6f 69 6e 74 20 69 6e 20 69 6e 64 65 78 69 6e  point in indexin
11920 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74  g it. */.    ret
11930 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  urn;.  }..  asse
11940 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  rt( pParse->nQue
11950 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62 6c  ryLoop >= (doubl
11960 65 29 31 20 29 3b 0a 20 20 70 54 61 62 6c 65 20  e)1 );.  pTable 
11970 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
11980 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70 54 61 62  nTableRow = pTab
11990 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 6c  le->nRowEst;.  l
119a0 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54 61  ogN = estLog(nTa
119b0 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74 54  bleRow);.  costT
119c0 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a  empIdx = 2*logN*
119d0 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61 72 73  (nTableRow/pPars
119e0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 20  e->nQueryLoop + 
119f0 31 29 3b 0a 20 20 69 66 28 20 63 6f 73 74 54 65  1);.  if( costTe
11a00 6d 70 49 64 78 3e 3d 70 2d 3e 63 6f 73 74 2e 72  mpIdx>=p->cost.r
11a10 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Cost ){.    /* T
11a20 68 65 20 63 6f 73 74 20 6f 66 20 63 72 65 61 74  he cost of creat
11a30 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
11a40 74 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 62 65  t table would be
11a50 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20   greater than.  
11a60 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20 66    ** doing the f
11a70 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a  ull table scan *
11a80 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
11a90 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  }..  /* Search f
11aa0 6f 72 20 61 6e 79 20 65 71 75 61 6c 69 74 79 20  or any equality 
11ab0 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d 20  comparison term 
11ac0 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  */.  pWCEnd = &p
11ad0 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
11ae0 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ];.  for(pTerm=p
11af0 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
11b00 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
11b10 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
11b20 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
11b30 70 53 72 63 2c 20 70 2d 3e 6e 6f 74 52 65 61 64  pSrc, p->notRead
11b40 79 29 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52  y) ){.      WHER
11b50 45 54 52 41 43 45 28 28 22 61 75 74 6f 2d 69 6e  ETRACE(("auto-in
11b60 64 65 78 20 72 65 64 75 63 65 73 20 63 6f 73 74  dex reduces cost
11b70 20 66 72 6f 6d 20 25 2e 31 66 20 74 6f 20 25 2e   from %.1f to %.
11b80 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  1f\n",.         
11b90 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63 6f             p->co
11ba0 73 74 2e 72 43 6f 73 74 2c 20 63 6f 73 74 54 65  st.rCost, costTe
11bb0 6d 70 49 64 78 29 29 3b 0a 20 20 20 20 20 20 70  mpIdx));.      p
11bc0 2d 3e 63 6f 73 74 2e 72 43 6f 73 74 20 3d 20 63  ->cost.rCost = c
11bd0 6f 73 74 54 65 6d 70 49 64 78 3b 0a 20 20 20 20  ostTempIdx;.    
11be0 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e    p->cost.plan.n
11bf0 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20 31 3b 0a  Row = logN + 1;.
11c00 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c        p->cost.pl
11c10 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  an.wsFlags = WHE
11c20 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  RE_TEMP_INDEX;. 
11c30 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 75 73 65       p->cost.use
11c40 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  d = pTerm->prere
11c50 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62 72  qRight;.      br
11c60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
11c70 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
11c80 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  bestAutomaticInd
11c90 65 78 28 41 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ex(A)  /* no-op 
11ca0 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  */.#endif /* SQL
11cb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
11cc0 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69  IC_INDEX */...#i
11cd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11ce0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
11cf0 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  X./*.** Generate
11d00 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75   code to constru
11d10 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
11d20 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d  ect for an autom
11d30 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  atic index.** an
11d40 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20  d to set up the 
11d50 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63  WhereLevel objec
11d60 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74  t pLevel so that
11d70 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
11d80 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65  tor.** makes use
11d90 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69   of the automati
11da0 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  c index..*/.stat
11db0 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63  ic void construc
11dc0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
11dd0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11df0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
11e00 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
11e10 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
11e20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
11e30 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
11e40 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
11e50 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
11e60 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
11e70 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e  erm to get the n
11e80 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  ext index */.  B
11e90 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
11ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
11eb0 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
11ec0 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
11ed0 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  able */.  WhereL
11ee0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20  evel *pLevel    
11ef0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
11f00 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f  ew index here */
11f10 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d  .){.  int nColum
11f20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
11f30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
11f40 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
11f50 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20  nstructed index 
11f60 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
11f70 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
11f80 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
11f90 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
11fa0 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
11fb0 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
11fc0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
11fd0 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69   pWC->a[] */.  i
11fe0 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
11ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
12000 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65  te of memory nee
12010 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a  ded for pIdx */.
12020 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12040 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   Object describi
12050 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  ng the transient
12060 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
12070 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
12080 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
12090 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
120a0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
120b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e   */.  int addrIn
120c0 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
120d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
120e0 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
120f0 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a  on bypass jump *
12100 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  /.  Table *pTabl
12110 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12120 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
12130 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  ng indexed */.  
12140 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66  KeyInfo *pKeyinf
12150 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  o;          /* K
12160 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ey information f
12170 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20  or the index */ 
12180 20 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70    .  int addrTop
12190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
121a0 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
121b0 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
121c0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
121d0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
121e0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
121f0 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
12200 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12220 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
12230 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
12240 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
12250 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
12260 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
12270 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
12280 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
12290 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
122a0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
122b0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122d0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
122e0 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
122f0 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  n */.  Bitmask i
12300 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  dxCols;         
12310 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
12320 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72  columns used for
12330 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
12340 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73  itmask extraCols
12350 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69  ;          /* Bi
12360 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e  tmap of addition
12370 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  al columns */.. 
12380 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
12390 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
123a0 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
123b0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
123c0 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
123d0 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
123e0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
123f0 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
12400 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
12410 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
12420 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
12430 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
12440 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
12450 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43  pParse);..  /* C
12460 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
12470 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
12480 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
12490 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
124a0 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
124b0 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
124c0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
124d0 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70  nColumn = 0;.  p
124e0 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
124f0 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
12500 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
12510 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20  m];.  idxCols = 
12520 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
12530 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
12540 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
12550 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
12560 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
12570 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
12580 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
12590 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
125a0 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
125b0 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
125c0 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74  Col>=BMS ? ((Bit
125d0 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
125e0 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   : ((Bitmask)1)<
125f0 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73  <iCol;.      tes
12600 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
12610 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12620 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
12630 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  );.      if( (id
12640 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
12650 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f  0 ){.        nCo
12660 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
12670 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
12680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12690 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43    }.  assert( nC
126a0 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65  olumn>0 );.  pLe
126b0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20  vel->plan.nEq = 
126c0 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43  nColumn;..  /* C
126d0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
126e0 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
126f0 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
12700 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
12710 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
12720 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
12730 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
12740 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
12750 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
12760 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
12770 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
12780 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
12790 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
127a0 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
127b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
127c0 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
127d0 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
127e0 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
127f0 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
12800 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
12810 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
12820 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
12830 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
12840 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
12850 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
12860 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
12870 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
12880 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
12890 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
128a0 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
128b0 64 78 43 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d  dxCols | (((Bitm
128c0 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29  ask)1)<<(BMS-1))
128d0 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
128e0 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d  (pTable->nCol >=
128f0 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20   BMS-1) ? BMS-1 
12900 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a  : pTable->nCol;.
12910 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
12920 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
12930 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
12940 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
12950 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
12960 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
12970 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
12980 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73  Cols & (((Bitmas
12990 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75  k)1)<<i) ) nColu
129a0 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
129b0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
129c0 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
129d0 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e  BMS-1)) ){.    n
129e0 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65  Column += pTable
129f0 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
12a00 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e  ;.  }.  pLevel->
12a10 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
12a20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
12a30 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  | WHERE_IDX_ONLY
12a40 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20   | WO_EQ;..  /* 
12a50 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
12a60 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
12a70 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
12a80 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73  x */.  nByte = s
12a90 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20  izeof(Index);.  
12aa0 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
12ab0 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20  *sizeof(int);   
12ac0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
12ad0 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  umn */.  nByte +
12ae0 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
12af0 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e  (char*);   /* In
12b00 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20  dex.azColl */.  
12b10 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
12b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12b30 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
12b40 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20  Order */.  pIdx 
12b50 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
12b60 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
12b70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
12b80 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
12b90 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  ;.  pLevel->plan
12ba0 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  .u.pIdx = pIdx;.
12bb0 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d    pIdx->azColl =
12bc0 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78 5b 31   (char**)&pIdx[1
12bd0 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ];.  pIdx->aiCol
12be0 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 64  umn = (int*)&pId
12bf0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d  x->azColl[nColum
12c00 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72  n];.  pIdx->aSor
12c10 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
12c20 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  Idx->aiColumn[nC
12c30 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e  olumn];.  pIdx->
12c40 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e  zName = "auto-in
12c50 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43  dex";.  pIdx->nC
12c60 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  olumn = nColumn;
12c70 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
12c80 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
12c90 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
12ca0 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
12cb0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
12cc0 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
12cd0 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
12ce0 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
12cf0 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
12d00 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
12d10 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
12d20 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
12d30 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
12d40 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d  ol>=BMS ? ((Bitm
12d50 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20  ask)1)<<(BMS-1) 
12d60 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  : ((Bitmask)1)<<
12d70 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  iCol;.      if( 
12d80 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
12d90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12da0 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
12db0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
12dc0 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
12dd0 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
12de0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
12df0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
12e00 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
12e10 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
12e20 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
12e30 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
12e40 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
12e50 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
12e60 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53  Coll[n] = ALWAYS
12e70 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d  (pColl) ? pColl-
12e80 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59  >zName : "BINARY
12e90 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  ";.        n++;.
12ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12eb0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32  }.  assert( (u32
12ec0 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  )n==pLevel->plan
12ed0 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
12ee0 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
12ef0 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
12f00 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
12f10 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
12f20 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
12f30 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
12f40 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
12f50 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
12f60 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73  Cols & (((Bitmas
12f70 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20 20 20 20  k)1)<<i) ){.    
12f80 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
12f90 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
12fa0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
12fb0 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
12fc0 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
12fd0 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
12fe0 73 65 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b  sed & (((Bitmask
12ff0 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b  )1)<<(BMS-1)) ){
13000 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31  .    for(i=BMS-1
13010 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
13020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  ; i++){.      pI
13030 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
13040 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
13050 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
13060 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
13070 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
13080 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e  sert( n==nColumn
13090 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   );..  /* Create
130a0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
130b0 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e  ndex */.  pKeyin
130c0 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  fo = sqlite3Inde
130d0 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
130e0 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65 72 74   pIdx);.  assert
130f0 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
13100 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  r>=0 );.  sqlite
13110 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13120 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c  P_OpenAutoindex,
13130 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
13140 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a  , nColumn+1, 0,.
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69      (char*)pKeyi
13170 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
13180 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65  HANDOFF);.  Vdbe
13190 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72  Comment((v, "for
131a0 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e   %s", pTable->zN
131b0 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ame));..  /* Fil
131c0 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  l the automatic 
131d0 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65  index with conte
131e0 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  nt */.  addrTop 
131f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13200 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
13210 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
13220 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  r);.  regRecord 
13230 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
13240 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
13250 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
13260 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
13270 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  Idx, pLevel->iTa
13280 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  bCur, regRecord,
13290 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   1);.  sqlite3Vd
132a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
132b0 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
132c0 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
132d0 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
132e0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
132f0 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
13300 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
13310 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13320 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  _Next, pLevel->i
13330 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b  TabCur, addrTop+
13340 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
13350 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
13360 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
13370 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c  UTOINDEX);.  sql
13380 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
13390 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
133a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
133b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
133c0 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f  gRecord);.  .  /
133d0 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
133e0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
133f0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
13400 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13410 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69  pHere(v, addrIni
13420 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  t);.}.#endif /* 
13430 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13440 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
13450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13460 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13470 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
13480 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
13490 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
134a0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
134b0 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
134c0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
134d0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
134e0 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
134f0 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
13500 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
13510 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
13520 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
13530 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
13540 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
13550 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13560 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
13570 6e 66 6f 28 57 68 65 72 65 42 65 73 74 49 64 78  nfo(WhereBestIdx
13580 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
13590 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
135a0 65 3b 20 0a 20 20 57 68 65 72 65 43 6c 61 75 73  e; .  WhereClaus
135b0 65 20 2a 70 57 43 20 3d 20 70 2d 3e 70 57 43 3b  e *pWC = p->pWC;
135c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
135d0 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 70  t_item *pSrc = p
135e0 2d 3e 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69  ->pSrc;.  ExprLi
135f0 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
13600 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
13610 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
13620 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
13630 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13640 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
13650 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
13660 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
13670 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
13680 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
13690 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
136a0 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
136b0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
136c0 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
136d0 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
136e0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
136f0 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43  fo;..  WHERETRAC
13700 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20  E(("Recomputing 
13710 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25  index info for %
13720 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  s...\n", pSrc->p
13730 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  Tab->zName));.. 
13740 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
13750 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
13760 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
13770 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
13780 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ing.  ** to this
13790 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
137a0 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d  /.  for(i=nTerm=
137b0 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
137c0 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
137d0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
137e0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
137f0 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
13800 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
13810 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
13820 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
13830 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
13840 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
13850 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
13860 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
13870 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
13880 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
13890 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
138a0 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ULL );.    if( p
138b0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
138c0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  & (WO_ISNULL) ) 
138d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
138e0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
138f0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
13900 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
13910 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
13920 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
13930 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
13940 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
13950 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
13960 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
13970 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
13980 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
13990 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
139a0 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
139b0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
139c0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
139d0 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
139e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
139f0 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
13a00 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
13a10 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
13a20 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
13a30 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
13a40 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
13a50 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
13a60 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
13a70 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
13a80 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
13a90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
13aa0 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
13ab0 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
13ac0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
13ad0 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
13ae0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
13af0 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
13b00 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
13b10 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
13b20 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
13b30 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b50 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
13b60 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
13b70 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
13b80 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
13ba0 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
13bb0 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
13bc0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
13bd0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13be0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13bf0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
13c00 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62  ");.    /* (doub
13c10 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
13c20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
13c30 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
13c40 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13c50 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
13c60 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
13c70 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
13c80 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
13c90 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
13ca0 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
13cb0 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
13cc0 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
13cd0 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
13ce0 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
13cf0 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
13d00 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
13d10 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
13d20 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
13d30 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
13d40 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
13d50 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
13d60 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13d70 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
13d80 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
13d90 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
13da0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
13db0 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
13dc0 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
13dd0 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
13de0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
13df0 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
13e00 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
13e10 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
13e20 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
13e30 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
13e40 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
13e50 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
13e60 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
13e70 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13e80 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
13e90 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
13ea0 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
13eb0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
13ec0 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
13ed0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
13ee0 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
13ef0 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
13f00 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13f10 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
13f20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
13f30 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f80 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
13f90 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
13fa0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
13fb0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
13fc0 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
13fd0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
13fe0 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
13ff0 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
14000 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
14010 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
14020 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
14030 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
14040 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
14050 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
14060 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
14070 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
14080 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
14090 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
140a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
140b0 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  (WO_ISNULL) ) co
140c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
140d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
140e0 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
140f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
14100 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
14110 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
14120 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
14130 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
14140 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
14150 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
14160 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
14170 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
14180 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
14190 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
141a0 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
141b0 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
141c0 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
141d0 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
141e0 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
141f0 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
14200 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
14210 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
14220 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
14230 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
14240 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
14250 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
14260 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
14270 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
14280 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
14290 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
142a0 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
142b0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
142c0 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
142d0 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
142e0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
142f0 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
14300 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
14310 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
14320 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
14330 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
14340 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14350 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
14360 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
14370 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
14380 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
14390 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
143a0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
143b0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
143c0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
143d0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
143e0 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
143f0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
14400 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
14410 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
14420 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
14430 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
14440 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
14450 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
14460 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
14470 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
14480 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
14490 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
144a0 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
144b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
144c0 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
144d0 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
144e0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
144f0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
14500 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
14510 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
14520 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
14530 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
14540 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
14550 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
14560 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
14570 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
14580 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65 72 20  ex_info pointer 
14590 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
145a0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
145b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
145c0 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
145d0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
145e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
145f0 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
14600 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
14610 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
14620 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
14630 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
14640 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
14650 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14660 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
14670 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
14680 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
14690 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
146a0 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
146b0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
146c0 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
146d0 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
146e0 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
146f0 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
14700 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
14710 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
14720 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
14730 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
14740 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
14750 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
14760 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14770 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
14780 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
14790 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
147a0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
147b0 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
147c0 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
147d0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78 42   WHERETRACE(("xB
147e0 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c  estIndex for %s\
147f0 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
14800 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  );.  TRACE_IDX_I
14810 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
14820 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
14830 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
14840 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
14850 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
14860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14870 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
14880 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
14890 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
148a0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
148b0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
148c0 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
148d0 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
148e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
148f0 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
14900 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
14910 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14920 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14930 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
14940 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
14950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
14960 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
14970 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
14980 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
14990 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
149a0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
149b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  +){.    if( !p->
149c0 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
149d0 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e  sable && p->aCon
149e0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
149f0 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
14a00 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14a10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
14a20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
14a30 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65  s: xBestIndex re
14a40 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
14a50 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a  d plan", pTab->z
14a60 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
14a70 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ..  return pPars
14a80 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a  e->nErr;.}.../*.
14a90 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 62  ** Compute the b
14aa0 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20  est index for a 
14ab0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
14ac0 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69 6e  *.** The best in
14ad0 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64 20  dex is computed 
14ae0 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
14af0 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  x method of the 
14b00 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65  virtual.** table
14b10 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20 72   module.  This r
14b20 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c 79  outine is really
14b30 20 6a 75 73 74 20 61 20 77 72 61 70 70 65 72 20   just a wrapper 
14b40 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a 20  that sets up.** 
14b50 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
14b60 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14b70 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
14b80 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74   communicate wit
14b90 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e  h.** xBestIndex.
14ba0 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e  .**.** In a join
14bb0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
14bc0 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20 6d  ight be called m
14bd0 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66 6f  ultiple times fo
14be0 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69  r the.** same vi
14bf0 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
14c00 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
14c10 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
14c20 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
14c30 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20   initialized on 
14c40 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61  the first invoca
14c50 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
14c60 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  on all subsequen
14c70 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73  t.** invocations
14c80 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
14c90 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
14ca0 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ure is also used
14cb0 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73   when.** code is
14cc0 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61 63   generated to ac
14cd0 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61 6c  cess the virtual
14ce0 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68 65   table.  The whe
14cf0 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a  reInfoDelete() .
14d00 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65 73  ** routine takes
14d10 20 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e 67   care of freeing
14d20 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
14d30 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14d40 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72 79  e after.** every
14d50 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68 65  body has finishe
14d60 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74  d with it..*/.st
14d70 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 56 69  atic void bestVi
14d80 72 74 75 61 6c 49 6e 64 65 78 28 57 68 65 72 65  rtualIndex(Where
14d90 42 65 73 74 49 64 78 20 2a 70 29 7b 0a 20 20 50  BestIdx *p){.  P
14da0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
14db0 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 2f  ->pParse;      /
14dc0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
14dd0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
14de0 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 2d  Clause *pWC = p-
14df0 3e 70 57 43 3b 20 20 20 20 20 20 2f 2a 20 54 68  >pWC;      /* Th
14e00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
14e10 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
14e20 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20  st_item *pSrc = 
14e30 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65 20  p->pSrc; /* The 
14e40 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
14e50 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
14e60 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53  Table *pTab = pS
14e70 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  rc->pTab;.  sqli
14e80 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
14e90 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75  pIdxInfo;.  stru
14ea0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14eb0 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
14ec0 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
14ed0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
14ee0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
14ef0 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
14f00 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
14f10 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74  t i, j, k;.  int
14f20 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74   nOrderBy;.  int
14f30 20 73 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20   sortOrder;     
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f50 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 49  Sort order for I
14f60 4e 20 63 6c 61 75 73 65 73 20 2a 2f 0a 20 20 69  N clauses */.  i
14f70 6e 74 20 62 41 6c 6c 6f 77 49 4e 3b 20 20 20 20  nt bAllowIN;    
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14f90 2a 20 41 6c 6c 6f 77 20 49 4e 20 6f 70 74 69 6d  * Allow IN optim
14fa0 69 7a 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 64 6f  izations */.  do
14fb0 75 62 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f  uble rCost;..  /
14fc0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c  * Make sure wsFl
14fd0 61 67 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ags is initializ
14fe0 65 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20  ed to some sane 
14ff0 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65  value. Otherwise
15000 2c 20 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d  , if the .  ** m
15010 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74  alloc in allocat
15020 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69  eIndexInfo() fai
15030 6c 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ls and this func
15040 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61  tion returns lea
15050 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67  ving.  ** wsFlag
15060 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61  s in an uninitia
15070 6c 69 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65  lized state, the
15080 20 63 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61   caller may beha
15090 76 65 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79  ve unpredictably
150a0 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
150b0 26 70 2d 3e 63 6f 73 74 2c 20 30 2c 20 73 69 7a  &p->cost, 0, siz
150c0 65 6f 66 28 70 2d 3e 63 6f 73 74 29 29 3b 0a 20  eof(p->cost));. 
150d0 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73   p->cost.plan.ws
150e0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
150f0 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f  RTUALTABLE;..  /
15100 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33  * If the sqlite3
15110 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
15120 63 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65  cture has not be
15130 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  en previously.  
15140 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
15150 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68   initialized, th
15160 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  en allocate and 
15170 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f  initialize it no
15180 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  w..  */.  pIdxIn
15190 66 6f 20 3d 20 2a 70 2d 3e 70 70 49 64 78 49 6e  fo = *p->ppIdxIn
151a0 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  fo;.  if( pIdxIn
151b0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 2d  fo==0 ){.    *p-
151c0 3e 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64  >ppIdxInfo = pId
151d0 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
151e0 49 6e 64 65 78 49 6e 66 6f 28 70 29 3b 0a 20 20  IndexInfo(p);.  
151f0 7d 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  }.  if( pIdxInfo
15200 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
15210 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  n;.  }..  /* At 
15220 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
15230 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
15240 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
15250 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74  t pIdxInfo point
15260 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68  s.  ** to will h
15270 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ave been initial
15280 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75 72  ized, either dur
15290 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
152a0 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20  invocation or.  
152b0 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70  ** during some p
152c0 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  rior invocation.
152d0 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61    Now we just ha
152e0 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20  ve to customize 
152f0 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73  the.  ** details
15300 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72   of pIdxInfo for
15310 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76   the current inv
15320 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73  ocation and pass
15330 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73   it to.  ** xBes
15340 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20  tIndex..  */..  
15350 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61  /* The module na
15360 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  me must be defin
15370 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69  ed. Also, by thi
15380 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75  s point there mu
15390 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69  st.  ** be a poi
153a0 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
153b0 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
153c0 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a  e. Otherwise.  *
153d0 2a 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  * sqlite3ViewGet
153e0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f  ColumnNames() wo
153f0 75 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64 20  uld have picked 
15400 75 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20  up the error. . 
15410 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
15420 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20  ab->azModuleArg 
15430 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  && pTab->azModul
15440 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73  eArg[0] );.  ass
15450 65 72 74 28 20 73 71 6c 69 74 65 33 47 65 74 56  ert( sqlite3GetV
15460 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
15470 2c 20 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a  , pTab) );..  /*
15480 20 54 72 79 20 6f 6e 63 65 20 6f 72 20 74 77 69   Try once or twi
15490 63 65 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  ce.  On the firs
154a0 74 20 61 74 74 65 6d 70 74 2c 20 61 6c 6c 6f 77  t attempt, allow
154b0 20 49 4e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   IN optimization
154c0 73 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 20 49 4e  s..  ** If an IN
154d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
154e0 20 61 63 63 65 70 74 65 64 20 62 79 20 74 68 65   accepted by the
154f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78   virtual table x
15500 42 65 73 74 49 6e 64 65 78 0a 20 20 2a 2a 20 6d  BestIndex.  ** m
15510 65 74 68 6f 64 2c 20 62 75 74 20 74 68 65 20 20  ethod, but the  
15520 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  pInfo->aConstrai
15530 6e 55 73 61 67 65 2e 6f 6d 69 74 20 66 6c 61 67  nUsage.omit flag
15540 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
15550 6e 0a 20 20 2a 2a 20 74 68 65 20 71 75 65 72 79  n.  ** the query
15560 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 62   will not work b
15570 65 63 61 75 73 65 20 69 74 20 6d 69 67 68 74 20  ecause it might 
15580 61 6c 6c 6f 77 20 64 75 70 6c 69 63 61 74 65 20  allow duplicate 
15590 72 6f 77 73 20 69 6e 0a 20 20 2a 2a 20 6f 75 74  rows in.  ** out
155a0 70 75 74 2e 20 20 49 6e 20 74 68 61 74 20 63 61  put.  In that ca
155b0 73 65 2c 20 72 75 6e 20 74 68 65 20 78 42 65 73  se, run the xBes
155c0 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 20  tIndex method a 
155d0 73 65 63 6f 6e 64 20 74 69 6d 65 0a 20 20 2a 2a  second time.  **
155e0 20 77 69 74 68 6f 75 74 20 74 68 65 20 49 4e 20   without the IN 
155f0 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 55 73  constraints.  Us
15600 75 61 6c 6c 79 20 74 68 69 73 20 6c 6f 6f 70 20  ually this loop 
15610 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
15620 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 77 69    ** The loop wi
15630 6c 6c 20 65 78 69 74 20 75 73 69 6e 67 20 61 20  ll exit using a 
15640 22 62 72 65 61 6b 22 20 73 74 61 74 65 6d 65 6e  "break" statemen
15650 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 62 41  t..  */.  for(bA
15660 6c 6c 6f 77 49 4e 3d 31 3b 20 31 3b 20 62 41 6c  llowIN=1; 1; bAl
15670 6c 6f 77 49 4e 2d 2d 29 7b 0a 20 20 20 20 61 73  lowIN--){.    as
15680 73 65 72 74 28 20 62 41 6c 6c 6f 77 49 4e 3d 3d  sert( bAllowIN==
15690 30 20 7c 7c 20 62 41 6c 6c 6f 77 49 4e 3d 3d 31  0 || bAllowIN==1
156a0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   );..    /* Set 
156b0 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  the aConstraint[
156c0 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20  ].usable fields 
156d0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
156e0 6c 6c 20 0a 20 20 20 20 2a 2a 20 6f 75 74 70 75  ll .    ** outpu
156f0 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a  t variables to z
15700 65 72 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ero..    **.    
15710 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  ** aConstraint[]
15720 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75 65 20  .usable is true 
15730 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
15740 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
15750 68 61 6e 64 0a 20 20 20 20 2a 2a 20 73 69 64 65  hand.    ** side
15760 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72   contains only r
15770 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
15780 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
15790 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
157a0 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e     ** table.  In
157b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
157c0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
157d0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
157e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
157f0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d          column =
15800 20 65 78 70 72 0a 20 20 20 20 2a 2a 0a 20 20 20   expr.    **.   
15810 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65   ** and we are e
15820 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e  valuating a join
15830 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
15840 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20  raint on column 
15850 69 73 20 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20  is .    ** only 
15860 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62  valid if all tab
15870 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 69  les referenced i
15880 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20  n expr occur to 
15890 74 68 65 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  the left.    ** 
158a0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e  of the table con
158b0 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a  taining column..
158c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
158d0 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d  e aConstraints[]
158e0 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
158f0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
15900 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
15910 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
15920 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77  t table.  That w
15930 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20  ay we only have 
15940 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e  to compute it on
15950 63 65 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 74  ce.    ** even t
15960 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74  hough we might t
15970 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62  ry to pick the b
15980 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70  est index multip
15990 6c 65 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2a  le times..    **
159a0 20 46 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70   For each attemp
159b0 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20  t at picking an 
159c0 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72  index, the order
159d0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
159e0 65 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69  e.    ** join mi
159f0 67 68 74 20 62 65 20 64 69 66 66 65 72 65 6e 74  ght be different
15a00 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72   so we have to r
15a10 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61  ecompute the usa
15a20 62 6c 65 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ble flag.    ** 
15a30 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 2a  each time..    *
15a40 2f 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  /.    pIdxCons =
15a50 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
15a60 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
15a70 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
15a80 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
15a90 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
15aa0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
15ab0 73 61 67 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  sage;.    for(i=
15ac0 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
15ad0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
15ae0 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
15af0 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
15b00 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
15b10 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
15b20 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  C->a[j];.      i
15b30 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
15b40 71 52 69 67 68 74 26 70 2d 3e 6e 6f 74 52 65 61  qRight&p->notRea
15b50 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  dy)==0.       &&
15b60 20 28 62 41 6c 6c 6f 77 49 4e 20 7c 7c 20 28 70   (bAllowIN || (p
15b70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
15b80 26 20 57 4f 5f 49 4e 29 3d 3d 30 29 0a 20 20 20  & WO_IN)==0).   
15b90 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49     ){.        pI
15ba0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
15bb0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
15bc0 0a 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e  .        pIdxCon
15bd0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
15be0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15bf0 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
15c00 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
15c10 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e  [0])*pIdxInfo->n
15c20 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
15c30 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
15c40 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
15c50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15c60 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
15c70 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20  idxStr);.    }. 
15c80 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
15c90 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
15ca0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
15cb0 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
15cc0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
15cd0 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
15ce0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
15cf0 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  umed = 0;.    /*
15d00 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49 6e 20   ((double)2) In 
15d10 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  case of SQLITE_O
15d20 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
15d30 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 70 49 64  NT... */.    pId
15d40 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
15d50 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
15d60 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65  G_DBL / ((double
15d70 29 32 29 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42  )2);.    nOrderB
15d80 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  y = pIdxInfo->nO
15d90 72 64 65 72 42 79 3b 0a 20 20 20 20 69 66 28 20  rderBy;.    if( 
15da0 21 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  !p->pOrderBy ){.
15db0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
15dc0 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
15dd0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 76    }.  .    if( v
15de0 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61  tabBestIndex(pPa
15df0 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49  rse, pTab, pIdxI
15e00 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65  nfo) ){.      re
15e10 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  turn;.    }.  . 
15e20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
15e30 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20  QLITE_SO_ASC;.  
15e40 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
15e50 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15e60 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
15e70 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
15e80 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72  straint;.    for
15e90 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
15ea0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
15eb0 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
15ec0 0a 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67  .      if( pUsag
15ed0 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
15ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   ){.        j = 
15ef0 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
15f00 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70  ffset;.        p
15f10 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
15f20 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 6f  ];.        p->co
15f30 73 74 2e 75 73 65 64 20 7c 3d 20 70 54 65 72 6d  st.used |= pTerm
15f40 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
15f50 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
15f60 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
15f70 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
15f80 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67 65        if( pUsage
15f90 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20  [i].omit==0 ){. 
15fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
15fb0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
15fc0 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  use an IN constr
15fd0 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72 74  aint if the virt
15fe0 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
15ff0 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68        ** says th
16000 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  at the equivalen
16010 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  t EQ constraint 
16020 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79  cannot be safely
16030 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20   omitted..      
16040 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64        ** If we d
16050 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  o attempt to use
16060 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69   such a constrai
16070 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69  nt, some rows mi
16080 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20 20  ght be.         
16090 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69     ** repeated i
160a0 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f  n the output. */
160b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
160c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
160d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
160e0 30 3b 20 6b 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; k<pIdxInfo->n
160f0 4f 72 64 65 72 42 79 3b 20 6b 2b 2b 29 7b 0a 20  OrderBy; k++){. 
16100 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
16110 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
16120 79 5b 6b 5d 2e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  y[k].iColumn==pI
16130 64 78 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 20  dxCons->iColumn 
16140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
16150 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64   sortOrder = pId
16160 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b  xInfo->aOrderBy[
16170 6b 5d 2e 64 65 73 63 3b 0a 20 20 20 20 20 20 20  k].desc;.       
16180 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
161a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
161b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
161c0 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78 49      if( i>=pIdxI
161d0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
161e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
161f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
16200 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
16210 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20 73 65  ause, and the se
16220 6c 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 74  lected virtual t
16230 61 62 6c 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20  able index.  ** 
16240 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79  does not satisfy
16250 20 69 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68   it, increase th
16260 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73 63  e cost of the sc
16270 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  an accordingly. 
16280 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74 63 68 65  This.  ** matche
16290 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
162a0 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74 75 61 6c   for non-virtual
162b0 20 74 61 62 6c 65 73 20 69 6e 20 62 65 73 74 42   tables in bestB
162c0 74 72 65 65 49 6e 64 65 78 28 29 2e 0a 20 20 2a  treeIndex()..  *
162d0 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70 49 64 78  /.  rCost = pIdx
162e0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
162f0 6f 73 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  ost;.  if( p->pO
16300 72 64 65 72 42 79 20 26 26 20 70 49 64 78 49 6e  rderBy && pIdxIn
16310 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
16320 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43  med==0 ){.    rC
16330 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43  ost += estLog(rC
16340 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a  ost)*rCost;.  }.
16350 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69  .  /* The cost i
16360 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
16370 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
16380 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28  SQLITE_BIG_DBL (
16390 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20  the.  ** inital 
163a0 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43  value of lowestC
163b0 6f 73 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70  ost in this loop
163c0 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  . If it is, then
163d0 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c   the.  ** (cost<
163e0 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74  lowestCost) test
163f0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65   below will neve
16400 72 20 62 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20  r be true..  ** 
16410 0a 20 20 2a 2a 20 55 73 65 20 22 28 64 6f 75 62  .  ** Use "(doub
16420 6c 65 29 32 22 20 69 6e 73 74 65 61 64 20 6f 66  le)2" instead of
16430 20 22 32 2e 30 22 20 69 6e 20 63 61 73 65 20 4f   "2.0" in case O
16440 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
16450 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64 65 66 69  NT .  ** is defi
16460 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
16470 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f  (SQLITE_BIG_DBL/
16480 28 28 64 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f  ((double)2))<rCo
16490 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 6f 73  st ){.    p->cos
164a0 74 2e 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54  t.rCost = (SQLIT
164b0 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62  E_BIG_DBL/((doub
164c0 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  le)2));.  }else{
164d0 0a 20 20 20 20 70 2d 3e 63 6f 73 74 2e 72 43 6f  .    p->cost.rCo
164e0 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 7d 0a  st = rCost;.  }.
164f0 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75    p->cost.plan.u
16500 2e 70 56 74 61 62 49 64 78 20 3d 20 70 49 64 78  .pVtabIdx = pIdx
16510 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78  Info;.  if( pIdx
16520 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
16530 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 61 73 73  sumed ){.    ass
16540 65 72 74 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d  ert( sortOrder==
16550 30 20 7c 7c 20 73 6f 72 74 4f 72 64 65 72 3d 3d  0 || sortOrder==
16560 31 20 29 3b 0a 20 20 20 20 70 2d 3e 63 6f 73 74  1 );.    p->cost
16570 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
16580 20 57 48 45 52 45 5f 4f 52 44 45 52 45 44 20 2b   WHERE_ORDERED +
16590 20 73 6f 72 74 4f 72 64 65 72 2a 57 48 45 52 45   sortOrder*WHERE
165a0 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 70 2d  _REVERSE;.    p-
165b0 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61  >cost.plan.nOBSa
165c0 74 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  t = nOrderBy;.  
165d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 63 6f  }else{.    p->co
165e0 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d  st.plan.nOBSat =
165f0 20 70 2d 3e 69 20 3f 20 70 2d 3e 61 4c 65 76 65   p->i ? p->aLeve
16600 6c 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e  l[p->i-1].plan.n
16610 4f 42 53 61 74 20 3a 20 30 3b 0a 20 20 7d 0a 20  OBSat : 0;.  }. 
16620 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 45   p->cost.plan.nE
16630 71 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  q = 0;.  pIdxInf
16640 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f  o->nOrderBy = nO
16650 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72  rderBy;..  /* Tr
16660 79 20 74 6f 20 66 69 6e 64 20 61 20 6d 6f 72 65  y to find a more
16670 20 65 66 66 69 63 69 65 6e 74 20 61 63 63 65 73   efficient acces
16680 73 20 70 61 74 74 65 72 6e 20 62 79 20 75 73 69  s pattern by usi
16690 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 65  ng multiple inde
166a0 78 65 73 0a 20 20 2a 2a 20 74 6f 20 6f 70 74 69  xes.  ** to opti
166b0 6d 69 7a 65 20 61 6e 20 4f 52 20 65 78 70 72 65  mize an OR expre
166c0 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
166d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a   WHERE clause. .
166e0 20 20 2a 2f 0a 20 20 62 65 73 74 4f 72 43 6c 61    */.  bestOrCla
166f0 75 73 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 23  useIndex(p);.}.#
16700 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16710 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
16720 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
16730 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
16740 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
16750 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
16760 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
16770 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
16780 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
16790 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
167a0 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
167b0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
167c0 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
167d0 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
167e0 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61  ws less than pVa
167f0 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  l.**    aStat[1]
16800 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
16810 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
16820 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65  to pVal.**.** Re
16830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
16840 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
16850 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
16860 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
16870 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16880 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16890 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
168a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
168c0 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
168d0 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
168e0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
168f0 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a  *pVal,        /*
16900 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64   Value to consid
16910 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
16920 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
16930 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
16940 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
16950 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
16960 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
16970 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
16980 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
16990 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
169a0 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49    tRowcnt n;.  I
169b0 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
169c0 70 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54  ple;.  int i, eT
169d0 79 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20  ype;.  int isEq 
169e0 3d 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  = 0;.  i64 v;.  
169f0 64 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20  double r, rS;.. 
16a00 20 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70   assert( roundUp
16a10 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d  ==0 || roundUp==
16a20 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
16a30 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  Idx->nSample>0 )
16a40 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20  ;.  if( pVal==0 
16a50 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16a60 45 52 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64  ERROR;.  n = pId
16a70 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  x->aiRowEst[0];.
16a80 20 20 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78    aSample = pIdx
16a90 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79  ->aSample;.  eTy
16aa0 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
16ab0 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a  ue_type(pVal);..
16ac0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
16ad0 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
16ae0 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76     v = sqlite3_v
16af0 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29  alue_int64(pVal)
16b00 3b 0a 20 20 20 20 72 20 3d 20 28 69 36 34 29 76  ;.    r = (i64)v
16b10 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
16b20 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
16b30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
16b40 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16b50 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
16b60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16b70 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
16b80 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58  Type>=SQLITE_TEX
16b90 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  T ) break;.     
16ba0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16bb0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e  eType==SQLITE_IN
16bc0 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
16bd0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16be0 75 2e 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20  u.i>=v ){.      
16bf0 20 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70      isEq = aSamp
16c00 6c 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20  le[i].u.i==v;.  
16c10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
16c40 73 65 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d  sert( aSample[i]
16c50 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46  .eType==SQLITE_F
16c60 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20  LOAT );.        
16c70 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  if( aSample[i].u
16c80 2e 72 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20  .r>=r ){.       
16c90 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c     isEq = aSampl
16ca0 65 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20  e[i].u.r==r;.   
16cb0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16cd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
16ce0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
16cf0 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d  FLOAT ){.    r =
16d00 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
16d10 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20  ouble(pVal);.   
16d20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
16d30 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
16d40 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
16d50 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
16d60 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
16d70 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61  nue;.      if( a
16d80 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e  Sample[i].eType>
16d90 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62  =SQLITE_TEXT ) b
16da0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
16db0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16dc0 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29  ==SQLITE_FLOAT )
16dd0 7b 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61  {.        rS = a
16de0 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20  Sample[i].u.r;. 
16df0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16e00 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65      rS = aSample
16e10 5b 69 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d  [i].u.i;.      }
16e20 0a 20 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72  .      if( rS>=r
16e30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71   ){.        isEq
16e40 20 3d 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20   = rS==r;.      
16e50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16e60 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
16e70 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
16e80 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d  _NULL ){.    i =
16e90 20 30 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d   0;.    if( aSam
16ea0 70 6c 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[0].eType==SQ
16eb0 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71  LITE_NULL ) isEq
16ec0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
16ed0 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
16ee0 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
16ef0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42   eType==SQLITE_B
16f00 4c 4f 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  LOB );.    for(i
16f10 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  =0; i<pIdx->nSam
16f20 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
16f30 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16f40 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45  eType==SQLITE_TE
16f50 58 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d  XT || aSample[i]
16f60 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42  .eType==SQLITE_B
16f70 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62  LOB ){.        b
16f80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
16f90 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49    }.    if( i<pI
16fa0 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20  dx->nSample ){  
16fb0 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74      .      sqlit
16fc0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16fd0 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  >db;.      CollS
16fe0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
16ff0 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20   const u8 *z;.  
17000 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53      if( eType==S
17010 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20  QLITE_BLOB ){.  
17020 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74        z = (const
17030 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61   u8 *)sqlite3_va
17040 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a  lue_blob(pVal);.
17050 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
17060 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
17070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17080 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Coll->enc==SQLIT
17090 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20  E_UTF8 );.      
170a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
170b0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
170c0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
170d0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
170e0 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b   *pIdx->azColl);
170f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
17100 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
17110 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17120 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
17130 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63  }.        z = (c
17140 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65  onst u8 *)sqlite
17150 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
17160 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
17170 20 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a        if( !z ){.
17180 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17190 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
171a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
171b0 20 61 73 73 65 72 74 28 20 7a 20 26 26 20 70 43   assert( z && pC
171c0 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
171d0 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mp );.      }.  
171e0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56      n = sqlite3V
171f0 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20  alueBytes(pVal, 
17200 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 0a  pColl->enc);.  .
17210 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3c 70 49        for(; i<pI
17220 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  dx->nSample; i++
17230 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  ){.        int c
17240 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53  ;.        int eS
17250 61 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d  ampletype = aSam
17260 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20  ple[i].eType;.  
17270 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c        if( eSampl
17280 65 74 79 70 65 3c 65 54 79 70 65 20 29 20 63 6f  etype<eType ) co
17290 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
172a0 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65 21  if( eSampletype!
172b0 3d 65 54 79 70 65 20 29 20 62 72 65 61 6b 3b 0a  =eType ) break;.
172c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
172d0 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 20  MIT_UTF16.      
172e0 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63    if( pColl->enc
172f0 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b  !=SQLITE_UTF8 ){
17300 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
17310 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20 20  Sample;.        
17320 20 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20    char *zSample 
17330 3d 20 73 71 6c 69 74 65 33 55 74 66 38 74 6f 31  = sqlite3Utf8to1
17340 36 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  6(.             
17350 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c   db, pColl->enc,
17360 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c   aSample[i].u.z,
17370 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74   aSample[i].nByt
17380 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20  e, &nSample.    
17390 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
173a0 20 20 20 69 66 28 20 21 7a 53 61 6d 70 6c 65 20     if( !zSample 
173b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
173c0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
173d0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
173e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
173f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
17400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17410 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d    c = pColl->xCm
17420 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
17430 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65  nSample, zSample
17440 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  , n, z);.       
17450 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
17460 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20  (db, zSample);. 
17470 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
17480 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
17490 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c          c = pCol
174a0 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
174b0 55 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  User, aSample[i]
174c0 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b  .nByte, aSample[
174d0 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20  i].u.z, n, z);. 
174e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
174f0 20 69 66 28 20 63 3e 3d 30 20 29 7b 0a 20 20 20   if( c>=0 ){.   
17500 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20         if( c==0 
17510 29 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 20 20  ) isEq = 1;.    
17520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17540 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
17550 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53  t this point, aS
17560 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20  ample[i] is the 
17570 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61  first sample tha
17580 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
17590 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20  n.  ** or equal 
175a0 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20  to pVal.  Or if 
175b0 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
175c0 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c  , then all sampl
175d0 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a  es are less.  **
175e0 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20   than pVal.  If 
175f0 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c  aSample[i]==pVal
17600 2c 20 74 68 65 6e 20 69 73 45 71 3d 3d 31 2e 0a  , then isEq==1..
17610 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 71 20    */.  if( isEq 
17620 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
17630 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  <pIdx->nSample )
17640 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  ;.    aStat[0] =
17650 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b   aSample[i].nLt;
17660 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
17670 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b 0a  aSample[i].nEq;.
17680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f    }else{.    tRo
17690 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70  wcnt iLower, iUp
176a0 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
176b0 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
176c0 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
176d0 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d     iUpper = aSam
176e0 70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20 20  ple[0].nLt;.    
176f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70  }else{.      iUp
17700 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e  per = i>=pIdx->n
17710 53 61 6d 70 6c 65 20 3f 20 6e 20 3a 20 61 53 61  Sample ? n : aSa
17720 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20  mple[i].nLt;.   
17730 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
17740 70 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20 61  ple[i-1].nEq + a
17750 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74 3b  Sample[i-1].nLt;
17760 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74  .    }.    aStat
17770 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 76 67 45  [1] = pIdx->avgE
17780 71 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65  q;.    if( iLowe
17790 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20  r>=iUpper ){.   
177a0 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20     iGap = 0;.   
177b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
177c0 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  ap = iUpper - iL
177d0 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ower;.    }.    
177e0 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20  if( roundUp ){. 
177f0 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61       iGap = (iGa
17800 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73  p*2)/3;.    }els
17810 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
17820 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20  iGap/3;.    }.  
17830 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f    aStat[0] = iLo
17840 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a  wer + iGap;.  }.
17850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17860 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
17870 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
17880 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  AT3 */../*.** If
17890 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
178a0 72 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 6c  r represents a l
178b0 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20 73 65  iteral value, se
178c0 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
178d0 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f  o.** an sqlite3_
178e0 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
178f0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
17900 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74 68 20  ame value, with 
17910 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20  affinity.** aff 
17920 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 62  applied to it, b
17930 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
17940 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
17950 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
17960 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65   .** caller to e
17970 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
17980 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
17990 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74   by passing it t
179a0 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c  o .** sqlite3Val
179b0 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  ueFree()..**.** 
179c0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  If the current p
179d0 61 72 73 65 20 69 73 20 61 20 72 65 63 6f 6d 70  arse is a recomp
179e0 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65 70 72  ile (sqlite3Repr
179f0 65 70 61 72 65 28 29 29 20 61 6e 64 20 70 45 78  epare()) and pEx
17a00 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20  pr.** is an SQL 
17a10 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 63 75  variable that cu
17a20 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f  rrently has a no
17a30 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75  n-NULL value bou
17a40 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65  nd to it,.** cre
17a50 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  ate an sqlite3_v
17a60 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
17a70 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 76  ontaining this v
17a80 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69 74 68  alue, again with
17a90 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61 66 66  .** affinity aff
17aa0 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20   applied to it, 
17ab0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
17ac0 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68 65  f neither of the
17ad0 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20 73 65   above apply, se
17ae0 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  t *pp to NULL..*
17af0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
17b00 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
17b10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
17b20 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
17b30 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  _OK..*/.#ifdef S
17b40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17b50 54 33 0a 73 74 61 74 69 63 20 69 6e 74 20 76 61  T3.static int va
17b60 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50  lueFromExpr(.  P
17b70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
17b80 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20   Expr *pExpr, . 
17b90 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71 6c 69   u8 aff, .  sqli
17ba0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29  te3_value **pp.)
17bb0 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
17bc0 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20  p==TK_VARIABLE. 
17bd0 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d    || (pExpr->op=
17be0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
17bf0 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56  pExpr->op2==TK_V
17c00 41 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20  ARIABLE).  ){.  
17c10 20 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45 78    int iVar = pEx
17c20 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
17c30 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
17c40 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
17c50 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20  Vdbe, iVar);.   
17c60 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56 64   *pp = sqlite3Vd
17c70 62 65 47 65 74 56 61 6c 75 65 28 70 50 61 72 73  beGetValue(pPars
17c80 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
17c90 56 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 72  Var, aff);.    r
17ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
17cc0 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78  lite3ValueFromEx
17cd0 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
17ce0 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46  Expr, SQLITE_UTF
17cf0 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23  8, aff, pp);.}.#
17d00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
17d10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
17d20 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
17d30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
17d40 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
17d50 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
17d60 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
17d70 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
17d80 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
17d90 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
17da0 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
17db0 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
17dc0 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
17dd0 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
17de0 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
17df0 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
17e00 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
17e10 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
17e20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
17e30 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
17e40 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
17e50 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
17e60 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
17e70 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
17e80 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
17e90 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
17eb0 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17ee0 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
17ef0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
17f00 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
17f10 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
17f20 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
17f30 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
17f40 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
17f50 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
17f60 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
17f70 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
17f80 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
17f90 20 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20 69   nEq parameter i
17fa0 73 20 70 61 73 73 65 64 20 74 68 65 20 69 6e 64  s passed the ind
17fb0 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ex of the index 
17fc0 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
17fd0 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63  o the.** range c
17fe0 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
17ff0 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
18000 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   number of equal
18010 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
18020 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ** optimized by 
18030 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
18040 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
18050 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69  mple, assuming i
18060 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20  ndex p is.** on 
18070 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
18080 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
18090 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
180a0 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
180b0 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
180c0 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
180d0 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65  en nEq should be
180e0 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75   passed the valu
180f0 65 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  e 1 (as the rang
18100 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
18110 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68  umn,.** b, is th
18120 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f  e second left-mo
18130 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
18140 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
18150 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
18160 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
18170 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
18180 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
18190 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c  * then nEq shoul
181a0 64 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a  d be passed 0..*
181b0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
181c0 64 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  d value is an in
181d0 74 65 67 65 72 20 64 69 76 69 73 6f 72 20 74 6f  teger divisor to
181e0 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69   reduce the esti
181f0 6d 61 74 65 64 0a 2a 2a 20 73 65 61 72 63 68 20  mated.** search 
18200 73 70 61 63 65 2e 20 20 41 20 72 65 74 75 72 6e  space.  A return
18210 20 76 61 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e   value of 1 mean
18220 73 20 74 68 61 74 20 72 61 6e 67 65 20 63 6f 6e  s that range con
18230 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20  straints are.** 
18240 6e 6f 20 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20  no help at all. 
18250 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20   A return value 
18260 6f 66 20 32 20 6d 65 61 6e 73 20 72 61 6e 67 65  of 2 means range
18270 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
18280 0a 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20  .** expected to 
18290 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
182a0 68 20 73 70 61 63 65 20 62 79 20 68 61 6c 66 2e  h space by half.
182b0 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e    And so forth..
182c0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61  ..**.** In the a
182d0 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65  bsence of sqlite
182e0 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a 45 20 64  _stat3 ANALYZE d
182f0 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67 65 20  ata, each range 
18300 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65  inequality.** re
18310 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
18320 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74   space by a fact
18330 6f 72 20 6f 66 20 34 2e 20 20 48 65 6e 63 65 20  or of 4.  Hence 
18340 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61  a single constra
18350 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73  int (x>?).** res
18360 75 6c 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e  ults in a return
18370 20 6f 66 20 34 20 61 6e 64 20 61 20 72 61 6e 67   of 4 and a rang
18380 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e  e constraint (x>
18390 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c  ? AND x<?) resul
183a0 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72  ts.** in a retur
183b0 6e 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74  n of 16..*/.stat
183c0 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
183d0 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  eScanEst(.  Pars
183e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
183f0 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
18400 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
18410 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
18420 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
18430 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63 6f 6e  /* The index con
18440 74 61 69 6e 69 6e 67 20 74 68 65 20 72 61 6e 67  taining the rang
18450 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d  e-compared colum
18460 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20  n; "x" */.  int 
18470 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  nEq,            
18480 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 70   /* index into p
18490 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20  ->aCol[] of the 
184a0 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63  range-compared c
184b0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
184c0 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
184d0 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
184e0 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
184f0 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
18500 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
18510 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
18520 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
18530 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
18540 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
18550 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 64 6f 75  be NULL */.  dou
18560 62 6c 65 20 2a 70 52 61 6e 67 65 44 69 76 20 20  ble *pRangeDiv  
18570 20 2f 2a 20 4f 55 54 3a 20 52 65 64 75 63 65 20   /* OUT: Reduce 
18580 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
18590 74 68 69 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a  this divisor */.
185a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
185b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66  LITE_OK;..#ifdef
185c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
185d0 54 41 54 33 0a 0a 20 20 69 66 28 20 6e 45 71 3d  TAT3..  if( nEq=
185e0 3d 30 20 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65  =0 && p->nSample
185f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
18600 76 61 6c 75 65 20 2a 70 52 61 6e 67 65 56 61 6c  value *pRangeVal
18610 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  ;.    tRowcnt iL
18620 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 74 52  ower = 0;.    tR
18630 6f 77 63 6e 74 20 69 55 70 70 65 72 20 3d 20 70  owcnt iUpper = p
18640 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
18650 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
18660 0a 20 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d  .    u8 aff = p-
18670 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
18680 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66  >aiColumn[0]].af
18690 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66 28  finity;..    if(
186a0 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20   pLower ){.     
186b0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
186c0 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
186d0 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  ight;.      rc =
186e0 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70   valueFromExpr(p
186f0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66  Parse, pExpr, af
18700 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a  f, &pRangeVal);.
18710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
18720 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
18730 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
18740 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
18750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
18760 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b         && whereK
18770 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
18780 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c  p, pRangeVal, 0,
18790 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   a)==SQLITE_OK. 
187a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
187b0 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iLower = a[0];. 
187c0 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 77         if( (pLow
187d0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
187e0 57 4f 5f 47 54 29 21 3d 30 20 29 20 69 4c 6f 77  WO_GT)!=0 ) iLow
187f0 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  er += a[1];.    
18800 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
18810 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67  3ValueFree(pRang
18820 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eVal);.    }.   
18830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18840 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a  OK && pUpper ){.
18850 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
18860 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
18870 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
18880 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45   rc = valueFromE
18890 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
188a0 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56  r, aff, &pRangeV
188b0 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
188c0 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  t( (pUpper->eOpe
188d0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
188e0 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_LE))!=0 );.   
188f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18900 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77  E_OK.       && w
18910 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
18920 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61  rse, p, pRangeVa
18930 6c 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45  l, 1, a)==SQLITE
18940 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  _OK.      ){.   
18950 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b       iUpper = a[
18960 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
18970 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
18980 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
18990 20 69 55 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b   iUpper += a[1];
189a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
189b0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
189c0 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20  pRangeVal);.    
189d0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
189e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
189f0 20 69 66 28 20 69 55 70 70 65 72 3c 3d 69 4c 6f   if( iUpper<=iLo
18a00 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  wer ){.        *
18a10 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75  pRangeDiv = (dou
18a20 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b  ble)p->aiRowEst[
18a30 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0];.      }else{
18a40 0a 20 20 20 20 20 20 20 20 2a 70 52 61 6e 67 65  .        *pRange
18a50 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d  Div = (double)p-
18a60 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f 28 64 6f  >aiRowEst[0]/(do
18a70 75 62 6c 65 29 28 69 55 70 70 65 72 20 2d 20 69  uble)(iUpper - i
18a80 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Lower);.      }.
18a90 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
18aa0 28 28 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65  (("range scan re
18ab0 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64  gions: %u..%u  d
18ac0 69 76 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20  iv=%g\n",.      
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
18ae0 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
18af0 70 70 65 72 2c 20 2a 70 52 61 6e 67 65 44 69 76  pper, *pRangeDiv
18b00 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18b10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18b20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
18b30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
18b40 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44  Parse);.  UNUSED
18b50 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
18b60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18b70 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20  R(nEq);.#endif. 
18b80 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20   assert( pLower 
18b90 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20 2a  || pUpper );.  *
18ba0 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75  pRangeDiv = (dou
18bb0 62 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 4c 6f  ble)1;.  if( pLo
18bc0 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e  wer && (pLower->
18bd0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
18be0 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70 52 61 6e  NULL)==0 ) *pRan
18bf0 67 65 44 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65  geDiv *= (double
18c00 29 34 3b 0a 20 20 69 66 28 20 70 55 70 70 65 72  )4;.  if( pUpper
18c10 20 29 20 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d   ) *pRangeDiv *=
18c20 20 28 64 6f 75 62 6c 65 29 34 3b 0a 20 20 72 65   (double)4;.  re
18c30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
18c40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18c50 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT3./*.** Est
18c60 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
18c70 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
18c80 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
18c90 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
18ca0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
18cb0 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
18cc0 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
18cd0 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
18ce0 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
18cf0 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
18d00 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
18d10 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
18d20 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
18d30 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
18d40 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
18d50 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
18d60 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
18d70 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
18d80 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
18d90 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
18da0 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
18db0 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
18dc0 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
18dd0 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
18de0 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
18df0 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
18e00 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
18e10 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
18e20 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
18e30 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
18e40 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
18e50 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
18e60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
18e70 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
18e80 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
18e90 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
18ea0 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
18eb0 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
18ec0 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
18ed0 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
18ee0 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
18ef0 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
18f00 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
18f10 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
18f20 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
18f30 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
18f40 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
18f50 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
18f60 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
18f70 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18f80 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
18f90 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
18fa0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
18fb0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
18fc0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
18fd0 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  se left-most col
18fe0 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a  umn is pTerm */.
18ff0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
19000 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
19010 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
19020 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
19030 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 64 6f  nstraint */.  do
19040 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20 20  uble *pnRow     
19050 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
19060 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
19070 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
19080 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
19090 2a 70 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56  *pRhs = 0;  /* V
190a0 41 4c 55 45 20 6f 6e 20 72 69 67 68 74 2d 68 61  ALUE on right-ha
190b0 6e 64 20 73 69 64 65 20 6f 66 20 70 54 65 72 6d  nd side of pTerm
190c0 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20 20 20   */.  u8 aff;   
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  /* Column affini
190f0 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ty */.  int rc; 
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
19120 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
19130 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20    tRowcnt a[2]; 
19140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19150 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20  tatistics */..  
19160 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
19170 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
19180 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  t( p->nSample>0 
19190 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  );.  aff = p->pT
191a0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
191b0 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e  Column[0]].affin
191c0 69 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ity;.  if( pExpr
191d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c   ){.    rc = val
191e0 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
191f0 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26  e, pExpr, aff, &
19200 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 72  pRhs);.    if( r
19210 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71  c ) goto whereEq
19220 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65  ualScanEst_cance
19230 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
19240 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56 61  pRhs = sqlite3Va
19250 6c 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e 64  lueNew(pParse->d
19260 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52  b);.  }.  if( pR
19270 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  hs==0 ) return S
19280 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
19290 20 20 72 63 20 3d 20 77 68 65 72 65 4b 65 79 53    rc = whereKeyS
192a0 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
192b0 70 52 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69  pRhs, 0, a);.  i
192c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
192d0 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
192e0 43 45 28 28 22 65 71 75 61 6c 69 74 79 20 73 63  CE(("equality sc
192f0 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
19300 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  ", (int)a[1]));.
19310 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31      *pnRow = a[1
19320 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45 71 75 61  ];.  }.whereEqua
19330 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a  lScanEst_cancel:
19340 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
19350 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74  ree(pRhs);.  ret
19360 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
19370 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
19380 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
19390 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
193a0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
193b0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
193c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
193d0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
193e0 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
193f0 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
19400 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
19410 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
19420 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
19430 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
19440 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
19450 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
19460 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
19470 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
19480 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
19490 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
194a0 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
194b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
194c0 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
194d0 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
194e0 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
194f0 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
19500 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
19510 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19520 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
19530 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
19540 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
19550 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
19560 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
19570 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
19580 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
19590 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
195a0 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
195b0 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
195c0 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
195d0 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
195e0 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
195f0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
19600 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
19610 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  nScanEst(.  Pars
19620 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19630 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
19640 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
19650 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
19660 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
19670 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
19680 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  se left-most col
19690 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a  umn is pTerm */.
196a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
196b0 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
196c0 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
196d0 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
196e0 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
196f0 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20    double *pnRow 
19700 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
19710 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
19720 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
19730 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
19740 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
19750 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
19760 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
19770 20 20 64 6f 75 62 6c 65 20 6e 45 73 74 3b 20 20    double nEst;  
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19790 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
197a0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
197b0 6d 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52  m */.  double nR
197c0 6f 77 45 73 74 20 3d 20 28 64 6f 75 62 6c 65 29  owEst = (double)
197d0 30 3b 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61  0; /* New estima
197e0 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
197f0 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e   of rows */.  in
19800 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
19810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
19820 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
19830 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
19840 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  le!=0 );.  for(i
19850 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
19860 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  K && i<pList->nE
19870 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  xpr; i++){.    n
19880 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  Est = p->aiRowEs
19890 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77  t[0];.    rc = w
198a0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
198b0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 69 73  (pParse, p, pLis
198c0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
198d0 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
198e0 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a  st += nEst;.  }.
198f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19900 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
19910 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f  RowEst > p->aiRo
19920 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73  wEst[0] ) nRowEs
19930 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
19940 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  0];.    *pnRow =
19950 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
19960 45 52 45 54 52 41 43 45 28 28 22 49 4e 20 72 6f  ERETRACE(("IN ro
19970 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
19980 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %g\n", nRowEst))
19990 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
199a0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64  c;.}.#endif /* d
199b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
199c0 41 42 4c 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a  ABLE_STAT3) */..
199d0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
199e0 65 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 43 6f  ee if column iCo
199f0 6c 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  l of the table w
19a00 69 74 68 20 63 75 72 73 6f 72 20 69 54 61 62 20  ith cursor iTab 
19a10 77 69 6c 6c 20 61 70 70 65 61 72 0a 2a 2a 20 69  will appear.** i
19a20 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 61  n sorted order a
19a30 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
19a40 63 75 72 72 65 6e 74 20 71 75 65 72 79 20 70 6c  current query pl
19a50 61 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  an..**.** Return
19a60 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
19a70 20 20 30 20 20 20 69 43 6f 6c 20 69 73 20 6e 6f    0   iCol is no
19a80 74 20 6f 72 64 65 72 65 64 0a 2a 2a 20 20 20 20  t ordered.**    
19a90 31 20 20 20 69 43 6f 6c 20 68 61 73 20 6f 6e 6c  1   iCol has onl
19aa0 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65  y a single value
19ab0 0a 2a 2a 20 20 20 20 32 20 20 20 69 43 6f 6c 20  .**    2   iCol 
19ac0 69 73 20 69 6e 20 41 53 43 20 6f 72 64 65 72 0a  is in ASC order.
19ad0 2a 2a 20 20 20 20 33 20 20 20 69 43 6f 6c 20 69  **    3   iCol i
19ae0 73 20 69 6e 20 44 45 53 43 20 6f 72 64 65 72 0a  s in DESC order.
19af0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
19b00 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28 0a 20  OrderedColumn(. 
19b10 20 57 68 65 72 65 42 65 73 74 49 64 78 20 2a 70   WhereBestIdx *p
19b20 2c 0a 20 20 69 6e 74 20 69 54 61 62 2c 0a 20 20  ,.  int iTab,.  
19b30 69 6e 74 20 69 43 6f 6c 0a 29 7b 0a 20 20 69 6e  int iCol.){.  in
19b40 74 20 69 2c 20 6a 3b 0a 20 20 57 68 65 72 65 4c  t i, j;.  WhereL
19b50 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26  evel *pLevel = &
19b60 70 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31  p->aLevel[p->i-1
19b70 5d 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ];.  Index *pIdx
19b80 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72  ;.  u8 sortOrder
19b90 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 69 2d 31  ;.  for(i=p->i-1
19ba0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4c 65  ; i>=0; i--, pLe
19bb0 76 65 6c 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  vel--){.    if( 
19bc0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 21  pLevel->iTabCur!
19bd0 3d 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  =iTab ) continue
19be0 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  ;.    if( (pLeve
19bf0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
19c00 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51  & WHERE_ALL_UNIQ
19c10 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  UE)!=0 ){.      
19c20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
19c30 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 65      assert( (pLe
19c40 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
19c50 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 45  s & WHERE_ORDERE
19c60 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  D)!=0 );.    if(
19c70 20 28 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d   (pIdx = pLevel-
19c80 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 29 21 3d 30  >plan.u.pIdx)!=0
19c90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43   ){.      if( iC
19ca0 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
19cb0 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  sortOrder = 0;. 
19cc0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19cd0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
19ce0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
19cf0 45 56 45 52 53 45 29 21 3d 30 20 29 3b 0a 20 20  EVERSE)!=0 );.  
19d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19d10 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 64 78 2d     int n = pIdx-
19d20 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
19d30 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
19d40 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
19d50 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e  if( iCol==pIdx->
19d60 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 20 62 72  aiColumn[j] ) br
19d70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
19d80 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 6e 20         if( j>=n 
19d90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
19da0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
19db0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
19dc0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 74 65 73  [j];.        tes
19dd0 74 63 61 73 65 28 20 28 70 4c 65 76 65 6c 2d 3e  tcase( (pLevel->
19de0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
19df0 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
19e00 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
19e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
19e20 20 69 43 6f 6c 21 3d 28 2d 31 29 20 29 20 72 65   iCol!=(-1) ) re
19e30 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 73 6f  turn 0;.      so
19e40 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20  rtOrder = 0;.   
19e50 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 4c     testcase( (pL
19e60 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
19e70 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52  gs & WHERE_REVER
19e80 53 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  SE)!=0 );.    }.
19e90 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
19ea0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
19eb0 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d  WHERE_REVERSE)!=
19ec0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
19ed0 74 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20  t( sortOrder==0 
19ee0 7c 7c 20 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20  || sortOrder==1 
19ef0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19f00 65 28 20 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20  e( sortOrder==1 
19f10 29 3b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64  );.      sortOrd
19f20 65 72 20 3d 20 31 20 2d 20 73 6f 72 74 4f 72 64  er = 1 - sortOrd
19f30 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  er;.    }.    re
19f40 74 75 72 6e 20 73 6f 72 74 4f 72 64 65 72 2b 32  turn sortOrder+2
19f50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
19f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19f70 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20  routine decides 
19f80 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75  if pIdx can be u
19f90 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  sed to satisfy t
19fa0 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
19fb0 6c 61 75 73 65 2c 20 65 69 74 68 65 72 20 69 6e  lause, either in
19fc0 20 77 68 6f 6c 65 20 6f 72 20 69 6e 20 70 61 72   whole or in par
19fd0 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  t.  The return v
19fe0 61 6c 75 65 20 69 73 20 74 68 65 20 0a 2a 2a 20  alue is the .** 
19ff0 63 75 6d 75 6c 61 74 69 76 65 20 6e 75 6d 62 65  cumulative numbe
1a000 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
1a010 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1a020 65 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73  e that are satis
1a030 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 69  fied.** by the i
1a040 6e 64 65 78 20 70 49 64 78 20 61 6e 64 20 6f 74  ndex pIdx and ot
1a050 68 65 72 20 69 6e 64 69 63 65 73 20 69 6e 20 6f  her indices in o
1a060 75 74 65 72 20 6c 6f 6f 70 73 2e 0a 2a 2a 0a 2a  uter loops..**.*
1a070 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
1a080 67 20 71 75 65 72 69 65 64 20 68 61 73 20 61 20  g queried has a 
1a090 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
1a0a0 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
1a0b0 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 74  s the.** index t
1a0c0 68 61 74 20 69 73 20 70 6f 73 74 75 6c 61 74 65  hat is postulate
1a0d0 64 20 66 6f 72 20 75 73 65 20 74 6f 20 61 63 63  d for use to acc
1a0e0 65 73 73 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  ess the table..*
1a0f0 2a 0a 2a 2a 20 54 68 65 20 2a 70 62 52 65 76 20  *.** The *pbRev 
1a100 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
1a110 30 20 6f 72 64 65 72 20 31 20 64 65 70 65 6e 64  0 order 1 depend
1a120 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1a130 72 20 6e 6f 74 0a 2a 2a 20 70 49 64 78 20 73 68  r not.** pIdx sh
1a140 6f 75 6c 64 20 62 65 20 72 75 6e 20 69 6e 20 74  ould be run in t
1a150 68 65 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72  he forward order
1a160 20 6f 72 20 69 6e 20 72 65 76 65 72 73 65 20 6f   or in reverse o
1a170 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1a180 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
1a190 65 78 28 0a 20 20 57 68 65 72 65 42 65 73 74 49  ex(.  WhereBestI
1a1a0 64 78 20 2a 70 2c 20 20 20 20 2f 2a 20 42 65 73  dx *p,    /* Bes
1a1b0 74 20 69 6e 64 65 78 20 73 65 61 72 63 68 20 63  t index search c
1a1c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
1a1d0 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
1a1e0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
1a1f0 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20  are testing */. 
1a200 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
1a210 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
1a220 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
1a230 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
1a240 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
1a250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
1a260 20 74 6f 20 31 20 66 6f 72 20 72 65 76 65 72 73   to 1 for revers
1a270 65 2d 6f 72 64 65 72 20 73 63 61 6e 20 6f 66 20  e-order scan of 
1a280 70 49 64 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pIdx */.){.  int
1a290 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1a2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a2b0 6d 62 65 72 20 6f 66 20 70 49 64 78 20 74 65 72  mber of pIdx ter
1a2c0 6d 73 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ms used */.  int
1a2d0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
1a2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a2f0 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
1a300 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64   terms satisfied
1a310 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
1a320 64 65 72 20 3d 20 32 3b 20 20 20 20 20 20 20 20  der = 2;        
1a330 20 20 20 20 2f 2a 20 30 3a 20 66 6f 72 77 61 72      /* 0: forwar
1a340 64 2e 20 20 31 3a 20 62 61 63 6b 77 61 72 64 2e  d.  1: backward.
1a350 20 20 32 3a 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a    2: unknown */.
1a360 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a380 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
1a390 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
1a3a0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a3b0 5f 69 74 65 6d 20 2a 70 4f 42 49 74 65 6d 3b 2f  _item *pOBItem;/
1a3c0 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
1a3d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1a3e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1a3f0 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
1a400 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 61 74     /* Table that
1a410 20 6f 77 6e 73 20 69 6e 64 65 78 20 70 49 64 78   owns index pIdx
1a420 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1a430 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
1a440 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
1a450 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1a460 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1a470 70 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 2f 2a  p->pParse;    /*
1a480 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
1a490 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1a4a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
1a4b0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1a4c0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
1a4d0 6e 74 20 6e 50 72 69 6f 72 53 61 74 3b 20 20 20  nt nPriorSat;   
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a4f0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
1a500 61 74 69 73 66 69 65 64 20 62 79 20 6f 75 74 65  atisfied by oute
1a510 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 69 6e 74  r loops */.  int
1a520 20 73 65 65 6e 52 6f 77 69 64 20 3d 20 30 3b 20   seenRowid = 0; 
1a530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1a540 75 65 20 69 66 20 61 6e 20 4f 52 44 45 52 20 42  ue if an ORDER B
1a550 59 20 72 6f 77 69 64 20 74 65 72 6d 20 69 73 20  Y rowid term is 
1a560 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 75 6e  seen */.  int un
1a570 69 71 75 65 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20  iqueNotNull;    
1a580 20 20 20 20 20 20 20 20 2f 2a 20 70 49 64 78 20          /* pIdx 
1a590 69 73 20 55 4e 49 51 55 45 20 77 69 74 68 20 61  is UNIQUE with a
1a5a0 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 4e 4f 54  ll terms are NOT
1a5b0 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 69 66 28 20   NULL */..  if( 
1a5c0 70 2d 3e 69 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  p->i==0 ){.    n
1a5d0 50 72 69 6f 72 53 61 74 20 3d 20 30 3b 0a 20 20  PriorSat = 0;.  
1a5e0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 69 6f  }else{.    nPrio
1a5f0 72 53 61 74 20 3d 20 70 2d 3e 61 4c 65 76 65 6c  rSat = p->aLevel
1a600 5b 70 2d 3e 69 2d 31 5d 2e 70 6c 61 6e 2e 6e 4f  [p->i-1].plan.nO
1a610 42 53 61 74 3b 0a 20 20 20 20 69 66 28 20 28 70  BSat;.    if( (p
1a620 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
1a630 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1a640 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 3d 3d  WHERE_ORDERED)==
1a650 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
1a660 69 73 20 6c 6f 6f 70 20 63 61 6e 6e 6f 74 20 62  is loop cannot b
1a670 65 20 6f 72 64 65 72 65 64 20 75 6e 6c 65 73 73  e ordered unless
1a680 20 74 68 65 20 6e 65 78 74 20 6f 75 74 65 72 20   the next outer 
1a690 6c 6f 6f 70 20 69 73 0a 20 20 20 20 20 20 2a 2a  loop is.      **
1a6a0 20 61 6c 73 6f 20 6f 72 64 65 72 65 64 20 2a 2f   also ordered */
1a6b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 50  .      return nP
1a6c0 72 69 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a 20  riorSat;.    }. 
1a6d0 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74     if( Optimizat
1a6e0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
1a6f0 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
1a700 78 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  xJoin) ){.      
1a710 2f 2a 20 4f 6e 6c 79 20 6c 6f 6f 6b 20 61 74 20  /* Only look at 
1a720 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 20 6c  the outer-most l
1a730 6f 6f 70 20 69 66 20 74 68 65 20 4f 72 64 65 72  oop if the Order
1a740 42 79 49 64 78 4a 6f 69 6e 0a 20 20 20 20 20 20  ByIdxJoin.      
1a750 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
1a760 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
1a770 20 20 20 20 20 72 65 74 75 72 6e 20 6e 50 72 69       return nPri
1a780 6f 72 53 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  orSat;.    }.  }
1a790 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
1a7a0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
1a7b0 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
1a7c0 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e   );.  if( pIdx->
1a7d0 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20  bUnordered ){.  
1a7e0 20 20 2f 2a 20 48 61 73 68 20 69 6e 64 69 63 65    /* Hash indice
1a7f0 73 20 28 69 6e 64 69 63 61 74 65 64 20 62 79 20  s (indicated by 
1a800 74 68 65 20 22 75 6e 6f 72 64 65 72 65 64 22 20  the "unordered" 
1a810 74 61 67 20 6f 6e 20 73 71 6c 69 74 65 5f 73 74  tag on sqlite_st
1a820 61 74 31 29 20 63 61 6e 6e 6f 74 0a 20 20 20 20  at1) cannot.    
1a830 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 73  ** be used for s
1a840 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65  orting */.    re
1a850 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a  turn nPriorSat;.
1a860 20 20 7d 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f    }.  nTerm = pO
1a870 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
1a880 20 75 6e 69 71 75 65 4e 6f 74 4e 75 6c 6c 20 3d   uniqueNotNull =
1a890 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
1a8a0 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 61 73 73 65 72  OE_None;.  asser
1a8b0 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20  t( nTerm>0 );.. 
1a8c0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64   /* Argument pId
1a8d0 78 20 6d 75 73 74 20 65 69 74 68 65 72 20 70 6f  x must either po
1a8e0 69 6e 74 20 74 6f 20 61 20 27 72 65 61 6c 27 20  int to a 'real' 
1a8f0 6e 61 6d 65 64 20 69 6e 64 65 78 20 73 74 72 75  named index stru
1a900 63 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20  cture, .  ** or 
1a910 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  an index structu
1a920 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  re allocated on 
1a930 74 68 65 20 73 74 61 63 6b 20 62 79 20 62 65 73  the stack by bes
1a940 74 42 74 72 65 65 49 6e 64 65 78 28 29 20 74 6f  tBtreeIndex() to
1a950 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20  .  ** represent 
1a960 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78 20  the rowid index 
1a970 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
1a980 65 76 65 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f  every table.  */
1a990 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
1a9a0 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d  >zName || (pIdx-
1a9b0 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70  >nColumn==1 && p
1a9c0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
1a9d0 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==-1) );..  /* M
1a9e0 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68  atch terms of th
1a9f0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1aa00 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e  e against column
1aa10 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e  s of.  ** the in
1aa20 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  dex..  **.  ** N
1aa30 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73  ote that indices
1aa40 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c   have pIdx->nCol
1aa50 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75  umn regular colu
1aa60 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e  mns plus.  ** on
1aa70 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  e additional col
1aa80 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  umn containing t
1aa90 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72  he rowid.  The r
1aaa0 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a  owid column.  **
1aab0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
1aac0 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f   also allowed to
1aad0 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
1aae0 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
1aaf0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
1ab00 6a 20 3d 20 6e 50 72 69 6f 72 53 61 74 3b 0a 20  j = nPriorSat;. 
1ab10 20 66 6f 72 28 69 3d 30 2c 70 4f 42 49 74 65 6d   for(i=0,pOBItem
1ab20 3d 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a 5d  =&pOrderBy->a[j]
1ab30 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d  ; j<nTerm && i<=
1ab40 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
1ab50 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1ab60 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  OBExpr;         
1ab70 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1ab80 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  on of the ORDER 
1ab90 42 59 20 70 4f 42 49 74 65 6d 20 2a 2f 0a 20 20  BY pOBItem */.  
1aba0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1abb0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
1abc0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1abd0 6e 63 65 20 6f 66 20 70 4f 42 45 78 70 72 20 2a  nce of pOBExpr *
1abe0 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f  /.    int termSo
1abf0 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 2f 2a  rtOrder;      /*
1ac00 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20   Sort order for 
1ac10 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20  this term */.   
1ac20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
1ac30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ac40 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i-th column of t
1ac50 68 65 20 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f  he index.  -1 fo
1ac60 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  r rowid */.    i
1ac70 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 3b 20 20  nt iSortOrder;  
1ac80 20 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20         /* 1 for 
1ac90 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20  DESC, 0 for ASC 
1aca0 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  on the i-th inde
1acb0 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e  x term */.    in
1acc0 74 20 69 73 45 71 3b 20 20 20 20 20 20 20 20 20  t isEq;         
1acd0 20 20 20 20 20 20 2f 2a 20 53 75 62 6a 65 63 74        /* Subject
1ace0 20 74 6f 20 61 6e 20 3d 3d 20 6f 72 20 49 53 20   to an == or IS 
1acf0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
1ad00 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 61 74  */.    int isMat
1ad10 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ch;            /
1ad20 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  * ORDER BY term 
1ad30 6d 61 74 63 68 65 73 20 74 68 65 20 69 6e 64 65  matches the inde
1ad40 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f  x term */.    co
1ad50 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
1ad60 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1ad70 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1ad80 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64  nce for i-th ind
1ad90 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 57  ex term */.    W
1ada0 68 65 72 65 54 65 72 6d 20 2a 70 43 6f 6e 73 74  hereTerm *pConst
1adb0 72 61 69 6e 74 3b 20 2f 2a 20 41 20 63 6f 6e 73  raint; /* A cons
1adc0 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 57 48  traint in the WH
1add0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20  ERE clause */.. 
1ade0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 78     /* If the nex
1adf0 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  t term of the OR
1ae00 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 72 65  DER BY clause re
1ae10 66 65 72 73 20 74 6f 20 61 6e 79 74 68 69 6e 67  fers to anything
1ae20 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 20 20   other than.    
1ae30 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
1ae40 68 65 20 22 62 61 73 65 22 20 74 61 62 6c 65 2c  he "base" table,
1ae50 20 74 68 65 6e 20 74 68 69 73 20 69 6e 64 65 78   then this index
1ae60 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6f 66 20   will not be of 
1ae70 61 6e 79 0a 20 20 20 20 2a 2a 20 66 75 72 74 68  any.    ** furth
1ae80 65 72 20 75 73 65 20 69 6e 20 68 61 6e 64 6c 69  er use in handli
1ae90 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  ng the ORDER BY.
1aea0 20 2a 2f 0a 20 20 20 20 70 4f 42 45 78 70 72 20   */.    pOBExpr 
1aeb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1aec0 70 43 6f 6c 6c 61 74 65 28 70 4f 42 49 74 65 6d  pCollate(pOBItem
1aed0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ->pExpr);.    if
1aee0 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
1aef0 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 4f 42 45  K_COLUMN || pOBE
1af00 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73  xpr->iTable!=bas
1af10 65 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  e ){.      break
1af20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1af30 46 69 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  Find column numb
1af40 65 72 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  er and collating
1af50 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
1af60 65 20 6e 65 78 74 20 65 6e 74 72 79 0a 20 20 20  e next entry.   
1af70 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
1af80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
1af90 2d 3e 7a 4e 61 6d 65 20 26 26 20 69 3c 70 49 64  ->zName && i<pId
1afa0 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
1afb0 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
1afc0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
1afd0 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75  .      if( iColu
1afe0 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65  mn==pIdx->pTable
1aff0 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
1b000 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
1b010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b020 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78  SortOrder = pIdx
1b030 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
1b040 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
1b050 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
1b060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43        assert( zC
1b070 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 7d 65  oll!=0 );.    }e
1b080 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  lse{.      iColu
1b090 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  mn = -1;.      i
1b0a0 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  SortOrder = 0;. 
1b0b0 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a       zColl = 0;.
1b0c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
1b0d0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1b0e0 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
1b0f0 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
1b100 71 75 65 6e 63 65 20 6f 66 20 74 68 65 0a 20 20  quence of the.  
1b110 20 20 2a 2a 20 69 6e 64 65 78 20 6d 61 74 63 68    ** index match
1b120 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
1b130 65 72 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  er and collating
1b140 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65   sequence of the
1b150 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a   ORDER BY.    **
1b160 20 63 6c 61 75 73 65 20 65 6e 74 72 79 2e 20 20   clause entry.  
1b170 53 65 74 20 69 73 4d 61 74 63 68 20 74 6f 20 31  Set isMatch to 1
1b180 20 69 66 20 74 68 65 79 20 62 6f 74 68 20 6d 61   if they both ma
1b190 74 63 68 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tch. */.    if( 
1b1a0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
1b1b0 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
1b1c0 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a     if( zColl ){.
1b1d0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1b1e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1b1f0 65 71 28 70 50 61 72 73 65 2c 20 70 4f 42 49 74  eq(pParse, pOBIt
1b200 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
1b210 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1b220 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
1b230 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
1b240 69 73 4d 61 74 63 68 20 3d 20 73 71 6c 69 74 65  isMatch = sqlite
1b250 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
1b260 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 3d 3d 30  zName, zColl)==0
1b270 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b280 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
1b290 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1b2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 73 4d  }else{.      isM
1b2b0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  atch = 0;.    }.
1b2c0 0a 20 20 20 20 2f 2a 20 74 65 72 6d 53 6f 72 74  .    /* termSort
1b2d0 4f 72 64 65 72 20 69 73 20 30 20 6f 72 20 31 20  Order is 0 or 1 
1b2e0 66 6f 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  for whether or n
1b2f0 6f 74 20 74 68 65 20 61 63 63 65 73 73 20 6c 6f  ot the access lo
1b300 6f 70 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a  op should.    **
1b310 20 72 75 6e 20 66 6f 72 77 61 72 64 20 6f 72 20   run forward or 
1b320 62 61 63 6b 77 61 72 64 73 20 28 72 65 73 70 65  backwards (respe
1b330 63 74 69 76 65 6c 79 29 20 69 6e 20 6f 72 64 65  ctively) in orde
1b340 72 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 69  r to satisfy thi
1b350 73 20 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20 6f  s .    ** term o
1b360 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1b370 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 61 73  lause. */.    as
1b380 73 65 72 74 28 20 70 4f 42 49 74 65 6d 2d 3e 73  sert( pOBItem->s
1b390 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70  ortOrder==0 || p
1b3a0 4f 42 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  OBItem->sortOrde
1b3b0 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  r==1 );.    asse
1b3c0 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d  rt( iSortOrder==
1b3d0 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d  0 || iSortOrder=
1b3e0 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f  =1 );.    termSo
1b3f0 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f  rtOrder = iSortO
1b400 72 64 65 72 20 5e 20 70 4f 42 49 74 65 6d 2d 3e  rder ^ pOBItem->
1b410 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20  sortOrder;..    
1b420 2f 2a 20 49 66 20 58 20 69 73 20 74 68 65 20 63  /* If X is the c
1b430 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64  olumn in the ind
1b440 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  ex and ORDER BY 
1b450 63 6c 61 75 73 65 2c 20 63 68 65 63 6b 20 74 6f  clause, check to
1b460 20 73 65 65 0a 20 20 20 20 2a 2a 20 69 66 20 74   see.    ** if t
1b470 68 65 72 65 20 61 72 65 20 61 6e 79 20 58 3d 20  here are any X= 
1b480 6f 72 20 58 20 49 53 20 4e 55 4c 4c 20 63 6f 6e  or X IS NULL con
1b490 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
1b4a0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 2a 2f  WHERE clause. */
1b4b0 0a 20 20 20 20 70 43 6f 6e 73 74 72 61 69 6e 74  .    pConstraint
1b4c0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 2d 3e 70   = findTerm(p->p
1b4d0 57 43 2c 20 62 61 73 65 2c 20 69 43 6f 6c 75 6d  WC, base, iColum
1b4e0 6e 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 0a  n, p->notReady,.
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 20 20 20 20 20 20 20 20 20 20 57 4f 5f 45 51             WO_EQ
1b510 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  |WO_ISNULL|WO_IN
1b520 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , pIdx);.    if(
1b530 20 70 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20   pConstraint==0 
1b540 29 7b 0a 20 20 20 20 20 20 69 73 45 71 20 3d 20  ){.      isEq = 
1b550 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1b560 20 28 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 65   (pConstraint->e
1b570 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1b580 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73  )!=0 ){.      is
1b590 45 71 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Eq = 0;.    }els
1b5a0 65 20 69 66 28 20 28 70 43 6f 6e 73 74 72 61 69  e if( (pConstrai
1b5b0 6e 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nt->eOperator & 
1b5c0 57 4f 5f 49 53 4e 55 4c 4c 29 21 3d 30 20 29 7b  WO_ISNULL)!=0 ){
1b5d0 0a 20 20 20 20 20 20 75 6e 69 71 75 65 4e 6f 74  .      uniqueNot
1b5e0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Null = 0;.      
1b5f0 69 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 22 58  isEq = 1;  /* "X
1b600 20 49 53 20 4e 55 4c 4c 22 20 6d 65 61 6e 73 20   IS NULL" means 
1b610 58 20 68 61 73 20 6f 6e 6c 79 20 61 20 73 69 6e  X has only a sin
1b620 67 6c 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  gle value */.   
1b630 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e 73   }else if( pCons
1b640 74 72 61 69 6e 74 2d 3e 70 72 65 72 65 71 52 69  traint->prereqRi
1b650 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
1b660 69 73 45 71 20 3d 20 31 3b 20 20 2f 2a 20 43 6f  isEq = 1;  /* Co
1b670 6e 73 74 72 61 69 6e 74 20 22 58 3d 63 6f 6e 73  nstraint "X=cons
1b680 74 61 6e 74 22 20 6d 65 61 6e 73 20 58 20 68 61  tant" means X ha
1b690 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
1b6a0 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 7d 65 6c  value */.    }el
1b6b0 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1b6c0 70 52 69 67 68 74 20 3d 20 70 43 6f 6e 73 74 72  pRight = pConstr
1b6d0 61 69 6e 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69  aint->pExpr->pRi
1b6e0 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ght;.      if( p
1b6f0 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
1b700 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
1b710 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20 20  WHERETRACE(("   
1b720 20 20 20 20 2e 2e 20 69 73 4f 72 64 65 72 65 64      .. isOrdered
1b730 43 6f 6c 75 6d 6e 28 74 61 62 3d 25 64 2c 63 6f  Column(tab=%d,co
1b740 6c 3d 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20  l=%d)",.        
1b750 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
1b760 68 74 2d 3e 69 54 61 62 6c 65 2c 20 70 52 69 67  ht->iTable, pRig
1b770 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 29 3b 0a 20  ht->iColumn));. 
1b780 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 69 73         isEq = is
1b790 4f 72 64 65 72 65 64 43 6f 6c 75 6d 6e 28 70 2c  OrderedColumn(p,
1b7a0 20 70 52 69 67 68 74 2d 3e 69 54 61 62 6c 65 2c   pRight->iTable,
1b7b0 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
1b7c0 29 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  );.        WHERE
1b7d0 54 52 41 43 45 28 28 22 20 2d 3e 20 69 73 45 71  TRACE((" -> isEq
1b7e0 3d 25 64 5c 6e 22 2c 20 69 73 45 71 29 29 3b 0a  =%d\n", isEq));.
1b7f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
1b800 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
1b810 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 59   of the form X=Y
1b820 20 77 68 65 72 65 20 59 20 69 73 20 61 6e 20 6f   where Y is an o
1b830 72 64 65 72 65 64 20 76 61 6c 75 65 0a 20 20 20  rdered value.   
1b840 20 20 20 20 20 2a 2a 20 69 6e 20 61 6e 20 6f 75       ** in an ou
1b850 74 65 72 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 6d  ter loop, then m
1b860 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72  ake sure the sor
1b870 74 20 6f 72 64 65 72 20 6f 66 20 59 20 6d 61 74  t order of Y mat
1b880 63 68 65 73 20 74 68 65 0a 20 20 20 20 20 20 20  ches the.       
1b890 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 20 72   ** sort order r
1b8a0 65 71 75 69 72 65 64 20 66 6f 72 20 58 2e 20 2a  equired for X. *
1b8b0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  /.        if( is
1b8c0 4d 61 74 63 68 20 26 26 20 69 73 45 71 3e 3d 32  Match && isEq>=2
1b8d0 20 26 26 20 69 73 45 71 21 3d 70 4f 42 49 74 65   && isEq!=pOBIte
1b8e0 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 2b 32 20 29  m->sortOrder+2 )
1b8f0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
1b900 63 61 73 65 28 20 69 73 45 71 3d 3d 32 20 29 3b  case( isEq==2 );
1b910 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
1b920 61 73 65 28 20 69 73 45 71 3d 3d 33 20 29 3b 0a  ase( isEq==3 );.
1b930 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1b940 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b960 69 73 45 71 20 3d 20 30 3b 20 20 2f 2a 20 22 58  isEq = 0;  /* "X
1b970 3d 65 78 70 72 22 20 70 6c 61 63 65 73 20 6e 6f  =expr" places no
1b980 20 6f 72 64 65 72 69 6e 67 20 63 6f 6e 73 74 72   ordering constr
1b990 61 69 6e 74 73 20 6f 6e 20 58 20 2a 2f 0a 20 20  aints on X */.  
1b9a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b9b0 69 66 28 20 21 69 73 4d 61 74 63 68 20 29 7b 0a  if( !isMatch ){.
1b9c0 20 20 20 20 20 20 69 66 28 20 69 73 45 71 3d 3d        if( isEq==
1b9d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
1b9e0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
1b9f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
1ba00 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
1ba10 65 6c 73 65 20 69 66 28 20 69 73 45 71 21 3d 31  else if( isEq!=1
1ba20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 6f   ){.      if( so
1ba30 72 74 4f 72 64 65 72 3d 3d 32 20 29 7b 0a 20 20  rtOrder==2 ){.  
1ba40 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
1ba50 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b  = termSortOrder;
1ba60 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1ba70 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d   termSortOrder!=
1ba80 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  sortOrder ){.   
1ba90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1baa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b    }.    }.    j+
1bab0 2b 3b 0a 20 20 20 20 70 4f 42 49 74 65 6d 2b 2b  +;.    pOBItem++
1bac0 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d  ;.    if( iColum
1bad0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 65 65  n<0 ){.      see
1bae0 6e 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20  nRowid = 1;.    
1baf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
1bb00 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f  se if( pTab->aCo
1bb10 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  l[iColumn].notNu
1bb20 6c 6c 3d 3d 30 20 26 26 20 69 73 45 71 21 3d 31  ll==0 && isEq!=1
1bb30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
1bb40 73 65 28 20 69 73 45 71 3d 3d 30 20 29 3b 0a 20  se( isEq==0 );. 
1bb50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1bb60 73 45 71 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20  sEq==2 );.      
1bb70 74 65 73 74 63 61 73 65 28 20 69 73 45 71 3d 3d  testcase( isEq==
1bb80 33 20 29 3b 0a 20 20 20 20 20 20 75 6e 69 71 75  3 );.      uniqu
1bb90 65 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  eNotNull = 0;.  
1bba0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1bbb0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 66 6f 75   we have not fou
1bbc0 6e 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  nd at least one 
1bbd0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68  ORDER BY term th
1bbe0 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 0a 20  at matches the. 
1bbf0 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
1bc00 73 68 6f 77 20 6e 6f 20 70 72 6f 67 72 65 73 73  show no progress
1bc10 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 42 49 74  . */.  if( pOBIt
1bc20 65 6d 3d 3d 26 70 4f 72 64 65 72 42 79 2d 3e 61  em==&pOrderBy->a
1bc30 5b 6e 50 72 69 6f 72 53 61 74 5d 20 29 20 72 65  [nPriorSat] ) re
1bc40 74 75 72 6e 20 6e 50 72 69 6f 72 53 61 74 3b 0a  turn nPriorSat;.
1bc50 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  .  /* Return the
1bc60 20 6e 65 63 65 73 73 61 72 79 20 73 63 61 6e 20   necessary scan 
1bc70 6f 72 64 65 72 20 62 61 63 6b 20 74 6f 20 74 68  order back to th
1bc80 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 2a 70  e caller */.  *p
1bc90 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
1bca0 20 26 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   & 1;..  /* If t
1bcb0 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
1bcc0 45 52 20 42 59 20 72 6f 77 69 64 22 20 74 65 72  ER BY rowid" ter
1bcd0 6d 20 74 68 61 74 20 6d 61 74 63 68 65 64 2c 20  m that matched, 
1bce0 6f 72 20 69 74 20 69 73 20 6f 6e 6c 79 0a 20 20  or it is only.  
1bcf0 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
1bd00 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 72 6f  a single row fro
1bd10 6d 20 74 68 69 73 20 74 61 62 6c 65 20 74 6f 20  m this table to 
1bd20 6d 61 74 63 68 2c 20 74 68 65 6e 20 73 6b 69 70  match, then skip
1bd30 20 6f 76 65 72 0a 20 20 2a 2a 20 61 6e 79 20 61   over.  ** any a
1bd40 64 64 69 74 69 6f 6e 61 6c 20 4f 52 44 45 52 20  dditional ORDER 
1bd50 42 59 20 74 65 72 6d 73 20 64 65 61 6c 69 6e 67  BY terms dealing
1bd60 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
1bd70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 65 65  ..  */.  if( see
1bd80 6e 52 6f 77 69 64 20 7c 7c 20 28 75 6e 69 71 75  nRowid || (uniqu
1bd90 65 4e 6f 74 4e 75 6c 6c 20 26 26 20 69 3e 3d 70  eNotNull && i>=p
1bda0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 7b  Idx->nColumn) ){
1bdb0 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
1bdc0 6a 20 6f 76 65 72 20 61 64 64 69 74 69 6f 6e 61  j over additiona
1bdd0 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
1bde0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1bdf0 20 62 61 73 65 20 2a 2f 0a 20 20 20 20 57 68 65   base */.    Whe
1be00 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 53 20 3d  reMaskSet *pMS =
1be10 20 70 2d 3e 70 57 43 2d 3e 70 4d 61 73 6b 53 65   p->pWC->pMaskSe
1be20 74 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  t;.    Bitmask m
1be30 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 53 2c   = ~getMask(pMS,
1be40 20 62 61 73 65 29 3b 0a 20 20 20 20 77 68 69 6c   base);.    whil
1be50 65 28 20 6a 3c 6e 54 65 72 6d 20 26 26 20 28 65  e( j<nTerm && (e
1be60 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
1be70 53 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6a  S, pOrderBy->a[j
1be80 5d 2e 70 45 78 70 72 29 26 6d 29 3d 3d 30 20 29  ].pExpr)&m)==0 )
1be90 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1bea0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1beb0 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  j;.}../*.** Find
1bec0 20 74 68 65 20 62 65 73 74 20 71 75 65 72 79 20   the best query 
1bed0 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69  plan for accessi
1bee0 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ng a particular 
1bef0 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74 68  table.  Write th
1bf00 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
1bf10 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
1bf20 74 20 69 6e 74 6f 20 74 68 65 20 70 2d 3e 63 6f  t into the p->co
1bf30 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f  st..**.** The lo
1bf40 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20 77  west cost plan w
1bf50 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69  ins.  The cost i
1bf60 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1bf70 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a   the amount of.*
1bf80 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49  * CPU and disk I
1bf90 2f 4f 20 6e 65 65 64 65 64 20 74 6f 20 70 72 6f  /O needed to pro
1bfa0 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74  cess the request
1bfb0 65 64 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 46 61  ed result..** Fa
1bfc0 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75  ctors that influ
1bfd0 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64  ence cost includ
1bfe0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54  e:.**.**    *  T
1bff0 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
1c000 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
1c010 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76   will be retriev
1c020 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20  ed.  (The.**    
1c030 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74     fewer the bet
1c040 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ter.).**.**    *
1c050 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
1c060 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63   sorting must oc
1c070 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  cur..**.**    * 
1c080 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
1c090 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65  there must be se
1c0a0 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69  parate lookups i
1c0b0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69  n the.**       i
1c0c0 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20  ndex and in the 
1c0d0 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  main table..**.*
1c0e0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1c0f0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
1c100 75 73 65 20 28 70 53 72 63 2d 3e 70 49 6e 64 65  use (pSrc->pInde
1c110 78 29 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  x) attached to t
1c120 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  he table in.** t
1c130 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1c140 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1c150 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64  tion only consid
1c160 65 72 73 20 70 6c 61 6e 73 20 75 73 69 6e 67 20  ers plans using 
1c170 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e  the .** named in
1c180 64 65 78 2e 20 49 66 20 6e 6f 20 73 75 63 68 20  dex. If no such 
1c190 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74  plan is found, t
1c1a0 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64  hen the returned
1c1b0 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c 49   cost is.** SQLI
1c1c0 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20 61  TE_BIG_DBL. If a
1c1d0 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 20 74   plan is found t
1c1e0 68 61 74 20 75 73 65 73 20 74 68 65 20 6e 61 6d  hat uses the nam
1c1f0 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68  ed index, .** th
1c200 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 63  en the cost is c
1c210 61 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68 65  alculated in the
1c220 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a   usual way..**.*
1c230 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45 58  * If a NOT INDEX
1c240 45 44 20 63 6c 61 75 73 65 20 77 61 73 20 61 74  ED clause was at
1c250 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61  tached to the ta
1c260 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53  ble .** in the S
1c270 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1c280 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73   then no indexes
1c290 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
1c2a0 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 2a   However, the .*
1c2b0 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 20  * selected plan 
1c2c0 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61  may still take a
1c2d0 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
1c2e0 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20 70  built-in rowid p
1c2f0 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69 6e  rimary key.** in
1c300 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
1c310 6f 69 64 20 62 65 73 74 42 74 72 65 65 49 6e 64  oid bestBtreeInd
1c320 65 78 28 57 68 65 72 65 42 65 73 74 49 64 78 20  ex(WhereBestIdx 
1c330 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
1c340 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
1c350 3b 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e  ;  /* The parsin
1c360 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1c370 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
1c380 3d 20 70 2d 3e 70 57 43 3b 20 20 2f 2a 20 54 68  = p->pWC;  /* Th
1c390 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1c3a0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1c3b0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20  st_item *pSrc = 
1c3c0 70 2d 3e 70 53 72 63 3b 20 2f 2a 20 54 68 65 20  p->pSrc; /* The 
1c3d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1c3e0 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
1c3f0 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d  int iCur = pSrc-
1c400 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54  >iCursor;   /* T
1c410 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
1c420 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63   table to be acc
1c430 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  essed */.  Index
1c440 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20   *pProbe;       
1c450 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1c460 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  ex we are evalua
1c470 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ting */.  Index 
1c480 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
1c490 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
1c4a0 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72 6f   pProbe, or zero
1c4b0 20 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20 2a   for IPK index *
1c4c0 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61  /.  int eqTermMa
1c4d0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1c4e0 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b 20  /* Current mask 
1c4f0 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74  of valid equalit
1c500 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  y operators */. 
1c510 20 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d 61   int idxEqTermMa
1c520 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  sk;          /* 
1c530 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76 61  Index mask of va
1c540 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  lid equality ope
1c550 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64 65  rators */.  Inde
1c560 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20  x sPk;          
1c570 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b          /* A fak
1c580 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e index object f
1c590 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  or the primary k
1c5a0 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  ey */.  tRowcnt 
1c5b0 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
1c5c0 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
1c5d0 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  Est[] value for 
1c5e0 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
1c5f0 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50  .  int aiColumnP
1c600 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f  k = -1;        /
1c610 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20  * The aColumn[] 
1c620 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
1c630 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  k index */.  int
1c640 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20 20   wsFlagMask;    
1c650 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
1c660 77 65 64 20 66 6c 61 67 73 20 69 6e 20 70 2d 3e  wed flags in p->
1c670 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
1c680 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 69 6f 72   */.  int nPrior
1c690 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sat;            
1c6a0 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
1c6b0 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62 79  rms satisfied by
1c6c0 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   outer loops */.
1c6d0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c6f0 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
1c700 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 63   BY terms */.  c
1c710 68 61 72 20 62 53 6f 72 74 49 6e 69 74 3b 20 20  har bSortInit;  
1c720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c730 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 62 53  itializer for bS
1c740 6f 72 74 20 69 6e 20 69 6e 6e 65 72 20 6c 6f 6f  ort in inner loo
1c750 70 20 2a 2f 0a 20 20 63 68 61 72 20 62 44 69 73  p */.  char bDis
1c760 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  tInit;          
1c770 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1c780 72 20 66 6f 72 20 62 44 69 73 74 20 69 6e 20 69  r for bDist in i
1c790 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 0a 0a 20  nner loop */... 
1c7a0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1c7b0 68 65 20 63 6f 73 74 20 74 6f 20 61 20 77 6f 72  he cost to a wor
1c7c0 73 74 2d 63 61 73 65 20 76 61 6c 75 65 20 2a 2f  st-case value */
1c7d0 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 63 6f  .  memset(&p->co
1c7e0 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  st, 0, sizeof(p-
1c7f0 3e 63 6f 73 74 29 29 3b 0a 20 20 70 2d 3e 63 6f  >cost));.  p->co
1c800 73 74 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54  st.rCost = SQLIT
1c810 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a  E_BIG_DBL;..  /*
1c820 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62   If the pSrc tab
1c830 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20  le is the right 
1c840 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
1c850 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79  JOIN then we may
1c860 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e   not.  ** use an
1c870 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66   index to satisf
1c880 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  y IS NULL constr
1c890 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61  aints on that ta
1c8a0 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20  ble.  This is.  
1c8b0 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d  ** because colum
1c8c0 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ns might end up 
1c8d0 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68  being NULL if th
1c8e0 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
1c8f0 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20   match -.  ** a 
1c900 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69  circumstance whi
1c910 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  ch the index can
1c920 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63  not help us disc
1c930 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32  over.  Ticket #2
1c940 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  177..  */.  if( 
1c950 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  pSrc->jointype &
1c960 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20   JT_LEFT ){.    
1c970 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20  idxEqTermMask = 
1c980 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d  WO_EQ|WO_IN;.  }
1c990 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 45 71 54  else{.    idxEqT
1c9a0 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c  ermMask = WO_EQ|
1c9b0 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b  WO_IN|WO_ISNULL;
1c9c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72 63  .  }..  if( pSrc
1c9d0 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
1c9e0 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
1c9f0 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
1ca00 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
1ca10 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
1ca20 20 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62 65     pIdx = pProbe
1ca30 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b   = pSrc->pIndex;
1ca40 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20  .    wsFlagMask 
1ca50 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f  = ~(WHERE_ROWID_
1ca60 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
1ca70 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72  ANGE);.    eqTer
1ca80 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72  mMask = idxEqTer
1ca90 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mMask;.  }else{.
1caa0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
1cab0 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
1cac0 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20  ause.  Create a 
1cad0 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63  fake Index objec
1cae0 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a  t in local.    *
1caf0 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74  * variable sPk t
1cb00 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
1cb10 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1cb20 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74  y index.  Make t
1cb30 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20  his.    ** fake 
1cb40 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20  index the first 
1cb50 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e  in a chain of In
1cb60 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68  dex objects with
1cb70 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c   all of the real
1cb80 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  .    ** indices 
1cb90 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20  to follow */.   
1cba0 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20   Index *pFirst; 
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61   /* First of rea
1cbd0 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
1cbe0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65   table */.    me
1cbf0 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69  mset(&sPk, 0, si
1cc00 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
1cc10 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
1cc20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
1cc30 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
1cc40 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
1cc50 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
1cc60 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
1cc70 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
1cc80 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
1cc90 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20   pSrc->pTab;.   
1cca0 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
1ccb0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f   pSrc->pTab->nRo
1ccc0 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  wEst;.    aiRowE
1ccd0 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20  stPk[1] = 1;.   
1cce0 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
1ccf0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1cd00 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49    if( pSrc->notI
1cd10 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
1cd20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
1cd30 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
1cd40 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
1cd50 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
1cd60 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
1cd70 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
1cd80 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
1cd90 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1cda0 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
1cdb0 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
1cdc0 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
1cdd0 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61  Pk;.    wsFlagMa
1cde0 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20 20  sk = ~(.        
1cdf0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
1ce00 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
1ce10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
1ce20 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  L|WHERE_COLUMN_R
1ce30 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  ANGE.    );.    
1ce40 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  eqTermMask = WO_
1ce50 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49  EQ|WO_IN;.    pI
1ce60 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 6e  dx = 0;.  }..  n
1ce70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1ce80 64 65 72 42 79 20 3f 20 70 2d 3e 70 4f 72 64 65  derBy ? p->pOrde
1ce90 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  rBy->nExpr : 0;.
1cea0 20 20 69 66 28 20 70 2d 3e 69 20 29 7b 0a 20 20    if( p->i ){.  
1ceb0 20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 70 2d    nPriorSat = p-
1cec0 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d 2e  >aLevel[p->i-1].
1ced0 70 6c 61 6e 2e 6e 4f 42 53 61 74 3b 0a 20 20 20  plan.nOBSat;.   
1cee0 20 62 53 6f 72 74 49 6e 69 74 20 3d 20 6e 50 72   bSortInit = nPr
1cef0 69 6f 72 53 61 74 3c 6e 4f 72 64 65 72 42 79 3b  iorSat<nOrderBy;
1cf00 0a 20 20 20 20 62 44 69 73 74 49 6e 69 74 20 3d  .    bDistInit =
1cf10 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1cf20 20 6e 50 72 69 6f 72 53 61 74 20 3d 20 30 3b 0a   nPriorSat = 0;.
1cf30 20 20 20 20 62 53 6f 72 74 49 6e 69 74 20 3d 20      bSortInit = 
1cf40 6e 4f 72 64 65 72 42 79 3e 30 3b 0a 20 20 20 20  nOrderBy>0;.    
1cf50 62 44 69 73 74 49 6e 69 74 20 3d 20 70 2d 3e 70  bDistInit = p->p
1cf60 44 69 73 74 69 6e 63 74 21 3d 30 3b 0a 20 20 7d  Distinct!=0;.  }
1cf70 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
1cf80 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f   all indices loo
1cf90 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73  king for the bes
1cfa0 74 20 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a  t one to use.  *
1cfb0 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65  /.  for(; pProbe
1cfc0 3b 20 70 49 64 78 3d 70 50 72 6f 62 65 3d 70 50  ; pIdx=pProbe=pP
1cfd0 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  robe->pNext){.  
1cfe0 20 20 63 6f 6e 73 74 20 74 52 6f 77 63 6e 74 20    const tRowcnt 
1cff0 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45 73 74  * const aiRowEst
1d000 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
1d010 45 73 74 3b 0a 20 20 20 20 57 68 65 72 65 43 6f  Est;.    WhereCo
1d020 73 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  st pc;          
1d030 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
1d040 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a  using pProbe */.
1d050 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 67 31 30      double log10
1d060 4e 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 20 20  N = (double)1;  
1d070 2f 2a 20 62 61 73 65 2d 31 30 20 6c 6f 67 61 72  /* base-10 logar
1d080 69 74 68 6d 20 6f 66 20 6e 52 6f 77 20 28 69 6e  ithm of nRow (in
1d090 65 78 61 63 74 29 20 2a 2f 0a 0a 20 20 20 20 2f  exact) */..    /
1d0a0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1d0b0 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 70 6f  variables are po
1d0c0 70 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  pulated based on
1d0d0 20 74 68 65 20 70 72 6f 70 65 72 74 69 65 73 20   the properties 
1d0e0 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  of.    ** index 
1d0f0 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 2e  being evaluated.
1d100 20 54 68 65 79 20 61 72 65 20 74 68 65 6e 20 75   They are then u
1d110 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
1d120 20 74 68 65 20 65 78 70 65 63 74 65 64 0a 20 20   the expected.  
1d130 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20 6e 75    ** cost and nu
1d140 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74  mber of rows ret
1d150 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  urned..    **.  
1d160 20 20 2a 2a 20 20 70 63 2e 70 6c 61 6e 2e 6e 45    **  pc.plan.nE
1d170 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75  q: .    **    Nu
1d180 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
1d190 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20   terms that can 
1d1a0 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  be implemented u
1d1b0 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 0a  sing the index..
1d1c0 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68      **    In oth
1d1d0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6e 75  er words, the nu
1d1e0 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61 6c 20  mber of initial 
1d1f0 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 69 6e  fields in the in
1d200 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  dex that.    ** 
1d210 20 20 20 61 72 65 20 75 73 65 64 20 69 6e 20 3d     are used in =
1d220 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e  = or IN or NOT N
1d230 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
1d240 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1d250 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  use..    **.    
1d260 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20  **  nInMul:  .  
1d270 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d    **    The "in-
1d280 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69  multiplier". Thi
1d290 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  s is an estimate
1d2a0 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65   of how many see
1d2b0 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20  k operations .  
1d2c0 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d    **    SQLite m
1d2d0 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74  ust perform on t
1d2e0 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73  he index in ques
1d2f0 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tion. For exampl
1d300 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
1d310 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73  *    WHERE claus
1d320 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e is:.    **.   
1d330 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61   **      WHERE a
1d340 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e   IN (1, 2, 3) AN
1d350 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29  D b IN (4, 5, 6)
1d360 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d370 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65    SQLite must pe
1d380 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20  rform 9 lookups 
1d390 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  on an index on (
1d3a0 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c  a, b), so nInMul
1d3b0 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73   is .    **    s
1d3c0 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74  et to 9. Given t
1d3d0 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61  he same schema a
1d3e0 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  nd either of the
1d3f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45   following WHERE
1d400 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75   .    **    clau
1d410 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ses:.    **.    
1d420 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
1d430 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  =  1.    **     
1d440 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20   WHERE a >= 2.  
1d450 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e    **.    **    n
1d460 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20  InMul is set to 
1d470 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  1..    **.    **
1d480 20 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69      If there exi
1d490 73 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d  sts a WHERE term
1d4a0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
1d4b0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1d4c0 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20  , then .    **  
1d4d0 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74    the sub-select
1d4e0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72   is assumed to r
1d4f0 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f  eturn 25 rows fo
1d500 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
1d510 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74  f .    **    det
1d520 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e  ermining nInMul.
1d530 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d540 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a  bInEst:  .    **
1d550 20 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20      Set to true 
1d560 69 66 20 74 68 65 72 65 20 77 61 73 20 61 74 20  if there was at 
1d570 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20  least one "x IN 
1d580 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65  (SELECT ...)" te
1d590 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20  rm used .    ** 
1d5a0 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e     in determinin
1d5b0 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  g the value of n
1d5c0 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61  InMul.  Note tha
1d5d0 74 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  t the RHS of the
1d5e0 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70  .    **    IN op
1d5f0 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 61  erator must be a
1d600 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76   SELECT, not a v
1d610 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72 20 74  alue list, for t
1d620 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20 20 20  his variable.   
1d630 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74 72 75   **    to be tru
1d640 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1d650 20 20 72 61 6e 67 65 44 69 76 3a 0a 20 20 20 20    rangeDiv:.    
1d660 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d 61 74  **    An estimat
1d670 65 20 6f 66 20 61 20 64 69 76 69 73 6f 72 20 62  e of a divisor b
1d680 79 20 77 68 69 63 68 20 74 6f 20 72 65 64 75 63  y which to reduc
1d690 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
1d6a0 63 65 20 64 75 65 0a 20 20 20 20 2a 2a 20 20 20  ce due.    **   
1d6b0 20 74 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63   to inequality c
1d6c0 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 49 6e 20  onstraints.  In 
1d6d0 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
1d6e0 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c  qlite_stat3 ANAL
1d6f0 59 5a 45 0a 20 20 20 20 2a 2a 20 20 20 20 64 61  YZE.    **    da
1d700 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65  ta, a single ine
1d710 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
1d720 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
1d730 20 74 6f 20 31 2f 34 72 64 20 69 74 73 0a 20 20   to 1/4rd its.  
1d740 20 20 2a 2a 20 20 20 20 6f 72 69 67 69 6e 61 6c    **    original
1d750 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69 76 3d   size (rangeDiv=
1d760 3d 34 29 2e 20 20 54 77 6f 20 69 6e 65 71 75 61  =4).  Two inequa
1d770 6c 69 74 69 65 73 20 72 65 64 75 63 65 20 74 68  lities reduce th
1d780 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20  e search.    ** 
1d790 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f 31 36     space to 1/16
1d7a0 74 68 20 6f 66 20 69 74 73 20 6f 72 69 67 69 6e  th of its origin
1d7b0 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69  al size (rangeDi
1d7c0 76 3d 3d 31 36 29 2e 0a 20 20 20 20 2a 2a 0a 20  v==16)..    **. 
1d7d0 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20     **  bSort:   
1d7e0 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65  .    **    Boole
1d7f0 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68 65 72  an. True if ther
1d800 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1d810 20 63 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c   clause that wil
1d820 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20  l require an .  
1d830 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c    **    external
1d840 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63 61 6e   sort (i.e. scan
1d850 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 62  ning the index b
1d860 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 77  eing evaluated w
1d870 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20  ill not .    ** 
1d880 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f 72 64     correctly ord
1d890 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20 20 20  er records)..   
1d8a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 44 69 73   **.    **  bDis
1d8b0 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f  t:.    **    Boo
1d8c0 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68  lean. True if th
1d8d0 65 72 65 20 69 73 20 61 20 44 49 53 54 49 4e 43  ere is a DISTINC
1d8e0 54 20 63 6c 61 75 73 65 20 74 68 61 74 20 77 69  T clause that wi
1d8f0 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20  ll require an . 
1d900 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61     **    externa
1d910 6c 20 62 74 72 65 65 2e 0a 20 20 20 20 2a 2a 0a  l btree..    **.
1d920 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a      **  bLookup:
1d930 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c   .    **    Bool
1d940 65 61 6e 2e 20 54 72 75 65 20 69 66 20 61 20 74  ean. True if a t
1d950 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 69 73 20 72  able lookup is r
1d960 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
1d970 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 20 20 20   index entry.   
1d980 20 2a 2a 20 20 20 20 76 69 73 69 74 65 64 2e 20   **    visited. 
1d990 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1d9a0 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
1d9b0 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e 67 20   not a covering 
1d9c0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20 20  index..    **   
1d9d0 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
1d9e0 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 72 6f  false for the ro
1d9f0 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
1da00 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65  index of a table
1da10 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f 72 20  ..    **    For 
1da20 6f 74 68 65 72 20 69 6e 64 65 78 65 73 2c 20 69  other indexes, i
1da30 74 20 69 73 20 74 72 75 65 20 75 6e 6c 65 73 73  t is true unless
1da40 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 73   all the columns
1da50 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   of the table.  
1da60 20 20 2a 2a 20 20 20 20 75 73 65 64 20 62 79 20    **    used by 
1da70 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1da80 6d 65 6e 74 20 61 72 65 20 70 72 65 73 65 6e 74  ment are present
1da90 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 28 73   in the index (s
1daa0 75 63 68 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  uch an.    **   
1dab0 20 69 6e 64 65 78 20 69 73 20 73 6f 6d 65 74 69   index is someti
1dac0 6d 65 73 20 64 65 73 63 72 69 62 65 64 20 61 73  mes described as
1dad0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1dae0 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f  x)..    **    Fo
1daf0 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e  r example, given
1db00 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 28 61   the index on (a
1db10 2c 20 62 29 2c 20 74 68 65 20 73 65 63 6f 6e 64  , b), the second
1db20 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1db30 67 20 0a 20 20 20 20 2a 2a 20 20 20 20 74 77 6f  g .    **    two
1db40 20 71 75 65 72 69 65 73 20 72 65 71 75 69 72 65   queries require
1db50 73 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6c  s table b-tree l
1db60 6f 6f 6b 75 70 73 20 69 6e 20 6f 72 64 65 72 20  ookups in order 
1db70 74 6f 20 66 69 6e 64 20 74 68 65 20 76 61 6c 75  to find the valu
1db80 65 0a 20 20 20 20 2a 2a 20 20 20 20 6f 66 20 63  e.    **    of c
1db90 6f 6c 75 6d 6e 20 63 2c 20 62 75 74 20 74 68 65  olumn c, but the
1dba0 20 66 69 72 73 74 20 64 6f 65 73 20 6e 6f 74 20   first does not 
1dbb0 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20  because columns 
1dbc0 61 20 61 6e 64 20 62 20 61 72 65 0a 20 20 20 20  a and b are.    
1dbd0 2a 2a 20 20 20 20 62 6f 74 68 20 61 76 61 69 6c  **    both avail
1dbe0 61 62 6c 65 20 69 6e 20 74 68 65 20 69 6e 64 65  able in the inde
1dbf0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c               SEL
1dc10 45 43 54 20 61 2c 20 62 20 20 20 20 46 52 4f 4d  ECT a, b    FROM
1dc20 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31   tbl WHERE a = 1
1dc30 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ;.    **        
1dc40 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62       SELECT a, b
1dc50 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57 48 45  , c FROM tbl WHE
1dc60 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2f  RE a = 1;.    */
1dc70 0a 20 20 20 20 69 6e 74 20 62 49 6e 45 73 74 20  .    int bInEst 
1dc80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1dc90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 78     /* True if "x
1dca0 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22   IN (SELECT...)"
1dcb0 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   seen */.    int
1dcc0 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b 20 20 20 20   nInMul = 1;    
1dcd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dce0 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74  mber of distinct
1dcf0 20 65 71 75 61 6c 69 74 69 65 73 20 74 6f 20 6c   equalities to l
1dd00 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 64 6f 75  ookup */.    dou
1dd10 62 6c 65 20 72 61 6e 67 65 44 69 76 20 3d 20 28  ble rangeDiv = (
1dd20 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a 20 45 73  double)1;  /* Es
1dd30 74 69 6d 61 74 65 64 20 72 65 64 75 63 74 69 6f  timated reductio
1dd40 6e 20 69 6e 20 73 65 61 72 63 68 20 73 70 61 63  n in search spac
1dd50 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 6f  e */.    int nBo
1dd60 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  und = 0;        
1dd70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1dd80 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
1dd90 61 69 6e 74 73 20 73 65 65 6e 20 2a 2f 0a 20 20  aints seen */.  
1dda0 20 20 63 68 61 72 20 62 53 6f 72 74 20 3d 20 62    char bSort = b
1ddb0 53 6f 72 74 49 6e 69 74 3b 20 20 20 20 20 20 20  SortInit;       
1ddc0 2f 2a 20 54 72 75 65 20 69 66 20 65 78 74 65 72  /* True if exter
1ddd0 6e 61 6c 20 73 6f 72 74 20 72 65 71 75 69 72 65  nal sort require
1dde0 64 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62 44  d */.    char bD
1ddf0 69 73 74 20 3d 20 62 44 69 73 74 49 6e 69 74 3b  ist = bDistInit;
1de00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1de10 66 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68  f index cannot h
1de20 65 6c 70 20 77 69 74 68 20 44 49 53 54 49 4e 43  elp with DISTINC
1de30 54 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62 4c  T */.    char bL
1de40 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20 20 20 20  ookup = 0;      
1de50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1de60 66 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e 67  f not a covering
1de70 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 57 68   index */.    Wh
1de80 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1de90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1dea0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
1deb0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1dec0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1ded0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
1dee0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 46     WhereTerm *pF
1def0 69 72 73 74 54 65 72 6d 20 3d 20 30 3b 20 20 20  irstTerm = 0;   
1df00 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6d   /* First term m
1df10 61 74 63 68 69 6e 67 20 74 68 65 20 69 6e 64 65  atching the inde
1df20 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20  x */.#endif..   
1df30 20 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20   WHERETRACE((.  
1df40 20 20 20 20 22 20 20 20 25 73 28 25 73 29 3a 5c      "   %s(%s):\
1df50 6e 22 2c 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  n",.      pSrc->
1df60 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49  pTab->zName, (pI
1df70 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  dx ? pIdx->zName
1df80 20 3a 20 22 69 70 6b 22 29 0a 20 20 20 20 29 29   : "ipk").    ))
1df90 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 63  ;.    memset(&pc
1dfa0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 63 29 29  , 0, sizeof(pc))
1dfb0 3b 0a 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e 4f  ;.    pc.plan.nO
1dfc0 42 53 61 74 20 3d 20 6e 50 72 69 6f 72 53 61 74  BSat = nPriorSat
1dfd0 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  ;..    /* Determ
1dfe0 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ine the values o
1dff0 66 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 20 61 6e  f pc.plan.nEq an
1e000 64 20 6e 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20  d nInMul */.    
1e010 66 6f 72 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d  for(pc.plan.nEq=
1e020 30 3b 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3c 70  0; pc.plan.nEq<p
1e030 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Probe->nColumn; 
1e040 70 63 2e 70 6c 61 6e 2e 6e 45 71 2b 2b 29 7b 0a  pc.plan.nEq++){.
1e050 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
1e060 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  robe->aiColumn[p
1e070 63 2e 70 6c 61 6e 2e 6e 45 71 5d 3b 0a 20 20 20  c.plan.nEq];.   
1e080 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
1e090 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
1e0a0 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 65  , p->notReady, e
1e0b0 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29  qTermMask, pIdx)
1e0c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1e0d0 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
1e0e0 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
1e0f0 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f  ags |= (WHERE_CO
1e100 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f  LUMN_EQ|WHERE_RO
1e110 57 49 44 5f 45 51 29 3b 0a 20 20 20 20 20 20 74  WID_EQ);.      t
1e120 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1e130 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20 20  pWC!=pWC );.    
1e140 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
1e150 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1e160 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1e170 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
1e180 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 63  Expr;.        pc
1e190 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  .plan.wsFlags |=
1e1a0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
1e1b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
1e1c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e1d0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1e1e0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
1e1f0 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
1e200 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d 65 20   ...)":  Assume 
1e210 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72  the SELECT retur
1e220 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
1e230 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a          nInMul *
1e240 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 20 20  = 25;.          
1e250 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20 20 20  bInEst = 1;.    
1e260 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
1e270 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
1e280 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
1e290 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
1e2a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 78  .          /* "x
1e2b0 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
1e2c0 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20  e, ...)" */.    
1e2d0 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20        nInMul *= 
1e2e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1e2f0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  nExpr;.        }
1e300 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e310 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1e320 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  r & WO_ISNULL ){
1e330 0a 20 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e  .        pc.plan
1e340 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1e350 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
1e360 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
1e370 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1e380 33 0a 20 20 20 20 20 20 69 66 28 20 70 63 2e 70  3.      if( pc.p
1e390 6c 61 6e 2e 6e 45 71 3d 3d 30 20 26 26 20 70 50  lan.nEq==0 && pP
1e3a0 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65 20 29 20  robe->aSample ) 
1e3b0 70 46 69 72 73 74 54 65 72 6d 20 3d 20 70 54 65  pFirstTerm = pTe
1e3c0 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  rm;.#endif.     
1e3d0 20 70 63 2e 75 73 65 64 20 7c 3d 20 70 54 65 72   pc.used |= pTer
1e3e0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1e3f0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 49      }. .    /* I
1e400 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  f the index bein
1e410 67 20 63 6f 6e 73 69 64 65 72 65 64 20 69 73 20  g considered is 
1e420 55 4e 49 51 55 45 2c 20 61 6e 64 20 74 68 65 72  UNIQUE, and ther
1e430 65 20 69 73 20 61 6e 20 65 71 75 61 6c 69 74 79  e is an equality
1e440 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61   .    ** constra
1e450 69 6e 74 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75  int for all colu
1e460 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
1e470 2c 20 74 68 65 6e 20 74 68 69 73 20 73 65 61 72  , then this sear
1e480 63 68 20 77 69 6c 6c 20 66 69 6e 64 0a 20 20 20  ch will find.   
1e490 20 2a 2a 20 61 74 20 6d 6f 73 74 20 61 20 73 69   ** at most a si
1e4a0 6e 67 6c 65 20 72 6f 77 2e 20 49 6e 20 74 68 69  ngle row. In thi
1e4b0 73 20 63 61 73 65 20 73 65 74 20 74 68 65 20 57  s case set the W
1e4c0 48 45 52 45 5f 55 4e 49 51 55 45 20 66 6c 61 67  HERE_UNIQUE flag
1e4d0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   to .    ** indi
1e4e0 63 61 74 65 20 74 68 69 73 20 74 6f 20 74 68 65  cate this to the
1e4f0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a   caller..    **.
1e500 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
1e510 2c 20 69 66 20 74 68 65 20 73 65 61 72 63 68 20  , if the search 
1e520 6d 61 79 20 66 69 6e 64 20 6d 6f 72 65 20 74 68  may find more th
1e530 61 6e 20 6f 6e 65 20 72 6f 77 2c 20 74 65 73 74  an one row, test
1e540 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a   to see if.    *
1e550 2a 20 74 68 65 72 65 20 69 73 20 61 20 72 61 6e  * there is a ran
1e560 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ge constraint on
1e570 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
1e580 28 70 63 2e 70 6c 61 6e 2e 6e 45 71 2b 31 29 20  (pc.plan.nEq+1) 
1e590 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 6e 20  that.    ** can 
1e5a0 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  be optimized usi
1e5b0 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 20 0a 20  ng the index. . 
1e5c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63     */.    if( pc
1e5d0 2e 70 6c 61 6e 2e 6e 45 71 3d 3d 70 50 72 6f 62  .plan.nEq==pProb
1e5e0 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 50  e->nColumn && pP
1e5f0 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  robe->onError!=O
1e600 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  E_None ){.      
1e610 74 65 73 74 63 61 73 65 28 20 70 63 2e 70 6c 61  testcase( pc.pla
1e620 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1e630 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20  E_COLUMN_IN );. 
1e640 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1e650 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  c.plan.wsFlags &
1e660 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
1e670 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LL );.      if( 
1e680 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  (pc.plan.wsFlags
1e690 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
1e6a0 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
1e6b0 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20  _NULL))==0 ){.  
1e6c0 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73        pc.plan.ws
1e6d0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55  Flags |= WHERE_U
1e6e0 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 69  NIQUE;.        i
1e6f0 66 28 20 70 2d 3e 69 3d 3d 30 20 7c 7c 20 28 70  f( p->i==0 || (p
1e700 2d 3e 61 4c 65 76 65 6c 5b 70 2d 3e 69 2d 31 5d  ->aLevel[p->i-1]
1e710 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1e720 57 48 45 52 45 5f 41 4c 4c 5f 55 4e 49 51 55 45  WHERE_ALL_UNIQUE
1e730 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1e740 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67    pc.plan.wsFlag
1e750 73 20 7c 3d 20 57 48 45 52 45 5f 41 4c 4c 5f 55  s |= WHERE_ALL_U
1e760 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 7d  NIQUE;.        }
1e770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1e780 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62  se if( pProbe->b
1e790 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20 29 7b 0a  Unordered==0 ){.
1e7a0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1e7b0 20 20 20 6a 20 3d 20 28 70 63 2e 70 6c 61 6e 2e     j = (pc.plan.
1e7c0 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq==pProbe->nCo
1e7d0 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20 70 50 72 6f  lumn ? -1 : pPro
1e7e0 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 63 2e  be->aiColumn[pc.
1e7f0 70 6c 61 6e 2e 6e 45 71 5d 29 3b 0a 20 20 20 20  plan.nEq]);.    
1e800 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
1e810 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 70 2d 3e  WC, iCur, j, p->
1e820 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
1e830 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
1e840 45 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20  E, pIdx) ){.    
1e850 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1e860 54 6f 70 2c 20 2a 70 42 74 6d 3b 0a 20 20 20 20  Top, *pBtm;.    
1e870 20 20 20 20 70 54 6f 70 20 3d 20 66 69 6e 64 54      pTop = findT
1e880 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
1e890 2c 20 70 2d 3e 6e 6f 74 52 65 61 64 79 2c 20 57  , p->notReady, W
1e8a0 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78  O_LT|WO_LE, pIdx
1e8b0 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 6d 20  );.        pBtm 
1e8c0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1e8d0 69 43 75 72 2c 20 6a 2c 20 70 2d 3e 6e 6f 74 52  iCur, j, p->notR
1e8e0 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
1e8f0 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  E, pIdx);.      
1e900 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e    whereRangeScan
1e910 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
1e920 62 65 2c 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 2c  be, pc.plan.nEq,
1e930 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72 61   pBtm, pTop, &ra
1e940 6e 67 65 44 69 76 29 3b 0a 20 20 20 20 20 20 20  ngeDiv);.       
1e950 20 69 66 28 20 70 54 6f 70 20 29 7b 0a 20 20 20   if( pTop ){.   
1e960 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d 20         nBound = 
1e970 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e  1;.          pc.
1e980 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
1e990 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
1e9a0 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 75 73  .          pc.us
1e9b0 65 64 20 7c 3d 20 70 54 6f 70 2d 3e 70 72 65 72  ed |= pTop->prer
1e9c0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
1e9d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
1e9e0 70 2d 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20  p->pWC!=pWC );. 
1e9f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ea00 20 69 66 28 20 70 42 74 6d 20 29 7b 0a 20 20 20   if( pBtm ){.   
1ea10 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b         nBound++;
1ea20 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c  .          pc.pl
1ea30 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1ea40 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
1ea50 20 20 20 20 20 20 20 20 20 70 63 2e 75 73 65 64           pc.used
1ea60 20 7c 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65 71   |= pBtm->prereq
1ea70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
1ea80 20 74 65 73 74 63 61 73 65 28 20 70 42 74 6d 2d   testcase( pBtm-
1ea90 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20  >pWC!=pWC );.   
1eaa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1eab0 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1eac0 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  = (WHERE_COLUMN_
1ead0 52 41 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57 49  RANGE|WHERE_ROWI
1eae0 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 20 20  D_RANGE);.      
1eaf0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1eb00 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1eb10 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1eb20 6e 64 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  nd the index bei
1eb30 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 77 69  ng considered wi
1eb40 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72 61  ll.    ** natura
1eb50 6c 6c 79 20 73 63 61 6e 20 72 6f 77 73 20 69 6e  lly scan rows in
1eb60 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6f 72   the required or
1eb70 64 65 72 2c 20 73 65 74 20 74 68 65 20 61 70 70  der, set the app
1eb80 72 6f 70 72 69 61 74 65 20 66 6c 61 67 73 0a 20  ropriate flags. 
1eb90 20 20 20 2a 2a 20 69 6e 20 70 63 2e 70 6c 61 6e     ** in pc.plan
1eba0 2e 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77  .wsFlags. Otherw
1ebb0 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 69 73  ise, if there is
1ebc0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1ebd0 75 73 65 20 62 75 74 0a 20 20 20 20 2a 2a 20 74  use but.    ** t
1ebe0 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 73 63  he index will sc
1ebf0 61 6e 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66  an rows in a dif
1ec00 66 65 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65  ferent order, se
1ec10 74 20 74 68 65 20 62 53 6f 72 74 0a 20 20 20 20  t the bSort.    
1ec20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
1ec30 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 26  .    if( bSort &
1ec40 26 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  & (pSrc->jointyp
1ec50 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20  e & JT_LEFT)==0 
1ec60 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 52 65  ){.      int bRe
1ec70 76 20 3d 20 32 3b 0a 20 20 20 20 20 20 57 48 45  v = 2;.      WHE
1ec80 52 45 54 52 41 43 45 28 28 22 20 20 20 20 20 20  RETRACE(("      
1ec90 2d 2d 3e 20 62 65 66 6f 72 65 20 69 73 53 6f 72  --> before isSor
1eca0 74 69 6e 67 49 6e 64 65 78 3a 20 6e 50 72 69 6f  tingIndex: nPrio
1ecb0 72 53 61 74 3d 25 64 5c 6e 22 2c 6e 50 72 69 6f  rSat=%d\n",nPrio
1ecc0 72 53 61 74 29 29 3b 0a 20 20 20 20 20 20 70 63  rSat));.      pc
1ecd0 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 3d 20 69  .plan.nOBSat = i
1ece0 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 2c  sSortingIndex(p,
1ecf0 20 70 50 72 6f 62 65 2c 20 69 43 75 72 2c 20 26   pProbe, iCur, &
1ed00 62 52 65 76 29 3b 0a 20 20 20 20 20 20 57 48 45  bRev);.      WHE
1ed10 52 45 54 52 41 43 45 28 28 22 20 20 20 20 20 20  RETRACE(("      
1ed20 2d 2d 3e 20 61 66 74 65 72 20 20 69 73 53 6f 72  --> after  isSor
1ed30 74 69 6e 67 49 6e 64 65 78 3a 20 62 52 65 76 3d  tingIndex: bRev=
1ed40 25 64 20 6e 4f 42 53 61 74 3d 25 64 5c 6e 22 2c  %d nOBSat=%d\n",
1ed50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ed60 20 20 20 62 52 65 76 2c 20 70 63 2e 70 6c 61 6e     bRev, pc.plan
1ed70 2e 6e 4f 42 53 61 74 29 29 3b 0a 20 20 20 20 20  .nOBSat));.     
1ed80 20 69 66 28 20 6e 50 72 69 6f 72 53 61 74 3c 70   if( nPriorSat<p
1ed90 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20 7c 7c  c.plan.nOBSat ||
1eda0 20 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67   (pc.plan.wsFlag
1edb0 73 20 26 20 57 48 45 52 45 5f 41 4c 4c 5f 55 4e  s & WHERE_ALL_UN
1edc0 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  IQUE)!=0 ){.    
1edd0 20 20 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c      pc.plan.wsFl
1ede0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44  ags |= WHERE_ORD
1edf0 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ERED;.      }.  
1ee00 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79      if( nOrderBy
1ee10 3d 3d 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  ==pc.plan.nOBSat
1ee20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72   ){.        bSor
1ee30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
1ee40 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  c.plan.wsFlags |
1ee50 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  = WHERE_ROWID_RA
1ee60 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  NGE|WHERE_COLUMN
1ee70 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 7d 0a  _RANGE;.      }.
1ee80 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 26        if( bRev &
1ee90 20 31 20 29 20 70 63 2e 70 6c 61 6e 2e 77 73 46   1 ) pc.plan.wsF
1eea0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
1eeb0 56 45 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  VERSE;.    }..  
1eec0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1eed0 20 61 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c   a DISTINCT qual
1eee0 69 66 69 65 72 20 61 6e 64 20 74 68 69 73 20 69  ifier and this i
1eef0 6e 64 65 78 20 77 69 6c 6c 20 73 63 61 6e 20 72  ndex will scan r
1ef00 6f 77 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 72  ows in.    ** or
1ef10 64 65 72 20 6f 66 20 74 68 65 20 44 49 53 54 49  der of the DISTI
1ef20 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  NCT expressions,
1ef30 20 63 6c 65 61 72 20 62 44 69 73 74 20 61 6e 64   clear bDist and
1ef40 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72   set the appropr
1ef50 69 61 74 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  iate.    ** flag
1ef60 73 20 69 6e 20 70 63 2e 70 6c 61 6e 2e 77 73 46  s in pc.plan.wsF
1ef70 6c 61 67 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  lags. */.    if(
1ef80 20 62 44 69 73 74 0a 20 20 20 20 20 26 26 20 69   bDist.     && i
1ef90 73 44 69 73 74 69 6e 63 74 49 6e 64 65 78 28 70  sDistinctIndex(p
1efa0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 50 72 6f  Parse, pWC, pPro
1efb0 62 65 2c 20 69 43 75 72 2c 20 70 2d 3e 70 44 69  be, iCur, p->pDi
1efc0 73 74 69 6e 63 74 2c 20 70 63 2e 70 6c 61 6e 2e  stinct, pc.plan.
1efd0 6e 45 71 29 0a 20 20 20 20 20 26 26 20 28 70 63  nEq).     && (pc
1efe0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1eff0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
1f000 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
1f010 20 62 44 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   bDist = 0;.    
1f020 20 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67    pc.plan.wsFlag
1f030 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  s |= WHERE_ROWID
1f040 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c  _RANGE|WHERE_COL
1f050 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
1f060 44 49 53 54 49 4e 43 54 3b 0a 20 20 20 20 7d 0a  DISTINCT;.    }.
1f070 0a 20 20 20 20 2f 2a 20 49 66 20 63 75 72 72 65  .    /* If curre
1f080 6e 74 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e 67  ntly calculating
1f090 20 74 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69   the cost of usi
1f0a0 6e 67 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74  ng an index (not
1f0b0 20 74 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20   the IPK.    ** 
1f0c0 69 6e 64 65 78 29 2c 20 64 65 74 65 72 6d 69 6e  index), determin
1f0d0 65 20 69 66 20 61 6c 6c 20 72 65 71 75 69 72 65  e if all require
1f0e0 64 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61  d column data ma
1f0f0 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 77 69  y be obtained wi
1f100 74 68 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75 73  thout .    ** us
1f110 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 74 61 62  ing the main tab
1f120 6c 65 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  le (i.e. if the 
1f130 69 6e 64 65 78 20 69 73 20 61 20 63 6f 76 65 72  index is a cover
1f140 69 6e 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ing.    ** index
1f150 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 29   for this query)
1f160 2e 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20  . If it is, set 
1f170 74 68 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  the WHERE_IDX_ON
1f180 4c 59 20 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a  LY flag in.    *
1f190 2a 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  * pc.plan.wsFlag
1f1a0 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  s. Otherwise, se
1f1b0 74 20 74 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61  t the bLookup va
1f1c0 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65 2e 20  riable to true. 
1f1d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
1f1e0 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
1f1f0 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  k m = pSrc->colU
1f200 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  sed;.      int j
1f210 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1f220 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
1f230 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1f240 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
1f250 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
1f260 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
1f270 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d  {.          m &=
1f280 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   ~(((Bitmask)1)<
1f290 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <x);.        }. 
1f2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f2b0 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m==0 ){.       
1f2c0 20 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73   pc.plan.wsFlags
1f2d0 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
1f2e0 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
1f2f0 0a 20 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70  .        bLookup
1f300 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1f310 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1f320 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
1f330 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f  number of rows o
1f340 66 20 6f 75 74 70 75 74 2e 20 20 46 6f 72 20 61  f output.  For a
1f350 6e 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e  n "x IN (SELECT.
1f360 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  ..)".    ** cons
1f370 74 72 61 69 6e 74 2c 20 64 6f 20 6e 6f 74 20 6c  traint, do not l
1f380 65 74 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  et the estimate 
1f390 65 78 63 65 65 64 20 68 61 6c 66 20 74 68 65 20  exceed half the 
1f3a0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1f3b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 63  e..    */.    pc
1f3c0 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 28 64 6f  .plan.nRow = (do
1f3d0 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74 5b 70  uble)(aiRowEst[p
1f3e0 63 2e 70 6c 61 6e 2e 6e 45 71 5d 20 2a 20 6e 49  c.plan.nEq] * nI
1f3f0 6e 4d 75 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  nMul);.    if( b
1f400 49 6e 45 73 74 20 26 26 20 70 63 2e 70 6c 61 6e  InEst && pc.plan
1f410 2e 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74  .nRow*2>aiRowEst
1f420 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 63 2e  [0] ){.      pc.
1f430 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 61 69 52 6f  plan.nRow = aiRo
1f440 77 45 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20 20  wEst[0]/2;.     
1f450 20 6e 49 6e 4d 75 6c 20 3d 20 28 69 6e 74 29 28   nInMul = (int)(
1f460 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f 20 61  pc.plan.nRow / a
1f470 69 52 6f 77 45 73 74 5b 70 63 2e 70 6c 61 6e 2e  iRowEst[pc.plan.
1f480 6e 45 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  nEq]);.    }..#i
1f490 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1f4a0 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 2f 2a 20  LE_STAT3.    /* 
1f4b0 49 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  If the constrain
1f4c0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
1f4d0 20 78 3d 56 41 4c 55 45 20 6f 72 20 78 20 49 4e   x=VALUE or x IN
1f4e0 20 28 45 31 2c 45 32 2c 2e 2e 2e 29 0a 20 20 20   (E1,E2,...).   
1f4f0 20 2a 2a 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f   ** and we do no
1f500 74 20 74 68 69 6e 6b 20 74 68 61 74 20 76 61 6c  t think that val
1f510 75 65 73 20 6f 66 20 78 20 61 72 65 20 75 6e 69  ues of x are uni
1f520 71 75 65 20 61 6e 64 20 69 66 20 68 69 73 74 6f  que and if histo
1f530 67 72 61 6d 0a 20 20 20 20 2a 2a 20 64 61 74 61  gram.    ** data
1f540 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   is available fo
1f550 72 20 63 6f 6c 75 6d 6e 20 78 2c 20 74 68 65 6e  r column x, then
1f560 20 69 74 20 6d 69 67 68 74 20 62 65 20 70 6f 73   it might be pos
1f570 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 6f 20  sible.    ** to 
1f580 67 65 74 20 61 20 62 65 74 74 65 72 20 65 73 74  get a better est
1f590 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 6e 75 6d  imate on the num
1f5a0 62 65 72 20 6f 66 20 72 6f 77 73 20 62 61 73 65  ber of rows base
1f5b0 64 20 6f 6e 0a 20 20 20 20 2a 2a 20 56 41 4c 55  d on.    ** VALU
1f5c0 45 20 61 6e 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e  E and how common
1f5d0 20 74 68 61 74 20 76 61 6c 75 65 20 69 73 20 61   that value is a
1f5e0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
1f5f0 68 69 73 74 6f 67 72 61 6d 2e 0a 20 20 20 20 2a  histogram..    *
1f600 2f 0a 20 20 20 20 69 66 28 20 70 63 2e 70 6c 61  /.    if( pc.pla
1f610 6e 2e 6e 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31  n.nRow>(double)1
1f620 20 26 26 20 70 63 2e 70 6c 61 6e 2e 6e 45 71 3d   && pc.plan.nEq=
1f630 3d 31 0a 20 20 20 20 20 26 26 20 70 46 69 72 73  =1.     && pFirs
1f640 74 54 65 72 6d 21 3d 30 20 26 26 20 61 69 52 6f  tTerm!=0 && aiRo
1f650 77 45 73 74 5b 31 5d 3e 31 20 29 7b 0a 20 20 20  wEst[1]>1 ){.   
1f660 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72     assert( (pFir
1f670 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1f680 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
1f690 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 21 3d 30 20  NULL|WO_IN))!=0 
1f6a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  );.      if( pFi
1f6b0 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
1f6c0 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
1f6d0 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  SNULL) ){.      
1f6e0 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69 72    testcase( pFir
1f6f0 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1f700 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
1f710 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f720 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72  FirstTerm->eOper
1f730 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20  ator & WO_EQUIV 
1f740 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f750 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d  ase( pFirstTerm-
1f760 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1f770 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1f780 20 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e    whereEqualScan
1f790 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
1f7a0 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  be, pFirstTerm->
1f7b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 0a 20  pExpr->pRight,. 
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 20 20 20 20 20 26 70 63 2e 70 6c 61           &pc.pla
1f7e0 6e 2e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d  n.nRow);.      }
1f7f0 65 6c 73 65 20 69 66 28 20 62 49 6e 45 73 74 3d  else if( bInEst=
1f800 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1f810 73 65 72 74 28 20 70 46 69 72 73 74 54 65 72 6d  sert( pFirstTerm
1f820 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1f830 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 77  _IN );.        w
1f840 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50  hereInScanEst(pP
1f850 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46  arse, pProbe, pF
1f860 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d  irstTerm->pExpr-
1f870 3e 78 2e 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  >x.pList,.      
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 26 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29 3b   &pc.plan.nRow);
1f8a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
1f8b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f8c0 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a  ENABLE_STAT3 */.
1f8d0 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 74  .    /* Adjust t
1f8e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
1f8f0 70 75 74 20 72 6f 77 73 20 61 6e 64 20 64 6f 77  put rows and dow
1f900 6e 77 61 72 64 20 74 6f 20 72 65 66 6c 65 63 74  nward to reflect
1f910 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68 61   rows.    ** tha
1f920 74 20 61 72 65 20 65 78 63 6c 75 64 65 64 20 62  t are excluded b
1f930 79 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  y range constrai
1f940 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
1f950 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 70  pc.plan.nRow = p
1f960 63 2e 70 6c 61 6e 2e 6e 52 6f 77 2f 72 61 6e 67  c.plan.nRow/rang
1f970 65 44 69 76 3b 0a 20 20 20 20 69 66 28 20 70 63  eDiv;.    if( pc
1f980 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 31 20 29 20 70  .plan.nRow<1 ) p
1f990 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 31 3b  c.plan.nRow = 1;
1f9a0 0a 0a 20 20 20 20 2f 2a 20 45 78 70 65 72 69 6d  ..    /* Experim
1f9b0 65 6e 74 73 20 72 75 6e 20 6f 6e 20 72 65 61 6c  ents run on real
1f9c0 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
1f9d0 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  s show that the 
1f9e0 74 69 6d 65 20 6e 65 65 64 65 64 0a 20 20 20 20  time needed.    
1f9f0 2a 2a 20 74 6f 20 64 6f 20 61 20 62 69 6e 61 72  ** to do a binar
1fa00 79 20 73 65 61 72 63 68 20 74 6f 20 6c 6f 63 61  y search to loca
1fa10 74 65 20 61 20 72 6f 77 20 69 6e 20 61 20 74 61  te a row in a ta
1fa20 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20  ble or index is 
1fa30 72 6f 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20 6c  roughly.    ** l
1fa40 6f 67 31 30 28 4e 29 20 74 69 6d 65 73 20 74 68  og10(N) times th
1fa50 65 20 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20 66  e time to move f
1fa60 72 6f 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20 74  rom one row to t
1fa70 68 65 20 6e 65 78 74 20 72 6f 77 20 77 69 74 68  he next row with
1fa80 69 6e 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c  in.    ** a tabl
1fa90 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68 65  e or index.  The
1faa0 20 61 63 74 75 61 6c 20 74 69 6d 65 73 20 63 61   actual times ca
1fab0 6e 20 76 61 72 79 2c 20 77 69 74 68 20 74 68 65  n vary, with the
1fac0 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20   size of.    ** 
1fad0 72 65 63 6f 72 64 73 20 62 65 69 6e 67 20 61 6e  records being an
1fae0 20 69 6d 70 6f 72 74 61 6e 74 20 66 61 63 74 6f   important facto
1faf0 72 2e 20 20 42 6f 74 68 20 6d 6f 76 65 73 20 61  r.  Both moves a
1fb00 6e 64 20 73 65 61 72 63 68 65 73 20 61 72 65 0a  nd searches are.
1fb10 20 20 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77 69      ** slower wi
1fb20 74 68 20 6c 61 72 67 65 72 20 72 65 63 6f 72 64  th larger record
1fb30 73 2c 20 70 72 65 73 75 6d 61 62 6c 79 20 62 65  s, presumably be
1fb40 63 61 75 73 65 20 66 65 77 65 72 20 72 65 63 6f  cause fewer reco
1fb50 72 64 73 20 66 69 74 0a 20 20 20 20 2a 2a 20 6f  rds fit.    ** o
1fb60 6e 20 6f 6e 65 20 70 61 67 65 20 61 6e 64 20 68  n one page and h
1fb70 65 6e 63 65 20 6d 6f 72 65 20 70 61 67 65 73 20  ence more pages 
1fb80 68 61 76 65 20 74 6f 20 62 65 20 66 65 74 63 68  have to be fetch
1fb90 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1fba0 2a 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  * The ANALYZE co
1fbb0 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 73 71  mmand and the sq
1fbc0 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73  lite_stat1 and s
1fbd0 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62 6c  qlite_stat3 tabl
1fbe0 65 73 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  es do.    ** not
1fbf0 20 67 69 76 65 20 75 73 20 64 61 74 61 20 6f 6e   give us data on
1fc00 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69   the relative si
1fc10 7a 65 73 20 6f 66 20 74 61 62 6c 65 20 61 6e 64  zes of table and
1fc20 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 0a   index records..
1fc30 20 20 20 20 2a 2a 20 53 6f 20 74 68 69 73 20 63      ** So this c
1fc40 6f 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 75 6d  omputation assum
1fc50 65 73 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73  es table records
1fc60 20 61 72 65 20 61 62 6f 75 74 20 74 77 69 63 65   are about twice
1fc70 20 61 73 20 62 69 67 0a 20 20 20 20 2a 2a 20 61   as big.    ** a
1fc80 73 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  s index records.
1fc90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1fca0 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26  pc.plan.wsFlags&
1fcb0 7e 28 57 48 45 52 45 5f 52 45 56 45 52 53 45 7c  ~(WHERE_REVERSE|
1fcc0 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 29 3d  WHERE_ORDERED))=
1fcd0 3d 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 0a  =WHERE_IDX_ONLY.
1fce0 20 20 20 20 20 26 26 20 28 70 57 43 2d 3e 77 63       && (pWC->wc
1fcf0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1fd00 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
1fd10 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c  )==0.     && sql
1fd20 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1fd30 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 26 26  .bUseCis.     &&
1fd40 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
1fd50 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
1fd60 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78   SQLITE_CoverIdx
1fd70 53 63 61 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  Scan).    ){.   
1fd80 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
1fd90 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66   is not useful f
1fda0 6f 72 20 69 6e 64 65 78 69 6e 67 2c 20 62 75 74  or indexing, but
1fdb0 20 69 74 20 69 73 20 61 20 63 6f 76 65 72 69 6e   it is a coverin
1fdc0 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a  g index..      *
1fdd0 2a 20 41 20 66 75 6c 6c 2d 73 63 61 6e 20 6f 66  * A full-scan of
1fde0 20 74 68 65 20 69 6e 64 65 78 20 6d 69 67 68 74   the index might
1fdf0 20 62 65 20 61 20 6c 69 74 74 6c 65 20 66 61 73   be a little fas
1fe00 74 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 2d  ter than a full-
1fe10 73 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 66  scan.      ** of
1fe20 20 74 68 65 20 74 61 62 6c 65 2c 20 73 6f 20 67   the table, so g
1fe30 69 76 65 20 74 68 69 73 20 63 61 73 65 20 61 20  ive this case a 
1fe40 63 6f 73 74 20 73 6c 69 67 68 74 6c 79 20 6c 65  cost slightly le
1fe50 73 73 20 74 68 61 6e 20 61 20 74 61 62 6c 65 0a  ss than a table.
1fe60 20 20 20 20 20 20 2a 2a 20 73 63 61 6e 2e 20 2a        ** scan. *
1fe70 2f 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73 74  /.      pc.rCost
1fe80 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a 33   = aiRowEst[0]*3
1fe90 20 2b 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   + pProbe->nColu
1fea0 6d 6e 3b 0a 20 20 20 20 20 20 70 63 2e 70 6c 61  mn;.      pc.pla
1feb0 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  n.wsFlags |= WHE
1fec0 52 45 5f 43 4f 56 45 52 5f 53 43 41 4e 7c 57 48  RE_COVER_SCAN|WH
1fed0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1fee0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1fef0 28 70 63 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  (pc.plan.wsFlags
1ff00 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
1ff10 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  LSCAN)==0 ){.   
1ff20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
1ff30 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  f a full table s
1ff40 63 61 6e 20 69 73 20 61 20 6e 75 6d 62 65 72 20  can is a number 
1ff50 6f 66 20 6d 6f 76 65 20 6f 70 65 72 61 74 69 6f  of move operatio
1ff60 6e 73 20 65 71 75 61 6c 0a 20 20 20 20 20 20 2a  ns equal.      *
1ff70 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  * to the number 
1ff80 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1ff90 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  able..      **. 
1ffa0 20 20 20 20 20 2a 2a 20 57 65 20 61 64 64 20 61       ** We add a
1ffb0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 34 78 20  n additional 4x 
1ffc0 70 65 6e 61 6c 74 79 20 74 6f 20 66 75 6c 6c 20  penalty to full 
1ffd0 74 61 62 6c 65 20 73 63 61 6e 73 2e 20 20 54 68  table scans.  Th
1ffe0 69 73 20 63 61 75 73 65 73 0a 20 20 20 20 20 20  is causes.      
1fff0 2a 2a 20 74 68 65 20 63 6f 73 74 20 66 75 6e 63  ** the cost func
20000 74 69 6f 6e 20 74 6f 20 65 72 72 20 6f 6e 20 74  tion to err on t
20010 68 65 20 73 69 64 65 20 6f 66 20 63 68 6f 6f 73  he side of choos
20020 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f 76 65  ing an index ove
20030 72 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73  r.      ** choos
20040 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e 2e  ing a full scan.
20050 20 20 54 68 69 73 20 34 78 20 66 75 6c 6c 2d 73    This 4x full-s
20060 63 61 6e 20 70 65 6e 61 6c 74 79 20 69 73 20 61  can penalty is a
20070 6e 20 61 72 67 75 61 62 6c 65 0a 20 20 20 20 20  n arguable.     
20080 20 2a 2a 20 64 65 63 69 73 69 6f 6e 20 61 6e 64   ** decision and
20090 20 6f 6e 65 20 77 68 69 63 68 20 77 65 20 65 78   one which we ex
200a0 70 65 63 74 20 74 6f 20 72 65 76 69 73 69 74 20  pect to revisit 
200b0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 20  in the future.  
200c0 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  But.      ** it 
200d0 73 65 65 6d 73 20 74 6f 20 62 65 20 77 6f 72 6b  seems to be work
200e0 69 6e 67 20 77 65 6c 6c 20 65 6e 6f 75 67 68 20  ing well enough 
200f0 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a 20  at the moment.. 
20100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 63       */.      pc
20110 2e 72 43 6f 73 74 20 3d 20 61 69 52 6f 77 45 73  .rCost = aiRowEs
20120 74 5b 30 5d 2a 34 3b 0a 20 20 20 20 20 20 70 63  t[0]*4;.      pc
20130 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d  .plan.wsFlags &=
20140 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   ~WHERE_IDX_ONLY
20150 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
20160 20 29 7b 0a 20 20 20 20 20 20 20 20 70 63 2e 70   ){.        pc.p
20170 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e  lan.wsFlags &= ~
20180 57 48 45 52 45 5f 4f 52 44 45 52 45 44 3b 0a 20  WHERE_ORDERED;. 
20190 20 20 20 20 20 20 20 70 63 2e 70 6c 61 6e 2e 6e         pc.plan.n
201a0 4f 42 53 61 74 20 3d 20 6e 50 72 69 6f 72 53 61  OBSat = nPriorSa
201b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
201c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 31  else{.      log1
201d0 30 4e 20 3d 20 65 73 74 4c 6f 67 28 61 69 52 6f  0N = estLog(aiRo
201e0 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20  wEst[0]);.      
201f0 70 63 2e 72 43 6f 73 74 20 3d 20 70 63 2e 70 6c  pc.rCost = pc.pl
20200 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69  an.nRow;.      i
20210 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
20220 20 20 20 69 66 28 20 62 4c 6f 6f 6b 75 70 20 29     if( bLookup )
20230 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  {.          /* F
20240 6f 72 20 61 6e 20 69 6e 64 65 78 20 6c 6f 6f 6b  or an index look
20250 75 70 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  up followed by a
20260 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a 20   table lookup:. 
20270 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e           **    n
20280 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72  InMul index sear
20290 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65  ches to find the
202a0 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 69   start of each i
202b0 6e 64 65 78 20 72 61 6e 67 65 0a 20 20 20 20 20  ndex range.     
202c0 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20       **  + nRow 
202d0 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68  steps through th
202e0 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  e index.        
202f0 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74 61 62    **  + nRow tab
20300 6c 65 20 73 65 61 72 63 68 65 73 20 74 6f 20 6c  le searches to l
20310 6f 6f 6b 75 70 20 74 68 65 20 74 61 62 6c 65 20  ookup the table 
20320 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
20330 72 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20  rowid.          
20340 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 2e  */.          pc.
20350 72 43 6f 73 74 20 2b 3d 20 28 6e 49 6e 4d 75 6c  rCost += (nInMul
20360 20 2b 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 29   + pc.plan.nRow)
20370 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20  *log10N;.       
20380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20390 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 76 65 72    /* For a cover
203a0 69 6e 67 20 69 6e 64 65 78 3a 0a 20 20 20 20 20  ing index:.     
203b0 20 20 20 20 20 2a 2a 20 20 20 20 20 6e 49 6e 4d       **     nInM
203c0 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68 65  ul index searche
203d0 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e  s to find the in
203e0 69 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  itial entry .   
203f0 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 6e 52         **   + nR
20400 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68  ow steps through
20410 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
20420 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
20430 20 20 70 63 2e 72 43 6f 73 74 20 2b 3d 20 6e 49    pc.rCost += nI
20440 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20  nMul*log10N;.   
20450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
20460 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46  se{.        /* F
20470 6f 72 20 61 20 72 6f 77 69 64 20 70 72 69 6d 61  or a rowid prima
20480 72 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a 20  ry key lookup:. 
20490 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e         **    nIn
204a0 4d 75 6c 74 20 74 61 62 6c 65 20 73 65 61 72 63  Mult table searc
204b0 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  hes to find the 
204c0 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 66 6f  initial entry fo
204d0 72 20 65 61 63 68 20 72 61 6e 67 65 0a 20 20 20  r each range.   
204e0 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20       **  + nRow 
204f0 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68  steps through th
20500 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  e table.        
20510 2a 2f 0a 20 20 20 20 20 20 20 20 70 63 2e 72 43  */.        pc.rC
20520 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f  ost += nInMul*lo
20530 67 31 30 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  g10N;.      }.  
20540 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
20550 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  in the estimated
20560 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
20570 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 41 63   the result.  Ac
20580 74 75 61 6c 20 65 78 70 65 72 69 6d 65 6e 74 61  tual experimenta
20590 6c 0a 20 20 20 20 2a 2a 20 6d 65 61 73 75 72 65  l.    ** measure
205a0 6d 65 6e 74 73 20 6f 66 20 73 6f 72 74 69 6e 67  ments of sorting
205b0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e 20   performance in 
205c0 53 51 4c 69 74 65 20 73 68 6f 77 20 74 68 61 74  SQLite show that
205d0 20 73 6f 72 74 69 6e 67 20 74 69 6d 65 0a 20 20   sorting time.  
205e0 20 20 2a 2a 20 61 64 64 73 20 43 2a 4e 2a 6c 6f    ** adds C*N*lo
205f0 67 31 30 28 4e 29 20 74 6f 20 74 68 65 20 63 6f  g10(N) to the co
20600 73 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74  st, where N is t
20610 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
20620 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
20630 73 6f 72 74 65 64 20 61 6e 64 20 43 20 69 73 20  sorted and C is 
20640 61 20 66 61 63 74 6f 72 20 62 65 74 77 65 65 6e  a factor between
20650 20 31 2e 39 35 20 61 6e 64 20 34 2e 33 2e 20 20   1.95 and 4.3.  
20660 57 65 20 77 69 6c 6c 20 73 70 6c 69 74 20 74 68  We will split th
20670 65 0a 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65  e.    ** differe
20680 6e 63 65 20 61 6e 64 20 73 65 6c 65 63 74 20 43  nce and select C
20690 20 6f 66 20 33 2e 30 2e 0a 20 20 20 20 2a 2f 0a   of 3.0..    */.
206a0 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 29 7b      if( bSort ){
206b0 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6d 20  .      double m 
206c0 3d 20 65 73 74 4c 6f 67 28 70 63 2e 70 6c 61 6e  = estLog(pc.plan
206d0 2e 6e 52 6f 77 2a 28 6e 4f 72 64 65 72 42 79 20  .nRow*(nOrderBy 
206e0 2d 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74  - pc.plan.nOBSat
206f0 29 2f 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  )/nOrderBy);.   
20700 20 20 20 6d 20 2a 3d 20 28 64 6f 75 62 6c 65 29     m *= (double)
20710 28 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 20  (pc.plan.nOBSat 
20720 3f 20 32 20 3a 20 33 29 3b 0a 20 20 20 20 20 20  ? 2 : 3);.      
20730 70 63 2e 72 43 6f 73 74 20 2b 3d 20 70 63 2e 70  pc.rCost += pc.p
20740 6c 61 6e 2e 6e 52 6f 77 2a 6d 3b 0a 20 20 20 20  lan.nRow*m;.    
20750 7d 0a 20 20 20 20 69 66 28 20 62 44 69 73 74 20  }.    if( bDist 
20760 29 7b 0a 20 20 20 20 20 20 70 63 2e 72 43 6f 73  ){.      pc.rCos
20770 74 20 2b 3d 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f  t += pc.plan.nRo
20780 77 2a 65 73 74 4c 6f 67 28 70 63 2e 70 6c 61 6e  w*estLog(pc.plan
20790 2e 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d 0a  .nRow)*3;.    }.
207a0 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20  .    /**** Cost 
207b0 6f 66 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e  of using this in
207c0 64 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65 6e  dex has now been
207d0 20 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a   computed ****/.
207e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
207f0 20 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   are additional 
20800 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74  constraints on t
20810 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 63  his table that c
20820 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20  annot.    ** be 
20830 75 73 65 64 20 77 69 74 68 20 74 68 65 20 63 75  used with the cu
20840 72 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75 74  rrent index, but
20850 20 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f 77   which might low
20860 65 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  er the number.  
20870 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72    ** of output r
20880 6f 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65 20  ows, adjust the 
20890 6e 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f 72  nRow value accor
208a0 64 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e  dingly.  This on
208b0 6c 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65  ly .    ** matte
208c0 72 73 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  rs if the curren
208d0 74 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 6c  t index is the l
208e0 65 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20  east costly, so 
208f0 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20  do not bother.  
20900 20 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20 73    ** with this s
20910 74 65 70 20 69 66 20 77 65 20 61 6c 72 65 61 64  tep if we alread
20920 79 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64 65  y know this inde
20930 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68  x will not be ch
20940 6f 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73  osen..    ** Als
20950 6f 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  o, never reduce 
20960 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63  the output row c
20970 6f 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73 69  ount below 2 usi
20980 6e 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20 20  ng this step..  
20990 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69    **.    ** It i
209a0 73 20 63 72 69 74 69 63 61 6c 20 74 68 61 74 20  s critical that 
209b0 74 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73  the notValid mas
209c0 6b 20 62 65 20 75 73 65 64 20 68 65 72 65 20 69  k be used here i
209d0 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
209e0 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d 61   the notReady ma
209f0 73 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75 74  sk.  When comput
20a00 69 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22  ing an "optimal"
20a10 20 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74 52   index, the notR
20a20 65 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b  eady.    ** mask
20a30 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20   will only have 
20a40 6f 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74 68  one bit set - th
20a50 65 20 62 69 74 20 66 6f 72 20 74 68 65 20 63 75  e bit for the cu
20a60 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20  rrent table..   
20a70 20 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69 64   ** The notValid
20a80 20 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74   mask, on the ot
20a90 68 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79 73  her hand, always
20aa0 20 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73 65   has all bits se
20ab0 74 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  t for.    ** tab
20ac0 6c 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  les that are not
20ad0 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e   in outer loops.
20ae0 20 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69 73    If notReady is
20af0 20 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65   used here inste
20b00 61 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74  ad.    ** of not
20b10 56 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f 70  Valid, then a op
20b20 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74  timal index that
20b30 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65   depends on inne
20b40 72 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20  r joins loops.  
20b50 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 65    ** might be se
20b60 6c 65 63 74 65 64 20 65 76 65 6e 20 77 68 65 6e  lected even when
20b70 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 6e   there exists an
20b80 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74   optimal index t
20b90 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e  hat has.    ** n
20ba0 6f 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e 63  o such dependenc
20bb0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
20bc0 28 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 32  ( pc.plan.nRow>2
20bd0 20 26 26 20 70 63 2e 72 43 6f 73 74 3c 3d 70 2d   && pc.rCost<=p-
20be0 3e 63 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a 20  >cost.rCost ){. 
20bf0 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c10 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20c20 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  r */.      int n
20c30 53 6b 69 70 45 71 20 3d 20 70 63 2e 70 6c 61 6e  SkipEq = pc.plan
20c40 2e 6e 45 71 3b 20 20 20 2f 2a 20 4e 75 6d 62 65  .nEq;   /* Numbe
20c50 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69  r of == constrai
20c60 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  nts to skip */. 
20c70 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 52 61       int nSkipRa
20c80 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20 20  nge = nBound;   
20c90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3c    /* Number of <
20ca0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
20cb0 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 42 69  skip */.      Bi
20cc0 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b 20 20  tmask thisTab;  
20cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
20ce0 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20 2a 2f  tmap for pSrc */
20cf0 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61 62 20  ..      thisTab 
20d00 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70  = getMask(pWC->p
20d10 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
20d20 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
20d30 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e  pWC->a, k=pWC->n
20d40 54 65 72 6d 3b 20 70 63 2e 70 6c 61 6e 2e 6e 52  Term; pc.plan.nR
20d50 6f 77 3e 32 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20  ow>2 && k; k--, 
20d60 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
20d70 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
20d80 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
20d90 55 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UAL ) continue;.
20da0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
20db0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
20dc0 70 2d 3e 6e 6f 74 56 61 6c 69 64 29 21 3d 74 68  p->notValid)!=th
20dd0 69 73 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  isTab ) continue
20de0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
20df0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
20e00 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f   (WO_EQ|WO_IN|WO
20e10 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  _ISNULL) ){.    
20e20 20 20 20 20 20 20 69 66 28 20 6e 53 6b 69 70 45        if( nSkipE
20e30 71 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  q ){.           
20e40 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 66   /* Ignore the f
20e50 69 72 73 74 20 70 63 2e 70 6c 61 6e 2e 6e 45 71  irst pc.plan.nEq
20e60 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 65   equality matche
20e70 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65  s since the inde
20e80 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  x.            **
20e90 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63   has already acc
20ea0 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65  ounted for these
20eb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20ec0 6e 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20  nSkipEq--;.     
20ed0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20ee0 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
20ef0 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  e each additiona
20f00 6c 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68  l equality match
20f10 20 72 65 64 75 63 65 73 20 74 68 65 20 72 65 73   reduces the res
20f20 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ult.            
20f30 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20 61  ** set size by a
20f40 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f   factor of 10 */
20f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 63 2e  .            pc.
20f60 70 6c 61 6e 2e 6e 52 6f 77 20 2f 3d 20 31 30 3b  plan.nRow /= 10;
20f70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20f80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
20f90 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
20fa0 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  & (WO_LT|WO_LE|W
20fb0 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
20fc0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53 6b           if( nSk
20fd0 69 70 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 20  ipRange ){.     
20fe0 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65         /* Ignore
20ff0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
21000 52 61 6e 67 65 20 72 61 6e 67 65 20 63 6f 6e 73  Range range cons
21010 74 72 61 69 6e 74 73 20 73 69 6e 63 65 20 74 68  traints since th
21020 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  e index.        
21030 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
21040 64 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f 72  dy accounted for
21050 20 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20 20   these */.      
21060 20 20 20 20 20 20 6e 53 6b 69 70 52 61 6e 67 65        nSkipRange
21070 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  --;.          }e
21080 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
21090 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63 68 20   /* Assume each 
210a0 61 64 64 69 74 69 6f 6e 61 6c 20 72 61 6e 67 65  additional range
210b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75   constraint redu
210c0 63 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20  ces the result. 
210d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65             ** se
210e0 74 20 73 69 7a 65 20 62 79 20 61 20 66 61 63 74  t size by a fact
210f0 6f 72 20 6f 66 20 33 2e 20 20 49 6e 64 65 78 65  or of 3.  Indexe
21100 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  d range constrai
21110 6e 74 73 20 72 65 64 75 63 65 0a 20 20 20 20 20  nts reduce.     
21120 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65         ** the se
21130 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
21140 6c 61 72 67 65 72 20 66 61 63 74 6f 72 3a 20 34  larger factor: 4
21150 2e 20 20 57 65 20 6d 61 6b 65 20 69 6e 64 65 78  .  We make index
21160 65 64 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20  ed range.       
21170 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 73 65 6c       ** more sel
21180 65 63 74 69 76 65 20 69 6e 74 65 6e 74 69 6f 6e  ective intention
21190 61 6c 6c 79 20 62 65 63 61 75 73 65 20 6f 66 20  ally because of 
211a0 74 68 65 20 73 75 62 6a 65 63 74 69 76 65 20 0a  the subjective .
211b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
211c0 62 73 65 72 76 61 74 69 6f 6e 20 74 68 61 74 20  bservation that 
211d0 69 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63 6f  indexed range co
211e0 6e 73 74 72 61 69 6e 74 73 20 72 65 61 6c 6c 79  nstraints really
211f0 20 61 72 65 20 6d 6f 72 65 0a 20 20 20 20 20 20   are more.      
21200 20 20 20 20 20 20 2a 2a 20 73 65 6c 65 63 74 69        ** selecti
21210 76 65 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20  ve in practice, 
21220 6f 6e 20 61 76 65 72 61 67 65 2e 20 2a 2f 0a 20  on average. */. 
21230 20 20 20 20 20 20 20 20 20 20 20 70 63 2e 70 6c             pc.pl
21240 61 6e 2e 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20  an.nRow /= 3;.  
21250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21260 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
21270 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
21280 57 4f 5f 4e 4f 4f 50 29 3d 3d 30 20 29 7b 0a 20  WO_NOOP)==0 ){. 
21290 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79 20           /* Any 
212a0 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
212b0 20 6c 6f 77 65 72 73 20 74 68 65 20 6f 75 74 70   lowers the outp
212c0 75 74 20 72 6f 77 20 63 6f 75 6e 74 20 62 79 20  ut row count by 
212d0 68 61 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20  half */.        
212e0 20 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 2f    pc.plan.nRow /
212f0 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 2;.        }. 
21300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21310 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 32 20   pc.plan.nRow<2 
21320 29 20 70 63 2e 70 6c 61 6e 2e 6e 52 6f 77 20 3d  ) pc.plan.nRow =
21330 20 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20   2;.    }...    
21340 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20 20  WHERETRACE((.   
21350 20 20 20 22 20 20 20 20 20 20 6e 45 71 3d 25 64     "      nEq=%d
21360 20 6e 49 6e 4d 75 6c 3d 25 64 20 72 61 6e 67 65   nInMul=%d range
21370 44 69 76 3d 25 64 20 62 53 6f 72 74 3d 25 64 20  Div=%d bSort=%d 
21380 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73 46 6c 61  bLookup=%d wsFla
21390 67 73 3d 30 78 25 30 38 78 5c 6e 22 0a 20 20 20  gs=0x%08x\n".   
213a0 20 20 20 22 20 20 20 20 20 20 6e 6f 74 52 65 61     "      notRea
213b0 64 79 3d 30 78 25 6c 6c 78 20 6c 6f 67 31 30 4e  dy=0x%llx log10N
213c0 3d 25 2e 31 66 20 6e 52 6f 77 3d 25 2e 31 66 20  =%.1f nRow=%.1f 
213d0 63 6f 73 74 3d 25 2e 31 66 5c 6e 22 0a 20 20 20  cost=%.1f\n".   
213e0 20 20 20 22 20 20 20 20 20 20 75 73 65 64 3d 30     "      used=0
213f0 78 25 6c 6c 78 20 6e 4f 42 53 61 74 3d 25 64 5c  x%llx nOBSat=%d\
21400 6e 22 2c 0a 20 20 20 20 20 20 70 63 2e 70 6c 61  n",.      pc.pla
21410 6e 2e 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20 28  n.nEq, nInMul, (
21420 69 6e 74 29 72 61 6e 67 65 44 69 76 2c 20 62 53  int)rangeDiv, bS
21430 6f 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 70 63  ort, bLookup, pc
21440 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 0a 20  .plan.wsFlags,. 
21450 20 20 20 20 20 70 2d 3e 6e 6f 74 52 65 61 64 79       p->notReady
21460 2c 20 6c 6f 67 31 30 4e 2c 20 70 63 2e 70 6c 61  , log10N, pc.pla
21470 6e 2e 6e 52 6f 77 2c 20 70 63 2e 72 43 6f 73 74  n.nRow, pc.rCost
21480 2c 20 70 63 2e 75 73 65 64 2c 0a 20 20 20 20 20  , pc.used,.     
21490 20 70 63 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 0a   pc.plan.nOBSat.
214a0 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f 2a 20      ));..    /* 
214b0 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  If this index is
214c0 20 74 68 65 20 62 65 73 74 20 77 65 20 68 61 76   the best we hav
214d0 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c 20 74  e seen so far, t
214e0 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69 73 0a  hen record this.
214f0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64      ** index and
21500 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74 68 65   its cost in the
21510 20 70 2d 3e 63 6f 73 74 20 73 74 72 75 63 74 75   p->cost structu
21520 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
21530 66 28 20 28 21 70 49 64 78 20 7c 7c 20 70 63 2e  f( (!pIdx || pc.
21540 70 6c 61 6e 2e 77 73 46 6c 61 67 73 29 20 26 26  plan.wsFlags) &&
21550 20 63 6f 6d 70 61 72 65 43 6f 73 74 28 26 70 63   compareCost(&pc
21560 2c 20 26 70 2d 3e 63 6f 73 74 29 20 29 7b 0a 20  , &p->cost) ){. 
21570 20 20 20 20 20 70 2d 3e 63 6f 73 74 20 3d 20 70       p->cost = p
21580 63 3b 0a 20 20 20 20 20 20 70 2d 3e 63 6f 73 74  c;.      p->cost
21590 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d  .plan.wsFlags &=
215a0 20 77 73 46 6c 61 67 4d 61 73 6b 3b 0a 20 20 20   wsFlagMask;.   
215b0 20 20 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e     p->cost.plan.
215c0 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  u.pIdx = pIdx;. 
215d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
215e0 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
215f0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
21600 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f  then only that o
21610 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ne index is.    
21620 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a  ** considered. *
21630 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
21640 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a  pIndex ) break;.
21650 0a 20 20 20 20 2f 2a 20 52 65 73 65 74 20 6d 61  .    /* Reset ma
21660 73 6b 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  sks for the next
21670 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f   index in the lo
21680 6f 70 20 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67  op */.    wsFlag
21690 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52  Mask = ~(WHERE_R
216a0 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
216b0 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20  WID_RANGE);.    
216c0 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78  eqTermMask = idx
216d0 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a  EqTermMask;.  }.
216e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
216f0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
21700 61 75 73 65 20 61 6e 64 20 74 68 65 20 53 51 4c  ause and the SQL
21710 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
21720 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65   flag.  ** is se
21730 74 2c 20 74 68 65 6e 20 72 65 76 65 72 73 65 20  t, then reverse 
21740 74 68 65 20 6f 72 64 65 72 20 74 68 61 74 20 74  the order that t
21750 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65  he index will be
21760 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e   scanned.  ** in
21770 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66  . This is used f
21780 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74  or application t
21790 65 73 74 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20  esting, to help 
217a0 66 69 6e 64 20 63 61 73 65 73 0a 20 20 2a 2a 20  find cases.  ** 
217b0 77 68 65 72 65 20 61 70 70 6c 69 63 61 74 69 6f  where applicatio
217c0 6e 20 62 65 68 61 76 69 6f 75 72 20 64 65 70 65  n behaviour depe
217d0 6e 64 73 20 6f 6e 20 74 68 65 20 28 75 6e 64 65  nds on the (unde
217e0 66 69 6e 65 64 29 20 6f 72 64 65 72 20 74 68 61  fined) order tha
217f0 74 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 6f 75  t.  ** SQLite ou
21800 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 69 6e  tputs rows in in
21810 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
21820 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
21830 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  se.  */.  if( !p
21840 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 50  ->pOrderBy && pP
21850 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
21860 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  & SQLITE_Reverse
21870 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 70 2d 3e  Order ){.    p->
21880 63 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  cost.plan.wsFlag
21890 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52  s |= WHERE_REVER
218a0 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  SE;.  }..  asser
218b0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 7c  t( p->pOrderBy |
218c0 7c 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e  | (p->cost.plan.
218d0 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  wsFlags&WHERE_OR
218e0 44 45 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 61  DERED)==0 );.  a
218f0 73 73 65 72 74 28 20 70 2d 3e 63 6f 73 74 2e 70  ssert( p->cost.p
21900 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 7c 7c  lan.u.pIdx==0 ||
21910 20 28 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77   (p->cost.plan.w
21920 73 46 6c 61 67 73 26 57 48 45 52 45 5f 52 4f 57  sFlags&WHERE_ROW
21930 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a 20 20 61  ID_EQ)==0 );.  a
21940 73 73 65 72 74 28 20 70 53 72 63 2d 3e 70 49 6e  ssert( pSrc->pIn
21950 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  dex==0 .       |
21960 7c 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 75  | p->cost.plan.u
21970 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20 20 20 20  .pIdx==0 .      
21980 20 7c 7c 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e   || p->cost.plan
21990 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d 3e 70  .u.pIdx==pSrc->p
219a0 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20 20 57  Index .  );..  W
219b0 48 45 52 45 54 52 41 43 45 28 28 22 20 20 20 62  HERETRACE(("   b
219c0 65 73 74 20 69 6e 64 65 78 20 69 73 20 25 73 20  est index is %s 
219d0 63 6f 73 74 3d 25 2e 31 66 5c 6e 22 2c 0a 20 20  cost=%.1f\n",.  
219e0 20 20 20 20 20 20 20 70 2d 3e 63 6f 73 74 2e 70         p->cost.p
219f0 6c 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70 2d 3e  lan.u.pIdx ? p->
21a00 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  cost.plan.u.pIdx
21a10 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 2c  ->zName : "ipk",
21a20 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 63 6f 73  .         p->cos
21a30 74 2e 72 43 6f 73 74 29 29 3b 0a 20 20 0a 20 20  t.rCost));.  .  
21a40 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
21a50 78 28 70 29 3b 0a 20 20 62 65 73 74 41 75 74 6f  x(p);.  bestAuto
21a60 6d 61 74 69 63 49 6e 64 65 78 28 70 29 3b 0a 20  maticIndex(p);. 
21a70 20 70 2d 3e 63 6f 73 74 2e 70 6c 61 6e 2e 77 73   p->cost.plan.ws
21a80 46 6c 61 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d  Flags |= eqTermM
21a90 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  ask;.}../*.** Fi
21aa0 6e 64 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  nd the query pla
21ab0 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  n for accessing 
21ac0 74 61 62 6c 65 20 70 53 72 63 2d 3e 70 54 61 62  table pSrc->pTab
21ad0 2e 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62  . Write the.** b
21ae0 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61  est query plan a
21af0 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f  nd its cost into
21b00 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f   the WhereCost o
21b10 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20 0a  bject supplied .
21b20 2a 2a 20 61 73 20 74 68 65 20 6c 61 73 74 20 70  ** as the last p
21b30 61 72 61 6d 65 74 65 72 2e 20 54 68 69 73 20 66  arameter. This f
21b40 75 6e 63 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63  unction may calc
21b50 75 6c 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f  ulate the cost o
21b60 66 0a 2a 2a 20 62 6f 74 68 20 72 65 61 6c 20 61  f.** both real a
21b70 6e 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  nd virtual table
21b80 20 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   scans..**.** Th
21b90 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
21ba0 20 6e 6f 74 20 74 61 6b 65 20 4f 52 44 45 52 20   not take ORDER 
21bb0 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 69  BY or DISTINCT i
21bc0 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 20 20 4e 6f  nto account.  No
21bd0 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 72 65 6d  r.** does it rem
21be0 65 6d 62 65 72 20 74 68 65 20 76 69 72 74 75 61  ember the virtua
21bf0 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20 70 6c  l table query pl
21c00 61 6e 2e 20 20 41 6c 6c 20 69 74 20 64 6f 65 73  an.  All it does
21c10 20 69 73 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   is compute.** t
21c20 68 65 20 63 6f 73 74 20 77 68 69 6c 65 20 64 65  he cost while de
21c30 74 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 6e 20  termining if an 
21c40 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR optimization 
21c50 69 73 20 61 70 70 6c 69 63 61 62 6c 65 2e 20 20  is applicable.  
21c60 54 68 65 0a 2a 2a 20 64 65 74 61 69 6c 73 20 77  The.** details w
21c70 69 6c 6c 20 62 65 20 72 65 63 6f 6e 73 69 64 65  ill be reconside
21c80 72 65 64 20 6c 61 74 65 72 20 69 66 20 74 68 65  red later if the
21c90 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
21ca0 20 66 6f 75 6e 64 20 74 6f 20 62 65 0a 2a 2a 20   found to be.** 
21cb0 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2f 0a 73  applicable..*/.s
21cc0 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49  tatic void bestI
21cd0 6e 64 65 78 28 57 68 65 72 65 42 65 73 74 49 64  ndex(WhereBestId
21ce0 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  x *p){.#ifndef S
21cf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
21d00 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
21d10 56 69 72 74 75 61 6c 28 70 2d 3e 70 53 72 63 2d  Virtual(p->pSrc-
21d20 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  >pTab) ){.    sq
21d30 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
21d40 20 2a 70 49 64 78 49 6e 66 6f 20 3d 20 30 3b 0a   *pIdxInfo = 0;.
21d50 20 20 20 20 70 2d 3e 70 70 49 64 78 49 6e 66 6f      p->ppIdxInfo
21d60 20 3d 20 26 70 49 64 78 49 6e 66 6f 3b 0a 20 20   = &pIdxInfo;.  
21d70 20 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64    bestVirtualInd
21d80 65 78 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  ex(p);.    asser
21d90 74 28 20 70 49 64 78 49 6e 66 6f 21 3d 30 20 7c  t( pIdxInfo!=0 |
21da0 7c 20 70 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  | p->pParse->db-
21db0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
21dc0 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
21dd0 6f 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  o && pIdxInfo->n
21de0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
21df0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21e00 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
21e10 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20  idxStr);.    }. 
21e20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
21e30 28 70 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  (p->pParse->db, 
21e40 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  pIdxInfo);.  }el
21e50 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
21e60 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78    bestBtreeIndex
21e70 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
21e80 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d  * Disable a term
21e90 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
21ea0 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64  ause.  Except, d
21eb0 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68  o not disable th
21ec0 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20  e term.** if it 
21ed0 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20  controls a LEFT 
21ee0 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69  OUTER JOIN and i
21ef0 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
21f00 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a  ate in the ON.**
21f10 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
21f20 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a   of that join..*
21f30 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68  *.** Consider th
21f40 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27  e term t2.z='ok'
21f50 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
21f60 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a  g queries:.**.**
21f70 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a     (1)  SELECT *
21f80 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
21f90 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
21fa0 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f  .x WHERE t2.z='o
21fb0 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c  k'.**   (2)  SEL
21fc0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
21fd0 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
21fe0 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
21ff0 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20  ='ok'.**   (3)  
22000 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
22010 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d  , t2 WHERE t1.a=
22020 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
22030 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e  k'.**.** The t2.
22040 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c  z='ok' is disabl
22050 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29  ed in the in (2)
22060 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67   because it orig
22070 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65  inates.** in the
22080 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65   ON clause.  The
22090 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65   term is disable
220a0 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65  d in (3) because
220b0 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a   it is not part.
220c0 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  ** of a LEFT OUT
220d0 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29  ER JOIN.  In (1)
220e0 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f  , the term is no
220f0 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a  t disabled..**.*
22100 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
22110 2d 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35 38 36  -OF: R-24597-586
22120 35 35 20 4e 6f 20 74 65 73 74 73 20 61 72 65 20  55 No tests are 
22130 64 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73 20 74  done for terms t
22140 68 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c  hat are.** compl
22150 65 74 65 6c 79 20 73 61 74 69 73 66 69 65 64 20  etely satisfied 
22160 62 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a  by indices..**.*
22170 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65  * Disabling a te
22180 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74  rm causes that t
22190 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65  erm to not be te
221a0 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65  sted in the inne
221b0 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65  r loop.** of the
221c0 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e   join.  Disablin
221d0 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  g is an optimiza
221e0 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d  tion.  When term
221f0 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  s are satisfied.
22200 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77  ** by indices, w
22210 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74  e disable them t
22220 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64  o prevent redund
22230 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65  ant tests in the
22240 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20   inner.** loop. 
22250 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68   We would get th
22260 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74  e correct result
22270 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72  s if nothing wer
22280 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c  e ever disabled,
22290 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69  .** but joins mi
222a0 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
222b0 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72   slower.  The tr
222c0 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c  ick is to disabl
222d0 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20  e as much.** as 
222e0 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64  we can without d
222f0 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63  isabling too muc
22300 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c  h.  If we disabl
22310 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20  ed in (1), we'd 
22320 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67  get.** the wrong
22330 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69   answer.  See ti
22340 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74  cket #813..*/.st
22350 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c  atic void disabl
22360 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c  eTerm(WhereLevel
22370 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54   *pLevel, WhereT
22380 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69  erm *pTerm){.  i
22390 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26  f( pTerm.      &
223a0 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  & (pTerm->wtFlag
223b0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
223c0 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65  =0.      && (pLe
223d0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d  vel->iLeftJoin==
223e0 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  0 || ExprHasProp
223f0 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
22400 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
22410 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  .  ){.    pTerm-
22420 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
22430 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20  _CODED;.    if( 
22440 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d  pTerm->iParent>=
22450 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
22460 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26  Term *pOther = &
22470 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54  pTerm->pWC->a[pT
22480 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20  erm->iParent];. 
22490 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68       if( (--pOth
224a0 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29  er->nChild)==0 )
224b0 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  {.        disabl
224c0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f  eTerm(pLevel, pO
224d0 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ther);.      }. 
224e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
224f0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66  * Code an OP_Aff
22500 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20  inity opcode to 
22510 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e  apply the column
22520 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
22530 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20   zAff.** to the 
22540 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  n registers star
22550 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a  ting at base. .*
22560 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d  *.** As an optim
22570 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f  ization, SQLITE_
22580 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73  AFF_NONE entries
22590 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f   (which are no-o
225a0 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65  ps) at the.** be
225b0 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20  ginning and end 
225c0 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f  of zAff are igno
225d0 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74  red.  If all ent
225e0 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65  ries in zAff are
225f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
22600 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64  ONE, then no cod
22610 65 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64  e gets generated
22620 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22630 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f  tine makes its o
22640 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20  wn copy of zAff 
22650 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  so that the call
22660 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f  er is free.** to
22670 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74   modify zAff aft
22680 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
22690 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74  returns..*/.stat
226a0 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c  ic void codeAppl
226b0 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20  yAffinity(Parse 
226c0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73  *pParse, int bas
226d0 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a  e, int n, char *
226e0 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76  zAff){.  Vdbe *v
226f0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
22700 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20  ;.  if( zAff==0 
22710 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22720 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
22730 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
22740 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
22750 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20  ert( v!=0 );..  
22760 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61  /* Adjust base a
22770 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65  nd n to skip ove
22780 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  r SQLITE_AFF_NON
22790 45 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65  E entries at the
227a0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20   beginning.  ** 
227b0 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61  and end of the a
227c0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
227d0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e    */.  while( n>
227e0 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51  0 && zAff[0]==SQ
227f0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
22800 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61  .    n--;.    ba
22810 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b  se++;.    zAff++
22820 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e  ;.  }.  while( n
22830 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d  >1 && zAff[n-1]=
22840 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
22850 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d   ){.    n--;.  }
22860 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
22870 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
22880 64 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  de if there is a
22890 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20  nything left to 
228a0 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30  do. */.  if( n>0
228b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
228c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
228d0 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20  Affinity, base, 
228e0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n);.    sqlite3V
228f0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
22900 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20  1, zAff, n);.   
22910 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
22920 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
22930 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29  pParse, base, n)
22940 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
22950 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
22960 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c  r a single equal
22970 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ity term of the 
22980 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41  WHERE clause.  A
22990 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65  n equality.** te
229a0 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72  rm can be either
229b0 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20   X=expr or X IN 
229c0 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69  (...).   pTerm i
229d0 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  s the term to be
229e0 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a   .** coded..**.*
229f0 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61  * The current va
22a00 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73  lue for the cons
22a10 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69  traint is left i
22a20 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  n register iReg.
22a30 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e  .**.** For a con
22a40 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66  straint of the f
22a50 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20  orm X=expr, the 
22a60 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76  expression is ev
22a70 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a  aluated and its.
22a80 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66  ** result is lef
22a90 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  t on the stack. 
22aa0 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   For constraints
22ab0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49   of the form X I
22ac0 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20  N (...).** this 
22ad0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
22ae0 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
22af0 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c   iterate over al
22b00 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a  l values of X..*
22b10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
22b20 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20  eEqualityTerm(. 
22b30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
22b40 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
22b50 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22b60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
22b70 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  m,   /* The term
22b80 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
22b90 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64  ause to be coded
22ba0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
22bb0 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65   *pLevel, /* Whe
22bc0 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46  n level of the F
22bd0 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72  ROM clause we ar
22be0 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
22bf0 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20    int iTarget   
22c00 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
22c10 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74   to leave result
22c20 73 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  s in this regist
22c30 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  er */.){.  Expr 
22c40 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
22c50 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  pr;.  Vdbe *v = 
22c60 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
22c70 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20   int iReg;      
22c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22c90 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
22ca0 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73  results */..  as
22cb0 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20  sert( iTarget>0 
22cc0 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d  );.  if( pX->op=
22cd0 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52  =TK_EQ ){.    iR
22ce0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
22cf0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
22d00 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69  e, pX->pRight, i
22d10 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  Target);.  }else
22d20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
22d30 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52  ISNULL ){.    iR
22d40 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
22d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22d60 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
22d70 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65  0, iReg);.#ifnde
22d80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
22d90 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a  BQUERY.  }else{.
22da0 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20      int eType;. 
22db0 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
22dc0 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
22dd0 70 49 6e 3b 0a 20 20 20 20 75 38 20 62 52 65 76  pIn;.    u8 bRev
22de0 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
22df0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
22e00 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 0a 20  _REVERSE)!=0;.. 
22e10 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
22e20 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
22e30 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
22e40 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69      eType = sqli
22e50 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
22e60 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20  Parse, pX, 0);. 
22e70 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
22e80 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
22e90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
22ea0 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
22eb0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
22ec0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
22ed0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
22ee0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
22ef0 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20 69 66 28  _ABLE );.    if(
22f00 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
22f10 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
22f20 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
22f30 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
22f40 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
22f50 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
22f60 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
22f70 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
22f80 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
22f90 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
22fa0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
22fb0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
22fc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
22ff0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
23000 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
23010 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
23020 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
23030 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
23040 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
23050 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
23060 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  - 1;.      pIn->
23070 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20  iCur = iTab;.   
23080 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
23090 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
230a0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
230b0 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
230c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
230d0 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
230e0 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
230f0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
23100 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
23110 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
23120 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
23130 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20   0, iReg);.     
23140 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45   }.      pIn->eE
23150 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20  ndLoopOp = bRev 
23160 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
23170 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
23180 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
23190 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29  OP_IsNull, iReg)
231a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
231b0 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
231c0 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
231d0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
231e0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
231f0 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pTerm);.  return
23200 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
23210 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
23220 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
23230 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
23240 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
23250 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  n.** index..**.*
23260 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
23270 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
23280 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
23290 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
232a0 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
232b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
232c0 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
232d0 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
232e0 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
232f0 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
23300 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
23310 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
23320 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
23330 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
23340 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
23350 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
23360 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
23370 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
23380 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
23390 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
233a0 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
233b0 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
233c0 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
233d0 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
233e0 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
233f0 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74  and b will be st
23400 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65  ored.** in conse
23410 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
23420 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f   and the index o
23430 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  f the first regi
23440 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
23450 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
23460 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
23470 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
23480 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
23490 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
234a0 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
234b0 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
234c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
234d0 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
234e0 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
234f0 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
23500 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
23510 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
23520 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75  ell and.** compu
23530 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  te the affinity 
23540 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
23550 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79  is routine alway
23560 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c  s allocates at l
23570 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20  east one memory 
23580 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73  cell and returns
23590 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66  .** the index of
235a0 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
235b0 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  l. The code that
235c0 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72  .** calls this r
235d0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20  outine will use 
235e0 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
235f0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65   to store the te
23600 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79  rmination.** key
23610 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
23620 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d  op.  If one or m
23630 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ore IN operators
23640 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a   appear, then.**
23650 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
23660 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74  locates an addit
23670 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79  ional nEq memory
23680 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72   cells for inter
23690 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a  nal.** use..**.*
236a0 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
236b0 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65  ng, *pzAff is se
236c0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
236d0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
236e0 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74  g a.** copy of t
236f0 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
23700 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65  ty string of the
23710 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64   index allocated
23720 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
23730 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63  3DbMalloc(). Exc
23740 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20  ept, entries in 
23750 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
23760 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65  string associate
23770 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69  d.** with equali
23780 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ty constraints t
23790 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66  hat use NONE aff
237a0 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74 6f  inity are set to
237b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
237c0 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20  ONE. This is to 
237d0 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75  deal with SQL su
237e0 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch as the follow
237f0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
23800 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 54  ATE TABLE t1(a T
23810 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
23820 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54   b);.**   SELECT
23830 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20   ... FROM t1 AS 
23840 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e  t2, t1 WHERE t1.
23850 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20  a = t2.b;.**.** 
23860 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
23870 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20  bove, the index 
23880 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45 58  on t1(a) has TEX
23890 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20  T affinity. But 
238a0 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67  since.** the rig
238b0 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht hand side of 
238c0 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
238d0 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68  straint (t2.b) h
238e0 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79  as NONE affinity
238f0 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69  ,.** no conversi
23900 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74  on should be att
23910 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75 73  empted before us
23920 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65  ing a t2.b value
23930 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61   as part of.** a
23940 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20 74   key to search t
23950 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20  he index. Hence 
23960 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 69  the first byte i
23970 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  n the returned a
23980 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e  ffinity.** strin
23990 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c  g in this exampl
239a0 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74  e would be set t
239b0 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  o SQLITE_AFF_NON
239c0 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
239d0 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
239e0 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
239f0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
23a00 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
23a10 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
23a20 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20  l *pLevel,   /* 
23a30 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f  Which nested loo
23a40 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65  p of the FROM we
23a50 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20   are coding */. 
23a60 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
23a70 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
23a80 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
23a90 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
23aa0 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70  ,     /* Which p
23ab0 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76  arts of FROM hav
23ac0 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  e not yet been c
23ad0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  oded */.  int nE
23ae0 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20  xtraReg,        
23af0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
23b00 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ra registers to 
23b10 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
23b20 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20  ar **pzAff      
23b30 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
23b40 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69  to point to affi
23b50 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
23b60 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  {.  int nEq = pL
23b70 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20  evel->plan.nEq; 
23b80 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
23b90 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
23ba0 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
23bb0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
23bc0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
23bd0 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64     /* The vm und
23be0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
23bf0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
23c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23c10 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
23c20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74  being used for t
23c30 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  his loop */.  in
23c40 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  t iCur = pLevel-
23c50 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54  >iTabCur;   /* T
23c60 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
23c70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
23c80 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
23c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
23ca0 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
23cb0 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a   term */.  int j
23cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
23ce0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
23cf0 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
23d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23d10 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ase register */.
23d20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67  /* Number of reg
23d50 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
23d60 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  te */.  char *zA
23d70 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
23d80 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
23d90 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75  y string to retu
23da0 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  rn */..  /* This
23db0 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20   module is only 
23dc0 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20  called on query 
23dd0 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61  plans that use a
23de0 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 73  n index. */.  as
23df0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  sert( pLevel->pl
23e00 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
23e10 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20  RE_INDEXED );.  
23e20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
23e30 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 2f  lan.u.pIdx;..  /
23e40 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
23e50 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c   many memory cel
23e60 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  ls we will need 
23e70 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68  then allocate th
23e80 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61  em..  */.  regBa
23e90 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
23ea0 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20  m + 1;.  nReg = 
23eb0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
23ec0 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20   + nExtraReg;.  
23ed0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
23ee0 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20  nReg;..  zAff = 
23ef0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
23f00 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69  pParse->db, sqli
23f10 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
23f20 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20  Str(v, pIdx));. 
23f30 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20   if( !zAff ){.  
23f40 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
23f50 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
23f60 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61    }..  /* Evalua
23f70 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  te the equality 
23f80 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f  constraints.  */
23f90 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
23fa0 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b  >nColumn>=nEq );
23fb0 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45  .  for(j=0; j<nE
23fc0 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  q; j++){.    int
23fd0 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d   r1;.    int k =
23fe0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
23ff0 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  j];.    pTerm = 
24000 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
24010 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
24020 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
24030 46 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a 20 20  Flags, pIdx);.  
24040 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
24050 20 62 72 65 61 6b 3b 0a 20 20 20 20 2f 2a 20 54   break;.    /* T
24060 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75  he following tru
24070 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69  e for indices wi
24080 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  th redundant col
24090 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78  umns. .    ** Ex
240a0 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  : CREATE INDEX i
240b0 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20  1 ON t1(a,b,a); 
240c0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
240d0 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62   WHERE a=0 AND b
240e0 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63  =0; */.    testc
240f0 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ase( (pTerm->wtF
24100 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
24110 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  D)!=0 );.    tes
24120 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
24130 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
24140 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
24150 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
24160 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75      r1 = codeEqu
24170 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
24180 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
24190 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
241a0 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65   if( r1!=regBase
241b0 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  +j ){.      if( 
241c0 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nReg==1 ){.     
241d0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
241e0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
241f0 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20   regBase);.     
24200 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b     regBase = r1;
24210 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24230 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
24240 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65  opy, r1, regBase
24250 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
24260 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
24270 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
24280 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
24290 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
242a0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
242b0 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69  & WO_IN );.    i
242c0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
242d0 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
242e0 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a  L|WO_IN))==0 ){.
242f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
24300 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  ht = pTerm->pExp
24310 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
24320 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24330 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
24340 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c  ight, regBase+j,
24350 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
24360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66  );.      if( zAf
24370 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
24380 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
24390 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
243a0 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45  zAff[j])==SQLITE
243b0 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
243c0 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
243d0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
243e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
243f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
24400 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
24410 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
24420 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20   zAff[j]) ){.   
24430 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
24440 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
24450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24460 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
24470 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20  *pzAff = zAff;. 
24480 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b   return regBase;
24490 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
244a0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
244b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
244c0 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66  ne is a helper f
244d0 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  or explainIndexR
244e0 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a  ange() below.**.
244f0 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68  ** pStr holds th
24500 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70  e text of an exp
24510 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20  ression that we 
24520 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20  are building up 
24530 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61  one term.** at a
24540 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75   time.  This rou
24550 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20  tine adds a new 
24560 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20  term to the end 
24570 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
24580 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20  n..** Terms are 
24590 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44  separated by AND
245a0 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44   so add the "AND
245b0 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e  " text for secon
245c0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
245d0 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a  .** terms only..
245e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
245f0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
24600 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53  (.  StrAccum *pS
24610 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
24620 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72  /* The text expr
24630 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69  ession being bui
24640 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72  lt */.  int iTer
24650 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
24660 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
24670 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73  this term.  Firs
24680 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63  t is zero */.  c
24690 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
246a0 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  mn,        /* Na
246b0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
246c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
246d0 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20   *zOp           
246e0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
246f0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a   operator */.){.
24700 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71    if( iTerm ) sq
24710 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
24720 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20  end(pStr, " AND 
24730 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 5);.  sqlite3
24740 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
24750 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31  Str, zColumn, -1
24760 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
24770 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
24780 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69   zOp, 1);.  sqli
24790 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
247a0 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b  d(pStr, "?", 1);
247b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
247c0 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69  nt pLevel descri
247d0 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66  bes a strategy f
247e0 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c  or scanning tabl
247f0 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a  e pTab. This .**
24800 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
24810 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
24820 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63   string buffer c
24830 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63  ontaining a desc
24840 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ription.** of th
24850 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c  e subset of tabl
24860 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62  e rows scanned b
24870 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69  y the strategy i
24880 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e  n the form of an
24890 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69  .** SQL expressi
248a0 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72  on. Or, if all r
248b0 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c  ows are scanned,
248c0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
248d0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
248e0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
248f0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ry:.**.**   SELE
24900 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
24910 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a  RE a=1 AND b>2;.
24920 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64  **.** is run and
24930 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
24940 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68  ex on (a, b), th
24950 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24960 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74   returns a.** st
24970 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ring similar to:
24980 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e  .**.**   "a=? AN
24990 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65  D b>?".**.** The
249a0 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
249b0 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f  r points to memo
249c0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
249d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
249e0 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
249f0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
24a00 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
24a10 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72   free the buffer
24a20 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e   when it is.** n
24a30 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
24a40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
24a50 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  r *explainIndexR
24a60 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62  ange(sqlite3 *db
24a70 2c 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  , WhereLevel *pL
24a80 65 76 65 6c 2c 20 54 61 62 6c 65 20 2a 70 54 61  evel, Table *pTa
24a90 62 29 7b 0a 20 20 57 68 65 72 65 50 6c 61 6e 20  b){.  WherePlan 
24aa0 2a 70 50 6c 61 6e 20 3d 20 26 70 4c 65 76 65 6c  *pPlan = &pLevel
24ab0 2d 3e 70 6c 61 6e 3b 0a 20 20 49 6e 64 65 78 20  ->plan;.  Index 
24ac0 2a 70 49 6e 64 65 78 20 3d 20 70 50 6c 61 6e 2d  *pIndex = pPlan-
24ad0 3e 75 2e 70 49 64 78 3b 0a 20 20 69 6e 74 20 6e  >u.pIdx;.  int n
24ae0 45 71 20 3d 20 70 50 6c 61 6e 2d 3e 6e 45 71 3b  Eq = pPlan->nEq;
24af0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43  .  int i, j;.  C
24b00 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54  olumn *aCol = pT
24b10 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20  ab->aCol;.  int 
24b20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64  *aiColumn = pInd
24b30 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ex->aiColumn;.  
24b40 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20  StrAccum txt;.. 
24b50 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28   if( nEq==0 && (
24b60 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 20 26  pPlan->wsFlags &
24b70 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
24b80 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
24b90 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  T))==0 ){.    re
24ba0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
24bb0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
24bc0 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51  t(&txt, 0, 0, SQ
24bd0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29  LITE_MAX_LENGTH)
24be0 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b  ;.  txt.db = db;
24bf0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
24c00 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
24c10 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69   (", 2);.  for(i
24c20 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b  =0; i<nEq; i++){
24c30 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
24c40 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20  ndTerm(&txt, i, 
24c50 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d  aCol[aiColumn[i]
24c60 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a 20  ].zName, "=");. 
24c70 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69   }..  j = i;.  i
24c80 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67  f( pPlan->wsFlag
24c90 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  s&WHERE_BTM_LIMI
24ca0 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  T ){.    char *z
24cb0 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e   = (j==pIndex->n
24cc0 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69  Column ) ? "rowi
24cd0 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  d" : aCol[aiColu
24ce0 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[j]].zName;.  
24cf0 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
24d00 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a  erm(&txt, i++, z
24d10 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  , ">");.  }.  if
24d20 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73  ( pPlan->wsFlags
24d30 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
24d40 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
24d50 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43  = (j==pIndex->nC
24d60 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64  olumn ) ? "rowid
24d70 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
24d80 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
24d90 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
24da0 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22  rm(&txt, i, z, "
24db0 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  <");.  }.  sqlit
24dc0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
24dd0 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a  (&txt, ")", 1);.
24de0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
24df0 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
24e00 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  txt);.}../*.** T
24e10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24e20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63  a no-op unless c
24e30 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
24e40 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51  ing an EXPLAIN Q
24e50 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d  UERY PLAN.** com
24e60 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65  mand. If the que
24e70 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65  ry being compile
24e80 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20  d is an EXPLAIN 
24e90 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69  QUERY PLAN, a si
24ea0 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69  ngle.** record i
24eb0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f  s added to the o
24ec0 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69 62  utput to describ
24ed0 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e  e the table scan
24ee0 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a   strategy in .**
24ef0 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74   pLevel..*/.stat
24f00 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f  ic void explainO
24f10 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20  neScan(.  Parse 
24f20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
24f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
24f40 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
24f50 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
24f60 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
24f70 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68  /* Table list th
24f80 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74  is loop refers t
24f90 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  o */.  WhereLeve
24fa0 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20  l *pLevel,      
24fb0 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74         /* Scan t
24fc0 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61  o write OP_Expla
24fd0 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f  in opcode for */
24fe0 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25000 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
25010 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f  "level" column o
25020 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  f output */.  in
25030 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25050 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d   Value for "from
25060 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70  " column of outp
25070 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ut */.  u16 wctr
25080 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  lFlags          
25090 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
250a0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
250b0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
250c0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  /.){.  if( pPars
250d0 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
250e0 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73 20 3d  .    u32 flags =
250f0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
25100 46 6c 61 67 73 3b 0a 20 20 20 20 73 74 72 75 63  Flags;.    struc
25110 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
25120 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
25130 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
25140 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  om];.    Vdbe *v
25150 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
25160 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69  ;      /* VM bei
25170 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a  ng constructed *
25180 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  /.    sqlite3 *d
25190 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
251a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
251b0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68  handle */.    ch
251c0 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20  ar *zMsg;       
251d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
251e0 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51  ext to add to EQ
251f0 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  P output */.    
25200 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 52  sqlite3_int64 nR
25210 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ow;           /*
25220 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72   Expected number
25230 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
25240 20 62 79 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20   by scan */.    
25250 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73 65  int iId = pParse
25260 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a  ->iSelectId;  /*
25270 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74   Select id (left
25280 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c  -most output col
25290 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  umn) */.    int 
252a0 69 73 53 65 61 72 63 68 3b 20 20 20 20 20 20 20  isSearch;       
252b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
252c0 65 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20  e for a SEARCH. 
252d0 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20  False for SCAN. 
252e0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 28 66 6c 61  */..    if( (fla
252f0 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  gs&WHERE_MULTI_O
25300 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67  R) || (wctrlFlag
25310 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  s&WHERE_ONETABLE
25320 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b  _ONLY) ) return;
25330 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d  ..    isSearch =
25340 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e   (pLevel->plan.n
25350 45 71 3e 30 29 0a 20 20 20 20 20 20 20 20 20 20  Eq>0).          
25360 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 28 57 48     || (flags&(WH
25370 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
25380 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21  ERE_TOP_LIMIT))!
25390 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
253a0 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28  || (wctrlFlags&(
253b0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
253c0 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
253d0 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67  MAX));..    zMsg
253e0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
253f0 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65  f(db, "%s", isSe
25400 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53  arch?"SEARCH":"S
25410 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  CAN");.    if( p
25420 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
25430 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
25440 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
25450 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51  , zMsg, "%s SUBQ
25460 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70  UERY %d", zMsg,p
25470 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29  Item->iSelectId)
25480 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25490 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
254a0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
254b0 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73  sg, "%s TABLE %s
254c0 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
254d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  zName);.    }.. 
254e0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
254f0 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d  lias ){.      zM
25500 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
25510 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
25520 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c  %s AS %s", zMsg,
25530 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
25540 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
25550 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  flags & WHERE_IN
25560 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  DEXED)!=0 ){.   
25570 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20     char *zWhere 
25580 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  = explainIndexRa
25590 6e 67 65 28 64 62 2c 20 70 4c 65 76 65 6c 2c 20  nge(db, pLevel, 
255a0 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
255b0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
255c0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
255d0 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 25  Msg, "%s USING %
255e0 73 25 73 49 4e 44 45 58 25 73 25 73 25 73 22 2c  s%sINDEX%s%s%s",
255f0 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20   zMsg, .        
25600 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
25610 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 41  E_TEMP_INDEX)?"A
25620 55 54 4f 4d 41 54 49 43 20 22 3a 22 22 29 2c 0a  UTOMATIC ":""),.
25630 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
25640 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
25650 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47 20 22 3a  LY)?"COVERING ":
25660 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28  ""),.          (
25670 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  (flags & WHERE_T
25680 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 22 20  EMP_INDEX)?"":" 
25690 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28  "),.          ((
256a0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  flags & WHERE_TE
256b0 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 20 70 4c  MP_INDEX)?"": pL
256c0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
256d0 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  x->zName),.     
256e0 20 20 20 20 20 7a 57 68 65 72 65 0a 20 20 20 20       zWhere.    
256f0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
25700 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68  e3DbFree(db, zWh
25710 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ere);.    }else 
25720 69 66 28 20 66 6c 61 67 73 20 26 20 28 57 48 45  if( flags & (WHE
25730 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
25740 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29  E_ROWID_RANGE) )
25750 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
25760 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
25770 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49  b, zMsg, "%s USI
25780 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
25790 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a  RY KEY", zMsg);.
257a0 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73  .      if( flags
257b0 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20  &WHERE_ROWID_EQ 
257c0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
257d0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
257e0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
257f0 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67  (rowid=?)", zMsg
25800 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
25810 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f  f( (flags&WHERE_
25820 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45  BOTH_LIMIT)==WHE
25830 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b  RE_BOTH_LIMIT ){
25840 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
25850 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
25860 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
25870 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64  owid>? AND rowid
25880 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
25890 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
258a0 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
258b0 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
258c0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
258d0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
258e0 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a  %s (rowid>?)", z
258f0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
25900 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52  e if( flags&WHER
25910 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_TOP_LIMIT ){. 
25920 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
25930 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
25940 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
25950 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
25960 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
25970 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25980 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
25990 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
259a0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
259b0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
259c0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
259d0 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78  x_info *pVtabIdx
259e0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
259f0 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20  u.pVtabIdx;.    
25a00 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
25a10 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
25a20 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54  g, "%s VIRTUAL T
25a30 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73  ABLE INDEX %d:%s
25a40 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  ", zMsg,.       
25a50 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
25a60 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74  Idx->idxNum, pVt
25a70 61 62 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a  abIdx->idxStr);.
25a80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
25a90 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 26   if( wctrlFlags&
25aa0 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  (WHERE_ORDERBY_M
25ab0 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  IN|WHERE_ORDERBY
25ac0 5f 4d 41 58 29 20 29 7b 0a 20 20 20 20 20 20 74  _MAX) ){.      t
25ad0 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
25ae0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
25af0 52 42 59 5f 4d 49 4e 20 29 3b 0a 20 20 20 20 20  RBY_MIN );.     
25b00 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d   nRow = 1;.    }
25b10 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 6f 77  else{.      nRow
25b20 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   = (sqlite3_int6
25b30 34 29 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  4)pLevel->plan.n
25b40 52 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  Row;.    }.    z
25b50 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
25b60 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
25b70 22 25 73 20 28 7e 25 6c 6c 64 20 72 6f 77 73 29  "%s (~%lld rows)
25b80 22 2c 20 7a 4d 73 67 2c 20 6e 52 6f 77 29 3b 0a  ", zMsg, nRow);.
25b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25ba0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
25bb0 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c  ain, iId, iLevel
25bc0 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50  , iFrom, zMsg, P
25bd0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
25be0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
25bf0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
25c00 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  u,v,w,x,y,z).#en
25c10 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
25c20 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a  IT_EXPLAIN */...
25c30 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
25c40 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61 72  ode for the star
25c50 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d  t of the iLevel-
25c60 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57  th loop in the W
25c70 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69  HERE clause.** i
25c80 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65  mplementation de
25c90 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e 66  scribed by pWInf
25ca0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  o..*/.static Bit
25cb0 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70  mask codeOneLoop
25cc0 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e  Start(.  WhereIn
25cd0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a  fo *pWInfo,   /*
25ce0 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d   Complete inform
25cf0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
25d00 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
25d10 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
25d20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
25d30 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d  level of pWInfo-
25d40 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63  >a[] should be c
25d50 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36 20 77 63  oded */.  u16 wc
25d60 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 2f  trlFlags,      /
25d70 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
25d80 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
25d90 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
25da0 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
25db0 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57  otReady     /* W
25dc0 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
25dd0 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
25de0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
25df0 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
25e00 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
25e10 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
25e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25e30 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
25e40 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
25e50 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20    int addrNxt;  
25e60 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
25e70 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69  to jump to conti
25e80 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
25e90 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69  t IN case */.  i
25ea0 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20  nt omitTable;   
25eb0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
25ec0 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
25ed0 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  only */.  int bR
25ee0 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
25ef0 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65  * True if we nee
25f00 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  d to scan in rev
25f10 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
25f20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
25f30 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72  el;  /* The wher
25f40 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f  e level to be co
25f50 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ded */.  WhereCl
25f60 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a  ause *pWC;    /*
25f70 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f   Decomposition o
25f80 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45  f the entire WHE
25f90 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
25fa0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
25fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25fc0 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65  * A WHERE clause
25fd0 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65   term */.  Parse
25fe0 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
25ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
26000 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
26010 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
26020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26030 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
26040 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f  ed stmt under co
26050 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
26060 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
26070 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
26080 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
26090 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64  term being coded
260a0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
260b0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
260c0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
260d0 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
260e0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
260f0 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20   int addrCont;  
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26110 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
26120 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
26130 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
26140 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30  nt iRowidReg = 0
26150 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
26160 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  d is stored in t
26170 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66  his register, if
26180 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69   not zero */.  i
26190 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d  nt iReleaseReg =
261a0 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70   0;      /* Temp
261b0 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
261c0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
261d0 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ng */..  pParse 
261e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
261f0 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
26200 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 70  pVdbe;.  pWC = p
26210 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c  WInfo->pWC;.  pL
26220 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
26230 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61  a[iLevel];.  pTa
26240 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
26250 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
26260 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
26270 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
26280 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20  iCursor;.  bRev 
26290 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  = (pLevel->plan.
262a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
262b0 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f  REVERSE)!=0;.  o
262c0 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76  mitTable = (pLev
262d0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
262e0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
262f0 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  Y)!=0 .         
26300 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
26310 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54   & WHERE_FORCE_T
26320 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20 2f 2a 20  ABLE)==0;..  /* 
26330 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
26340 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
26350 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
26360 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66  tructions.  ** f
26370 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
26380 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64  oop.  Jump to ad
26390 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f  drBrk to break o
263a0 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20  ut of a loop..  
263b0 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20  ** Jump to cont 
263c0 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c  to go immediatel
263d0 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  y to the next it
263e0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  eration of the. 
263f0 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20   ** loop..  **. 
26400 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
26410 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
26420 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
26430 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
26440 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73   that.  ** means
26450 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
26460 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61  h the next IN va
26470 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  lue combination.
26480 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72    When.  ** ther
26490 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
264a0 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
264b0 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61  straints, the "a
264c0 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20  ddrNxt" label.  
264d0 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
264e0 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a  s "addrBrk"..  *
264f0 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c  /.  addrBrk = pL
26500 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20  evel->addrBrk = 
26510 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
26520 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
26530 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64  eLabel(v);.  add
26540 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  rCont = pLevel->
26550 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
26560 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
26570 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  v);..  /* If thi
26580 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  s is the right t
26590 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f  able of a LEFT O
265a0 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63  UTER JOIN, alloc
265b0 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69  ate and.  ** ini
265c0 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
265d0 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
265e0 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
265f0 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a   matches any.  *
26600 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
26610 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
26620 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oin..  */.  if( 
26630 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
26640 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
26650 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
26660 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  FT)!=0 ){.    pL
26670 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
26680 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
26690 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
266a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
266b0 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
266c0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
266d0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
266e0 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
266f0 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
26700 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  ));.  }..  /* Sp
26710 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
26720 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71  FROM clause subq
26730 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64  uery implemented
26740 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
26750 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74   */.  if( pTabIt
26760 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
26770 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59   ){.    int regY
26780 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d  ield = pTabItem-
26790 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
267a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
267b0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
267c0 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46   pTabItem->addrF
267d0 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59 69 65  illSub-1, regYie
267e0 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ld);.    pLevel-
267f0 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64  >p2 =  sqlite3Vd
26800 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
26810 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b  ield, regYield);
26820 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
26830 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f  ((v, "next row o
26840 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22  f co-routine %s"
26850 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
26860 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73  ->zName));.    s
26870 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26880 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59 69  (v, OP_If, regYi
26890 65 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b  eld+1, addrBrk);
268a0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
268b0 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c  = OP_Goto;.  }el
268c0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
268d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
268e0 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 65  ABLE.  if(  (pLe
268f0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
26900 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
26910 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
26920 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68    /* Case 0:  Th
26930 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72  e table is a vir
26940 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65  tual-table.  Use
26950 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64   the VFilter and
26960 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20   VNext.    **   
26970 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
26980 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a   the data..    *
26990 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20  /.    int iReg; 
269a0 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
269b0 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
269c0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46      int addrNotF
269d0 6f 75 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  ound;.    sqlite
269e0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56  3_index_info *pV
269f0 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d  tabIdx = pLevel-
26a00 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78  >plan.u.pVtabIdx
26a10 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
26a20 72 61 69 6e 74 20 3d 20 70 56 74 61 62 49 64 78  raint = pVtabIdx
26a30 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
26a40 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65     struct sqlite
26a50 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
26a60 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65  nt_usage *aUsage
26a70 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26aa0 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f     pVtabIdx->aCo
26ab0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
26ac0 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20     const struct 
26ad0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
26ae0 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74  nstraint *aConst
26af0 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20  raint =.        
26b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
26b30 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a  ->aConstraint;..
26b40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26b50 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
26b60 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  ;.    iReg = sql
26b70 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
26b80 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72  (pParse, nConstr
26b90 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64  aint+2);.    add
26ba0 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76  rNotFound = pLev
26bb0 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20  el->addrBrk;.   
26bc0 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f   for(j=1; j<=nCo
26bd0 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
26be0 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
26bf0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b  <nConstraint; k+
26c00 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
26c10 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e  aUsage[k].argvIn
26c20 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20  dex==j ){.      
26c30 20 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20      int iTarget 
26c40 3d 20 69 52 65 67 2b 6a 2b 31 3b 0a 20 20 20 20  = iReg+j+1;.    
26c50 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
26c60 57 43 2d 3e 61 5b 61 43 6f 6e 73 74 72 61 69 6e  WC->a[aConstrain
26c70 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[k].iTermOffset
26c80 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
26c90 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
26ca0 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  r & WO_IN ){.   
26cb0 20 20 20 20 20 20 20 20 20 63 6f 64 65 45 71 75           codeEqu
26cc0 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
26cd0 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
26ce0 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
26cf0 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f         addrNotFo
26d00 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
26d10 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 20 20 20  drNxt;.         
26d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26d30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26d40 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  ode(pParse, pTer
26d50 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
26d60 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
26d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26d80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
26d90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
26da0 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61   if( k==nConstra
26db0 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  int ) break;.   
26dc0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
26dd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
26de0 6e 74 65 67 65 72 2c 20 70 56 74 61 62 49 64 78  nteger, pVtabIdx
26df0 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b  ->idxNum, iReg);
26e00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
26e10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
26e20 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b  eger, j-1, iReg+
26e30 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
26e40 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
26e50 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61  VFilter, iCur, a
26e60 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65  ddrNotFound, iRe
26e70 67 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78  g, pVtabIdx->idx
26e80 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
26e90 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
26ea0 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
26eb0 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e  dxStr ? P4_MPRIN
26ec0 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b  TF : P4_STATIC);
26ed0 0a 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e  .    pVtabIdx->n
26ee0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
26ef0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 0;.    for(j=0
26f00 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; j<nConstraint;
26f10 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
26f20 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20   aUsage[j].omit 
26f30 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
26f40 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69  Term = aConstrai
26f50 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[j].iTermOffse
26f60 74 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  t;.        disab
26f70 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26  leTerm(pLevel, &
26f80 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a  pWC->a[iTerm]);.
26f90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26fa0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
26fb0 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  P_VNext;.    pLe
26fc0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
26fd0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
26fe0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
26ff0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
27000 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
27010 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
27020 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  iReg, nConstrain
27030 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t+2);.    sqlite
27040 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
27050 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  arse, 1);.  }els
27060 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
27070 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
27080 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70  ABLE */..  if( p
27090 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
270a0 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
270b0 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43  D_EQ ){.    /* C
270c0 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64  ase 1:  We can d
270d0 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
270e0 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
270f0 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20  sing an.    **  
27100 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
27110 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
27120 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
27130 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20  eld.  Or.    ** 
27140 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
27150 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
27160 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
27170 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
27180 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
27190 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  struct..    */. 
271a0 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d     iReleaseReg =
271b0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
271c0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
271d0 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
271e0 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
271f0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
27200 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61  WO_IN, 0);.    a
27210 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
27220 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27230 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
27240 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ;.    assert( om
27250 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
27260 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
27270 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
27280 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
27290 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
272a0 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64 52  2 */.    iRowidR
272b0 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  eg = codeEqualit
272c0 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
272d0 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 69 52 65  erm, pLevel, iRe
272e0 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61  leaseReg);.    a
272f0 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
27300 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71  >addrNxt;.    sq
27310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27320 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
27330 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72   iRowidReg, addr
27340 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Nxt);.    sqlite
27350 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
27360 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
27370 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77  r, addrNxt, iRow
27380 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69  idReg);.    sqli
27390 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
273a0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
273b0 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29  e, iRowidReg, 1)
273c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
273d0 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
273e0 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
273f0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
27400 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
27410 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  k"));.    pLevel
27420 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
27430 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
27440 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
27450 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52   & WHERE_ROWID_R
27460 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ANGE ){.    /* C
27470 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65 20  ase 2:  We have 
27480 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  an inequality co
27490 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
274a0 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
274b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
274c0 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
274d0 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  p;.    int start
274e0 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64  ;.    int memEnd
274f0 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57  Value = 0;.    W
27500 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74  hereTerm *pStart
27510 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73  , *pEnd;..    as
27520 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
27530 3d 30 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74  =0 );.    pStart
27540 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
27550 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
27560 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
27570 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d  , 0);.    pEnd =
27580 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
27590 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
275a0 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
275b0 30 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  0);.    if( bRev
275c0 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20   ){.      pTerm 
275d0 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
275e0 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
275f0 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
27600 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  m;.    }.    if(
27610 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
27620 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
27630 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
27640 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65  pression that de
27650 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20  fines the start 
27660 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
27670 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20  nt r1, rTemp;   
27680 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
27690 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68  s for holding th
276a0 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79  e start boundary
276b0 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
276c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
276d0 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20  tant maps TK_xx 
276e0 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65  codes into corre
276f0 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20  sponding .      
27700 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e  ** seek opcodes.
27710 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20    It depends on 
27720 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  a particular ord
27730 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20  ering of TK_xx. 
27740 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
27750 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d  nst u8 aMoveOp[]
27760 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
27770 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f  /* TK_GT */  OP_
27780 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20  SeekGt,.        
27790 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20     /* TK_LE */  
277a0 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20  OP_SeekLe,.     
277b0 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a        /* TK_LT *
277c0 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20  /  OP_SeekLt,.  
277d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
277e0 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a  E */  OP_SeekGe.
277f0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61        };.      a
27800 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b  ssert( TK_LE==TK
27810 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+1 );      /*
27820 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   Make sure the o
27830 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20  rdering.. */.   
27840 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
27850 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20  ==TK_GT+2 );    
27860 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65    /*  ... of the
27870 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e   TK_xx values...
27880 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
27890 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33  ( TK_GE==TK_GT+3
278a0 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
278b0 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f   is correcct. */
278c0 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
278d0 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ( pStart->wtFlag
278e0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
278f0 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
27900 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
27910 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70    pX = pStart->p
27920 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
27930 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
27940 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
27950 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  t->leftCursor==i
27960 43 75 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20  Cur );.      r1 
27970 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
27980 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
27990 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70  ->pRight, &rTemp
279a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
279b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d  VdbeAddOp3(v, aM
279c0 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f  oveOp[pX->op-TK_
279d0 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  GT], iCur, addrB
279e0 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  rk, r1);.      V
279f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
27a00 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  pk"));.      sql
27a10 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
27a20 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
27a30 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  se, r1, 1);.    
27a40 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
27a50 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
27a60 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69  rTemp);.      di
27a70 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
27a80 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d  , pStart);.    }
27a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
27aa0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27ab0 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
27ac0 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  : OP_Rewind, iCu
27ad0 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  r, addrBrk);.   
27ae0 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20   }.    if( pEnd 
27af0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
27b00 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45  X;.      pX = pE
27b10 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nd->pExpr;.     
27b20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
27b30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27b40 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pEnd->leftCursor
27b50 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20  ==iCur );.      
27b60 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e  testcase( pEnd->
27b70 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
27b80 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
27b90 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
27ba0 2f 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61  /.      memEndVa
27bb0 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lue = ++pParse->
27bc0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
27bd0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
27be0 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
27bf0 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20  memEndValue);.  
27c00 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d      if( pX->op==
27c10 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_LT || pX->op=
27c20 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20  =TK_GT ){.      
27c30 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
27c40 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b  ? OP_Le : OP_Ge;
27c50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27c60 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
27c70 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50  Rev ? OP_Lt : OP
27c80 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _Gt;.      }.   
27c90 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
27ca0 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20  Level, pEnd);.  
27cb0 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20    }.    start = 
27cc0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
27cd0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70  ntAddr(v);.    p
27ce0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76  Level->op = bRev
27cf0 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
27d00 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Next;.    pLevel
27d10 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
27d20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
27d30 61 72 74 3b 0a 20 20 20 20 69 66 28 20 70 53 74  art;.    if( pSt
27d40 61 72 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d  art==0 && pEnd==
27d50 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
27d60 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
27d70 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
27d80 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
27d90 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
27da0 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
27db0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
27dc0 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
27dd0 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
27de0 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
27df0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
27e00 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
27e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27e20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
27e30 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  id, iCur, iRowid
27e40 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
27e50 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
27e60 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
27e70 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
27e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27e90 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f  eAddOp3(v, testO
27ea0 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20  p, memEndValue, 
27eb0 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52  addrBrk, iRowidR
27ec0 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
27ed0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
27ee0 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
27ef0 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55  ERIC | SQLITE_JU
27f00 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  MPIFNULL);.    }
27f10 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65  .  }else if( pLe
27f20 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
27f30 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
27f40 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f  N_RANGE|WHERE_CO
27f50 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20  LUMN_EQ) ){.    
27f60 2f 2a 20 43 61 73 65 20 33 3a 20 41 20 73 63 61  /* Case 3: A sca
27f70 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
27f80 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
27f90 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
27fa0 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
27fb0 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
27fc0 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
27fd0 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
27fe0 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
27ff0 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
28000 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
28010 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
28020 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
28030 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
28040 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
28050 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
28060 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
28070 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
28080 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
28090 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
280a0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
280b0 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
280c0 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
280d0 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
280e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
280f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
28100 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
28110 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
28120 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
28130 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
28140 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
28150 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
28160 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
28170 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
28180 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
28190 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
281a0 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
281b0 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
281c0 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
281d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
281e0 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
281f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
28200 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
28210 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
28220 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
28230 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
28240 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
28250 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
28260 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
28270 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
28280 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
28290 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
282a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
282b0 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
282c0 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
282d0 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
282e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
282f0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
28300 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
28310 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
28320 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
28330 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
28340 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
28350 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
28360 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
28370 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
28380 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
28390 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
283a0 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
283b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
283c0 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
283d0 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
283e0 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
283f0 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
28400 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
28410 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
28420 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
28430 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
28440 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
28450 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
28460 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
28470 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
28480 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73  ..    */  .    s
28490 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
284a0 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20  StartOp[] = {.  
284b0 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a      0,.      0,.
284c0 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c        OP_Rewind,
284d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
284e0 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
284f0 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
28500 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20  &&  !bRev) */.  
28510 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20      OP_Last,    
28520 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
28530 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
28540 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
28550 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20     bRev) */.    
28560 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20    OP_SeekGt,    
28570 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74         /* 4: (st
28580 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
28590 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
285a0 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
285b0 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20  OP_SeekLt,      
285c0 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72       /* 5: (star
285d0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
285e0 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62  & !startEq &&  b
285f0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
28600 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20  _SeekGe,        
28610 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f     /* 6: (start_
28620 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
28630 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65   startEq && !bRe
28640 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
28650 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20  eekLe           
28660 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f   /* 7: (start_co
28670 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
28680 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
28690 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73   */.    };.    s
286a0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
286b0 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
286c0 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20    OP_Noop,      
286d0 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65         /* 0: (!e
286e0 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20  nd_constraints) 
286f0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47  */.      OP_IdxG
28700 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
28710 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
28720 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a  ints && !bRev) *
28730 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54  /.      OP_IdxLT
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28750 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
28760 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a  nts && bRev) */.
28770 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
28780 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  Eq = pLevel->pla
28790 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65  n.nEq;  /* Numbe
287a0 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65  r of == or IN te
287b0 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  rms */.    int i
287c0 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20  sMinQuery = 0;  
287d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
287e0 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
287f0 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  ed SELECT min(x)
28800 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  .. */.    int re
28810 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
28820 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
28830 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
28840 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
28850 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b  s */.    int r1;
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28870 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
28880 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68  gister */.    Wh
28890 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53  ereTerm *pRangeS
288a0 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  tart = 0;  /* In
288b0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
288c0 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74 61  int at range sta
288d0 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  rt */.    WhereT
288e0 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d  erm *pRangeEnd =
288f0 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61   0;    /* Inequa
28900 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
28910 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a  at range end */.
28920 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b      int startEq;
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28940 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
28950 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c  e start uses ==,
28960 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
28970 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20   int endEq;     
28980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28990 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65   True if range e
289a0 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  nd uses ==, >= o
289b0 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
289c0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
289d0 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  s;       /* Star
289e0 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f  t of range is co
289f0 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20  nstrained */.   
28a00 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
28a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
28a20 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
28a30 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20  raint terms */. 
28a40 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
28a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a60 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
28a70 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f  will be using */
28a80 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72  .    int iIdxCur
28a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28aa0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
28ab0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
28ac0 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  ex */.    int nE
28ad0 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20  xtraReg = 0;    
28ae0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28af0 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
28b00 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20  ers needed */.  
28b10 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28b30 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70  * Instruction op
28b40 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  code */.    char
28b50 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20   *zStartAff;    
28b60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
28b70 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f  nity for start o
28b80 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
28b90 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  nt */.    char *
28ba0 7a 45 6e 64 41 66 66 3b 20 20 20 20 20 20 20 20  zEndAff;        
28bb0 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
28bc0 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61  ty for end of ra
28bd0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  nge constraint *
28be0 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c  /..    pIdx = pL
28bf0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
28c00 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
28c10 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
28c20 3b 0a 20 20 20 20 6b 20 3d 20 28 6e 45 71 3d 3d  ;.    k = (nEq==
28c30 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20  pIdx->nColumn ? 
28c40 2d 31 20 3a 20 70 49 64 78 2d 3e 61 69 43 6f 6c  -1 : pIdx->aiCol
28c50 75 6d 6e 5b 6e 45 71 5d 29 3b 0a 0a 20 20 20 20  umn[nEq]);..    
28c60 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20  /* If this loop 
28c70 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74  satisfies a sort
28c80 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79   order (pOrderBy
28c90 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a  ) request that .
28ca0 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65      ** was passe
28cb0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
28cc0 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  on to implement 
28cd0 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
28ce0 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75   ..." .    ** qu
28cf0 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ery, then the ca
28d00 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61  ller will only a
28d10 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f  llow the loop to
28d20 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20   run for.    ** 
28d30 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69  a single iterati
28d40 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  on. This means t
28d50 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  hat the first ro
28d60 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a  w returned.    *
28d70 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  * should not hav
28d80 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73  e a NULL value s
28d90 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66  tored in 'x'. If
28da0 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20   column 'x' is. 
28db0 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
28dc0 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45  one after the nE
28dd0 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  q equality const
28de0 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  raints in the in
28df0 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73  dex,.    ** this
28e00 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73   requires some s
28e10 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
28e20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28e30 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
28e40 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d  E_ORDERBY_MIN)!=
28e50 30 0a 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  0.     && (pLeve
28e60 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26  l->plan.wsFlags&
28e70 57 48 45 52 45 5f 4f 52 44 45 52 45 44 29 0a 20  WHERE_ORDERED). 
28e80 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43      && (pIdx->nC
28e90 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29  olumn>nEq).    )
28ea0 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  {.      /* asser
28eb0 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t( pOrderBy->nEx
28ec0 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20  pr==1 ); */.    
28ed0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72    /* assert( pOr
28ee0 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70  derBy->a[0].pExp
28ef0 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  r->iColumn==pIdx
28f00 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20  ->aiColumn[nEq] 
28f10 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69  ); */.      isMi
28f20 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20  nQuery = 1;.    
28f30 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
28f40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
28f50 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69  ind any inequali
28f60 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ty constraint te
28f70 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72  rms for the star
28f80 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a  t and end .    *
28f90 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  * of the range. 
28fa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28fb0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
28fc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
28fd0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
28fe0 70 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64  pRangeEnd = find
28ff0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
29000 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f  k, notReady, (WO
29010 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78  _LT|WO_LE), pIdx
29020 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  );.      nExtraR
29030 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  eg = 1;.    }.  
29040 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
29050 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
29060 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
29070 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61 72        pRangeStar
29080 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  t = findTerm(pWC
29090 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
290a0 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  ady, (WO_GT|WO_G
290b0 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  E), pIdx);.     
290c0 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
290d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
290e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
290f0 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
29100 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
29110 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
29120 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
29130 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
29140 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72   terms in an arr
29150 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
29160 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
29170 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20  at regBase..    
29180 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  */.    regBase =
29190 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
291a0 54 65 72 6d 73 28 0a 20 20 20 20 20 20 20 20 70  Terms(.        p
291b0 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70  Parse, pLevel, p
291c0 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45  WC, notReady, nE
291d0 78 74 72 61 52 65 67 2c 20 26 7a 53 74 61 72 74  xtraReg, &zStart
291e0 41 66 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a  Aff.    );.    z
291f0 45 6e 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33  EndAff = sqlite3
29200 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
29210 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  >db, zStartAff);
29220 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
29230 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
29240 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
29250 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
29260 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
29270 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
29280 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  ex, or.    ** a 
29290 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63  forward order sc
292a0 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69  an on a descendi
292b0 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63  ng index, interc
292c0 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a  hange the .    *
292d0 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  * start and end 
292e0 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61  terms (pRangeSta
292f0 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64  rt and pRangeEnd
29300 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
29310 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f  ( (nEq<pIdx->nCo
29320 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70  lumn && bRev==(p
29330 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
29340 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  nEq]==SQLITE_SO_
29350 41 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62  ASC)).     || (b
29360 52 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f  Rev && pIdx->nCo
29370 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29  lumn==nEq).    )
29380 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65  {.      SWAP(Whe
29390 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65  reTerm *, pRange
293a0 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74  End, pRangeStart
293b0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  );.    }..    te
293c0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
293d0 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61  art && pRangeSta
293e0 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
293f0 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_LE );.    tes
29400 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
29410 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
29420 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
29430 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74  O_GE );.    test
29440 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20  case( pRangeEnd 
29450 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  && pRangeEnd->eO
29460 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
29470 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
29480 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52   pRangeEnd && pR
29490 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
294a0 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
294b0 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
294c0 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
294d0 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
294e0 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
294f0 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
29500 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
29510 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
29520 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
29530 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
29540 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
29550 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
29560 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
29570 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
29580 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
29590 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
295a0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
295b0 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
295c0 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
295d0 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
295e0 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e   = pRangeStart->
295f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
29600 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29610 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
29620 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
29630 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
29640 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
29650 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
29660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
29670 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
29680 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
29690 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ht, regBase+nEq,
296a0 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
296b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74   }.      if( zSt
296c0 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20  artAff ){.      
296d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
296e0 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
296f0 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
29700 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
29710 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
29720 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
29730 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
29740 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
29750 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
29760 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
29770 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
29780 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
29790 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
297a0 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
297b0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
297c0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
297d0 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
297e0 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
297f0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
29800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
29810 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
29820 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
29830 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61  nge(pRight, zSta
29840 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  rtAff[nEq]) ){. 
29850 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
29860 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
29870 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
29880 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
29890 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
298a0 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
298b0 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d  se( pRangeStart-
298c0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
298d0 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
298e0 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
298f0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
29900 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20   isMinQuery ){. 
29910 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29920 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
29930 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
29940 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  q);.      nConst
29950 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  raint++;.      s
29960 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
29970 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
29980 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nts = 1;.    }. 
29990 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
299a0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
299b0 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
299c0 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  t, zStartAff);. 
299d0 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
299e0 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
299f0 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
29a00 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
29a10 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
29a20 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
29a30 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
29a40 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
29a50 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b  ( op==OP_Last );
29a60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
29a70 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a  p==OP_SeekGt );.
29a80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
29a90 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20  ==OP_SeekGe );. 
29aa0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
29ab0 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20  =OP_SeekLe );.  
29ac0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
29ad0 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20  OP_SeekLt );.   
29ae0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29af0 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
29b00 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
29b10 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
29b20 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  int);..    /* Lo
29b30 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ad the value for
29b40 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
29b50 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68  constraint at th
29b60 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
29b70 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e   ** range (if an
29b80 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  y)..    */.    n
29b90 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
29ba0 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
29bb0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
29bc0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
29bd0 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52  geEnd->pExpr->pR
29be0 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
29bf0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
29c00 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ve(pParse, regBa
29c10 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20  se+nEq, 1);.    
29c20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
29c30 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
29c40 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
29c50 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
29c60 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
29c70 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
29c80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29c90 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
29ca0 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
29cb0 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
29cc0 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Nxt);.      }.  
29cd0 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20      if( zEndAff 
29ce0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
29cf0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
29d00 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45  inity(pRight, zE
29d10 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c  ndAff[nEq])==SQL
29d20 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20  ITE_AFF_NONE){. 
29d30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63           /* Sinc
29d40 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
29d50 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72   is to be perfor
29d60 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76  med with no conv
29d70 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  ersions.        
29d80 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20    ** applied to 
29d90 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65  the operands, se
29da0 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
29db0 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68  o apply to pRigh
29dc0 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20  t to .          
29dd0 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
29de0 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  NE.  */.        
29df0 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d    zEndAff[nEq] =
29e00 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
29e10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29e20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
29e30 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
29e40 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
29e50 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29   zEndAff[nEq]) )
29e60 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64  {.          zEnd
29e70 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
29e80 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
29e90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a      }.      }  .
29ea0 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41        codeApplyA
29eb0 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
29ec0 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20  regBase, nEq+1, 
29ed0 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20  zEndAff);.      
29ee0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
29ef0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
29f00 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
29f10 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
29f20 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
29f30 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
29f40 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
29f50 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
29f60 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
29f70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
29f80 61 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66  arse->db, zEndAf
29f90 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20  f);..    /* Top 
29fa0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79  of the loop body
29fb0 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   */.    pLevel->
29fc0 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
29fd0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
29fe0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
29ff0 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
2a000 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e  r is past the en
2a010 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  d of the range. 
2a020 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64  */.    op = aEnd
2a030 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c  Op[(pRangeEnd ||
2a040 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65   nEq) * (1 + bRe
2a050 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  v)];.    testcas
2a060 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29  e( op==OP_Noop )
2a070 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2a080 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
2a090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
2a0a0 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20  ==OP_IdxLT );.  
2a0b0 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f    if( op!=OP_Noo
2a0c0 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
2a0d0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2a0e0 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
2a0f0 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
2a100 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
2a110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a120 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64  eChangeP5(v, end
2a130 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a  Eq!=bRev ?1:0);.
2a140 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2a150 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
2a160 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
2a170 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  s, check that th
2a180 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f  e value.    ** o
2a190 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
2a1a0 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71  mn that the ineq
2a1b0 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73  uality contrains
2a1c0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
2a1d0 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a    ** If it is, j
2a1e0 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
2a1f0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
2a200 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
2a210 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
2a220 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
2a230 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2a240 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2a250 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
2a260 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65  _LIMIT );.    te
2a270 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
2a280 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2a290 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
2a2a0 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  ;.    if( (pLeve
2a2b0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2a2c0 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
2a2d0 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
2a2e0 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IT))!=0 ){.     
2a2f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a300 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2a310 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72   iIdxCur, nEq, r
2a320 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2a330 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2a340 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64  P_IsNull, r1, ad
2a350 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  drCont);.    }. 
2a360 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2a370 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2a380 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   r1);..    /* Se
2a390 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ek the table cur
2a3a0 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64  sor, if required
2a3b0 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54   */.    disableT
2a3c0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
2a3d0 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69  geStart);.    di
2a3e0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
2a3f0 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20  , pRangeEnd);.  
2a400 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
2a410 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
2a420 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
2a430 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
2a440 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2a450 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a460 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
2a470 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
2a480 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
2a490 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2a4a0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
2a4b0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
2a4c0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
2a4d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2a4e0 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
2a4f0 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20  iRowidReg);  /* 
2a500 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
2a510 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
2a520 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75  ecord the instru
2a530 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65  ction used to te
2a540 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
2a550 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a  . Disable .    *
2a560 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
2a570 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64  erms made redund
2a580 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78  ant by the index
2a590 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20   range scan..   
2a5a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
2a5b0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2a5c0 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20   & WHERE_UNIQUE 
2a5d0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
2a5e0 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
2a5f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65     }else if( bRe
2a600 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  v ){.      pLeve
2a610 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b  l->op = OP_Prev;
2a620 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a630 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
2a640 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  P_Next;.    }.  
2a650 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
2a660 49 64 78 43 75 72 3b 0a 20 20 20 20 69 66 28 20  IdxCur;.    if( 
2a670 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2a680 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 56  lags & WHERE_COV
2a690 45 52 5f 53 43 41 4e 20 29 7b 0a 20 20 20 20 20  ER_SCAN ){.     
2a6a0 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
2a6b0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
2a6c0 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
2a6d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a6e0 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
2a6f0 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  p5==0 );.    }. 
2a700 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
2a710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
2a720 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66  PTIMIZATION.  if
2a730 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
2a740 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
2a750 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f  ULTI_OR ){.    /
2a760 2a 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f  * Case 4:  Two o
2a770 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c  r more separatel
2a780 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  y indexed terms 
2a790 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a  connected by OR.
2a7a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
2a7b0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
2a7c0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
2a7d0 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b  BLE t1(a,b,c,d);
2a7e0 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
2a7f0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
2a800 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  a);.    **   CRE
2a810 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
2a820 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(b);.    **   
2a830 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
2a840 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a  ON t1(c);.    **
2a850 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
2a860 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
2a870 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28   a=5 OR b=7 OR (
2a880 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20  c=11 AND d=13). 
2a890 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
2a8a0 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  the example, the
2a8b0 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64  re are three ind
2a8c0 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
2a8d0 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20  cted by OR..    
2a8e0 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
2a8f0 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b  e loop looks lik
2a900 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
2a910 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
2a920 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
2a930 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
2a940 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
2a950 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20  reg 1.    **.   
2a960 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61   ** Then, for ea
2a970 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c  ch indexed term,
2a980 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20   the following. 
2a990 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
2a9a0 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65  .    ** RowSetTe
2a9b0 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74  st are such that
2a9c0 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
2a9d0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
2a9e0 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a   inserted.    **
2a9f0 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
2aa00 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
2aa10 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  dy present, cont
2aa20 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20  rol skips the.  
2aa30 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64    ** Gosub opcod
2aa40 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61  e and jumps stra
2aa50 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65  ight to the code
2aa60 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68   generated by Wh
2aa70 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a  ereEnd()..    **
2aa80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
2aa90 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2aaa0 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20  (<term>).    ** 
2aab0 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54           RowSetT
2aac0 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
2aad0 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f       # Insert ro
2aae0 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a  wid into rowset.
2aaf0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
2ab00 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20  Gosub      2 A. 
2ab10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
2ab20 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20  ite3WhereEnd(). 
2ab30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c     **.    ** Fol
2ab40 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65  lowing the above
2ab50 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e  , code to termin
2ab60 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61  ate the loop. La
2ab70 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65  bel A, the targe
2ab80 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
2ab90 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d  Gosub above, jum
2aba0 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  ps to the instru
2abb0 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65  ction right afte
2abc0 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20  r the Goto..    
2abd0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
2abe0 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
2ac00 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
2ac10 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
2ac20 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20            Goto  
2ac30 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20       B          
2ac40 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70        # The loop
2ac50 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20   is finished..  
2ac60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
2ac70 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e    A: <loop body>
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac90 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20   # Return data, 
2aca0 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a  whatever..    **
2acb0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
2acc0 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20   Return     2   
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a               # J
2ace0 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
2acf0 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20  Gosub.    **.   
2ad00 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66   **       B: <af
2ad10 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20  ter the loop>.  
2ad20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
2ad30 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
2ad40 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
2ad50 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
2ad60 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
2ad70 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
2ad80 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f  *pOrTab;       /
2ad90 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c  * Shortened tabl
2ada0 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61  e list or OR-cla
2adb0 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  use generation *
2adc0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
2add0 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
2ade0 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20     /* Potential 
2adf0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28  covering index (
2ae00 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20  or NULL) */.    
2ae10 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50  int iCovCur = pP
2ae20 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f  arse->nTab++;  /
2ae30 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f  * Cursor used fo
2ae40 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69  r index scans (i
2ae50 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69  f any) */..    i
2ae60 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  nt regReturn = +
2ae70 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
2ae80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
2ae90 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f  ster used with O
2aea0 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69  P_Gosub */.    i
2aeb0 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30  nt regRowset = 0
2aec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aed0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
2aee0 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20  ster for RowSet 
2aef0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
2af00 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20  t regRowid = 0; 
2af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
2af30 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69  ter holding rowi
2af40 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f  d */.    int iLo
2af50 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  opBody = sqlite3
2af60 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2af70 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c  ;  /* Start of l
2af80 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
2af90 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20  int iRetInit;   
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2afc0 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72  ress of regRetur
2afd0 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e  n init */.    in
2afe0 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  t untestedTerms 
2aff0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b000 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e   /* Some terms n
2b010 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65  ot completely te
2b020 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sted */.    int 
2b030 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b050 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2b060 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64  /.    Expr *pAnd
2b070 45 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Expr = 0;       
2b080 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22           /* An "
2b090 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78  .. AND (...)" ex
2b0a0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a  pression */.   .
2b0b0 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76      pTerm = pLev
2b0c0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d  el->plan.u.pTerm
2b0d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
2b0e0 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
2b0f0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
2b100 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29  erator & WO_OR )
2b110 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
2b120 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
2b130 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20  TERM_ORINFO)!=0 
2b140 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26  );.    pOrWc = &
2b150 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2b160 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ->wc;.    pLevel
2b170 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e  ->op = OP_Return
2b180 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
2b190 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20   = regReturn;.. 
2b1a0 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e     /* Set up a n
2b1b0 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f  ew SrcList in pO
2b1c0 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rTab containing 
2b1d0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
2b1e0 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62  scanned.    ** b
2b1f0 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74  y this loop in t
2b200 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64  he a[0] slot and
2b210 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61   all notReady ta
2b220 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73  bles in a[1..] s
2b230 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69  lots..    ** Thi
2b240 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72  s becomes the Sr
2b250 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63  cList in the rec
2b260 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73  ursive call to s
2b270 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2b280 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ()..    */.    i
2b290 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
2b2a0 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l>1 ){.      int
2b2b0 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20   nNotReady;     
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b2d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74  he number of not
2b2e0 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a  Ready tables */.
2b2f0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
2b300 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53  List_item *origS
2b310 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  rc;     /* Origi
2b320 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  nal list of tabl
2b330 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74  es */.      nNot
2b340 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  Ready = pWInfo->
2b350 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20  nLevel - iLevel 
2b360 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  - 1;.      pOrTa
2b370 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  b = sqlite3Stack
2b380 41 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d  AllocRaw(pParse-
2b390 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3b0 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29   sizeof(*pOrTab)
2b3c0 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65  + nNotReady*size
2b3d0 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29  of(pOrTab->a[0])
2b3e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
2b3f0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
2b400 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20  notReady;.      
2b410 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d  pOrTab->nAlloc =
2b420 20 28 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79   (i16)(nNotReady
2b430 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72   + 1);.      pOr
2b440 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54  Tab->nSrc = pOrT
2b450 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20  ab->nAlloc;.    
2b460 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d    memcpy(pOrTab-
2b470 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69  >a, pTabItem, si
2b480 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29  zeof(*pTabItem))
2b490 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63 20  ;.      origSrc 
2b4a0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2b4b0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  st->a;.      for
2b4c0 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61  (k=1; k<=nNotRea
2b4d0 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  dy; k++){.      
2b4e0 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62    memcpy(&pOrTab
2b4f0 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63  ->a[k], &origSrc
2b500 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d  [pLevel[k].iFrom
2b510 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  ], sizeof(pOrTab
2b520 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[k]));.      
2b530 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2b540 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e     pOrTab = pWIn
2b550 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
2b560 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74    }..    /* Init
2b570 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65  ialize the rowse
2b580 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f  t register to co
2b590 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53  ntain NULL. An S
2b5a0 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20  QL NULL is .    
2b5b0 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
2b5c0 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74   an empty rowset
2b5d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b5e0 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  Also initialize 
2b5f0 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e  regReturn to con
2b600 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73  tain the address
2b610 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74   of the instruct
2b620 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65  ion .    ** imme
2b630 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
2b640 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20  g the OP_Return 
2b650 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
2b660 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a   the loop. This.
2b670 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
2b680 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63  ed in a few obsc
2b690 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  ure LEFT JOIN ca
2b6a0 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f  ses where contro
2b6b0 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f  l jumps.    ** o
2b6c0 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ver the top of t
2b6d0 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  he loop into the
2b6e0 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20   body of it. In 
2b6f0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20  this case the . 
2b700 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65     ** correct re
2b710 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65  sponse for the e
2b720 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20  nd-of-loop code 
2b730 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20  (the OP_Return) 
2b740 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61  is to .    ** fa
2b750 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
2b760 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2b770 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f  on, just as an O
2b780 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20  P_Next does if. 
2b790 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20     ** called on 
2b7a0 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
2b7b0 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a   cursor..    */.
2b7c0 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2b7d0 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
2b7e0 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
2b7f0 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74  .      regRowset
2b800 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2b810 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
2b820 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
2b830 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
2b840 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2b850 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f  P_Null, 0, regRo
2b860 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  wset);.    }.   
2b870 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69   iRetInit = sqli
2b880 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2b890 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2b8a0 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20  regReturn);..   
2b8b0 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69   /* If the origi
2b8c0 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  nal WHERE clause
2b8d0 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72   is z of the for
2b8e0 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52  m:  (x1 OR x2 OR
2b8f0 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20   ...) AND y.    
2b900 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72  ** Then for ever
2b910 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75  y term xN, evalu
2b920 61 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78  ate as the subex
2b930 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44  pression: xN AND
2b940 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77   z.    ** That w
2b950 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74  ay, terms in y t
2b960 68 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64  hat are factored
2b970 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e   into the disjun
2b980 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ction will.    *
2b990 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62  * be picked up b
2b9a0 79 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  y the recursive 
2b9b0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2b9c0 57 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c  WhereBegin() bel
2b9d0 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ow..    **.    *
2b9e0 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68  * Actually, each
2b9f0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
2ba00 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22  s converted to "
2ba10 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20  xN AND w" where 
2ba20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  w is.    ** the 
2ba30 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65  "interesting" te
2ba40 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73  rms of z - terms
2ba50 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72   that did not or
2ba60 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20  iginate in the. 
2ba70 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e     ** ON or USIN
2ba80 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  G clause of a LE
2ba90 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72  FT JOIN, and ter
2baa0 6d 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62  ms that are usab
2bab0 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e  le as .    ** in
2bac0 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
2bad0 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
2bae0 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
2baf0 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  iTerm;.      for
2bb00 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c  (iTerm=0; iTerm<
2bb10 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72  pWC->nTerm; iTer
2bb20 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  m++){.        Ex
2bb30 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d  pr *pExpr = pWC-
2bb40 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b  >a[iTerm].pExpr;
2bb50 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
2bb60 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2bb70 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
2bb80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2bb90 20 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b       if( pWC->a[
2bba0 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26  iTerm].wtFlags &
2bbb0 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
2bbc0 45 52 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f  ERM_ORINFO) ) co
2bbd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2bbe0 69 66 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72  if( (pWC->a[iTer
2bbf0 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m].eOperator & W
2bc00 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74  O_ALL)==0 ) cont
2bc10 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45  inue;.        pE
2bc20 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
2bc30 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
2bc40 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
2bc50 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73      pAndExpr = s
2bc60 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
2bc70 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78  arse->db, pAndEx
2bc80 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  pr, pExpr);.    
2bc90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41    }.      if( pA
2bca0 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ndExpr ){.      
2bcb0 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
2bcc0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2bcd0 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e  , TK_AND, 0, pAn
2bce0 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  dExpr, 0);.     
2bcf0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
2bd00 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63  r(ii=0; ii<pOrWc
2bd10 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
2bd20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
2bd30 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57  *pOrTerm = &pOrW
2bd40 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20  c->a[ii];.      
2bd50 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
2bd60 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c  tCursor==iCur ||
2bd70 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
2bd80 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
2bd90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  0 ){.        Whe
2bda0 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66  reInfo *pSubWInf
2bdb0 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  o;          /* I
2bdc0 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f  nfo for single O
2bdd0 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20  R-term scan */. 
2bde0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72         Expr *pOr
2bdf0 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Expr = pOrTerm->
2be00 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
2be10 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20  f( pAndExpr ){. 
2be20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70           pAndExp
2be30 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78  r->pLeft = pOrEx
2be40 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  pr;.          pO
2be50 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72  rExpr = pAndExpr
2be60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2be70 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
2be80 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
2be90 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
2bea0 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
2beb0 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20        pSubWInfo 
2bec0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2bed0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54  gin(pParse, pOrT
2bee0 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20  ab, pOrExpr, 0, 
2bef0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2bf00 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
2bf10 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
2bf20 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   | WHERE_AND_ONL
2bf30 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y |.            
2bf40 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
2bf50 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20  E_FORCE_TABLE | 
2bf60 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
2bf70 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20  NLY, iCovCur);. 
2bf80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2bf90 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72  SubWInfo || pPar
2bfa0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
2bfb0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2bfc0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
2bfd0 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b  if( pSubWInfo ){
2bfe0 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
2bff0 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20  Level *pLvl;.   
2c000 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e         explainOn
2c010 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20  eScan(.         
2c020 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72       pParse, pOr
2c030 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d  Tab, &pSubWInfo-
2c040 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70  >a[0], iLevel, p
2c050 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a  Level->iFrom, 0.
2c060 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
2c070 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72         if( (wctr
2c080 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
2c090 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
2c0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c0b0 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d  int iSet = ((ii=
2c0c0 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29  =pOrWc->nTerm-1)
2c0d0 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20  ?-1:ii);.       
2c0e0 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20       int r;.    
2c0f0 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
2c100 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
2c110 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61  lumn(pParse, pTa
2c120 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c  bItem->pTab, -1,
2c130 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20   iCur, .        
2c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c160 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20   regRowid, 0);. 
2c170 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2c180 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2c190 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  v, OP_RowSetTest
2c1a0 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20  , regRowset,.   
2c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2c1d0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2c1e0 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53  Addr(v)+2, r, iS
2c1f0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  et);.          }
2c200 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2c210 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2c220 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74  OP_Gosub, regRet
2c230 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  urn, iLoopBody);
2c240 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
2c250 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  he pSubWInfo->un
2c260 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67  testedTerms flag
2c270 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
2c280 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20   OR term.       
2c290 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
2c2a0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20  one or more AND 
2c2b0 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52  term from a notR
2c2c0 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65  eady table.  The
2c2d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
2c2e0 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74  rms from the not
2c2f0 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c  Ready table coul
2c300 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  d not be tested 
2c310 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  and will.       
2c320 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65     ** need to be
2c330 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20   tested later.. 
2c340 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2c350 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
2c360 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
2c370 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72  ms ) untestedTer
2c380 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  ms = 1;..       
2c390 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20     /* If all of 
2c3a0 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  the OR-connected
2c3b0 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d   terms are optim
2c3c0 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ized using the s
2c3d0 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
2c3e0 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20   index, and the 
2c3f0 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20  index is opened 
2c400 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
2c410 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20  ursor number.   
2c420 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63         ** by eac
2c430 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
2c440 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61  3WhereBegin() ma
2c450 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c  de by this loop,
2c460 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20   it may.        
2c470 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
2c480 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64   to use that ind
2c490 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  ex as a covering
2c4a0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
2c4b0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
2c4c0 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  * If the call to
2c4d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2c4e0 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c  in() above resul
2c4f0 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68  ted in a scan th
2c500 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
2c510 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61  uses an index, a
2c520 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65  nd this is eithe
2c530 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63  r the first OR-c
2c540 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20  onnected term.  
2c550 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
2c560 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65  ssed or the inde
2c570 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  x is the same as
2c580 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c   that used by al
2c590 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  l previous.     
2c5a0 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73       ** terms, s
2c5b0 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63  et pCov to the c
2c5c0 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
2c5d0 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69  g index. Otherwi
2c5e0 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20  se, set .       
2c5f0 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55     ** pCov to NU
2c600 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  LL to indicate t
2c610 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65  hat no candidate
2c620 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
2c630 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20  will .          
2c640 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  ** be available.
2c650 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2c660 20 20 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26          pLvl = &
2c670 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 3b  pSubWInfo->a[0];
2c680 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2c690 70 4c 76 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  pLvl->plan.wsFla
2c6a0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
2c6b0 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)!=0.         
2c6c0 20 20 26 26 20 28 70 4c 76 6c 2d 3e 70 6c 61 6e    && (pLvl->plan
2c6d0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2c6e0 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 0a  _TEMP_INDEX)==0.
2c6f0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
2c700 69 3d 3d 30 20 7c 7c 20 70 4c 76 6c 2d 3e 70 6c  i==0 || pLvl->pl
2c710 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 43 6f 76 29  an.u.pIdx==pCov)
2c720 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
2c730 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c740 28 20 70 4c 76 6c 2d 3e 69 49 64 78 43 75 72 3d  ( pLvl->iIdxCur=
2c750 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20  =iCovCur );.    
2c760 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70          pCov = p
2c770 4c 76 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  Lvl->plan.u.pIdx
2c780 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2c790 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
2c7a0 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cov = 0;.       
2c7b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
2c7c0 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f  /* Finish the lo
2c7d0 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
2c7e0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
2c7f0 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
2c800 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
2c810 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2c820 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  SubWInfo);.     
2c830 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c840 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
2c850 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b  .pCovidx = pCov;
2c860 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20  .    if( pCov ) 
2c870 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
2c880 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69  = iCovCur;.    i
2c890 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20  f( pAndExpr ){. 
2c8a0 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70       pAndExpr->p
2c8b0 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Left = 0;.      
2c8c0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2c8d0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  e(pParse->db, pA
2c8e0 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  ndExpr);.    }. 
2c8f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2c900 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e  angeP1(v, iRetIn
2c910 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
2c920 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
2c930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c940 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
2c950 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
2c960 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
2c970 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2c980 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
2c990 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
2c9a0 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
2c9b0 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 70  lite3StackFree(p
2c9c0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61  Parse->db, pOrTa
2c9d0 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74  b);.    if( !unt
2c9e0 65 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73  estedTerms ) dis
2c9f0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
2ca00 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65   pTerm);.  }else
2ca10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2ca20 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
2ca30 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20  ZATION */..  {. 
2ca40 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
2ca50 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c  here is no usabl
2ca60 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73  e index.  We mus
2ca70 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a  t do a complete.
2ca80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
2ca90 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  scan of the enti
2caa0 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  re table..    */
2cab0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
2cac0 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b  t u8 aStep[] = {
2cad0 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65   OP_Next, OP_Pre
2cae0 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20  v };.    static 
2caf0 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b  const u8 aStart[
2cb00 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c  ] = { OP_Rewind,
2cb10 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20   OP_Last };.    
2cb20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20  assert( bRev==0 
2cb30 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20  || bRev==1 );.  
2cb40 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
2cb50 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c  ble==0 );.    pL
2cb60 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70  evel->op = aStep
2cb70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76  [bRev];.    pLev
2cb80 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
2cb90 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
2cba0 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
2cbb0 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b  ddOp2(v, aStart[
2cbc0 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64  bRev], iCur, add
2cbd0 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65  rBrk);.    pLeve
2cbe0 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
2cbf0 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
2cc00 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e  AN_STEP;.  }.  n
2cc10 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
2cc20 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
2cc30 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20  t, iCur);..  /* 
2cc40 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
2cc50 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70  est every subexp
2cc60 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e  ression that can
2cc70 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20   be completely. 
2cc80 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69   ** computed usi
2cc90 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
2cca0 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20  et of tables..  
2ccb0 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
2ccc0 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35  TATION-OF: R-495
2ccd0 32 35 2d 35 30 39 33 35 20 54 65 72 6d 73 20 74  25-50935 Terms t
2cce0 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61  hat cannot be sa
2ccf0 74 69 73 66 69 65 64 20 74 68 72 6f 75 67 68 0a  tisfied through.
2cd00 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20    ** the use of 
2cd10 69 6e 64 69 63 65 73 20 62 65 63 6f 6d 65 20 74  indices become t
2cd20 65 73 74 73 20 74 68 61 74 20 61 72 65 20 65 76  ests that are ev
2cd30 61 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74 20  aluated against 
2cd40 65 61 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a  each row of.  **
2cd50 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 69 6e   the relevant in
2cd60 70 75 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  put tables..  */
2cd70 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
2cd80 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72  ->a, j=pWC->nTer
2cd90 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
2cda0 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
2cdb0 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73  *pE;.    testcas
2cdc0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
2cdd0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
2cde0 20 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30   ); /* IMP: R-30
2cdf0 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
2ce00 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
2ce10 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
2ce20 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66  _CODED );.    if
2ce30 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
2ce40 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
2ce50 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
2ce60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2ce70 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
2ce80 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ll & notReady)!=
2ce90 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
2cea0 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ase( pWInfo->unt
2ceb0 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20  estedTerms==0.  
2cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2ced0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2cee0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
2cef0 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b  ABLE_ONLY)!=0 );
2cf00 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75  .      pWInfo->u
2cf10 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
2cf20 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
2cf30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d  ;.    }.    pE =
2cf40 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
2cf50 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
2cf60 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
2cf70 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26  el->iLeftJoin &&
2cf80 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2cf90 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
2cfa0 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  n) ){.      cont
2cfb0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
2cfc0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2cfd0 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61  se(pParse, pE, a
2cfe0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
2cff0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
2d000 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
2d010 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
2d020 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c   }..  /* For a L
2d030 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
2d040 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
2d050 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74  at will record t
2d060 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a  he fact that.  *
2d070 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  * at least one r
2d080 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ow of the right 
2d090 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65  table has matche
2d0a0 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  d the left table
2d0b0 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  .  .  */.  if( p
2d0c0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
2d0d0 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
2d0e0 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
2d0f0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2d100 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
2d110 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2d120 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
2d130 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
2d140 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
2d150 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c  nt((v, "record L
2d160 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b  EFT JOIN hit"));
2d170 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2d180 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2d190 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  e);.    for(pTer
2d1a0 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a  m=pWC->a, j=0; j
2d1b0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  <pWC->nTerm; j++
2d1c0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
2d1d0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
2d1e0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
2d1f0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a  M_VIRTUAL );  /*
2d200 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31   IMP: R-30575-11
2d210 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  662 */.      tes
2d220 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
2d230 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
2d240 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ED );.      if( 
2d250 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
2d260 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
2d270 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
2d280 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
2d290 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
2d2a0 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ll & notReady)!=
2d2b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
2d2c0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ert( pWInfo->unt
2d2d0 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20  estedTerms );.  
2d2e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2d2f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2d300 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
2d310 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pr );.      sqli
2d320 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
2d330 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Parse, pTerm->pE
2d340 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53  xpr, addrCont, S
2d350 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
2d360 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  );.      pTerm->
2d370 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
2d380 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  CODED;.    }.  }
2d390 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
2d3a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2d3b0 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a   iReleaseReg);..
2d3c0 20 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64    return notRead
2d3d0 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  y;.}..#if define
2d3e0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
2d3f0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2d400 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64  ng variable hold
2d410 73 20 61 20 74 65 78 74 20 64 65 73 63 72 69 70  s a text descrip
2d420 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c  tion of query pl
2d430 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  an generated.** 
2d440 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  by the most rece
2d450 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  nt call to sqlit
2d460 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20  e3WhereBegin(). 
2d470 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68   Each call to Wh
2d480 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72  ereBegin.** over
2d490 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69  writes the previ
2d4a0 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ous.  This infor
2d4b0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
2d4c0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a  or testing and.*
2d4d0 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  * analysis only.
2d4e0 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
2d4f0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a  _query_plan[BMS*
2d500 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20  2*40];  /* Text 
2d510 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73  of the join */.s
2d520 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e  tatic int nQPlan
2d530 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d540 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20     /* Next free 
2d550 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70  slow in _query_p
2d560 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66  lan[] */..#endif
2d570 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
2d580 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  */.../*.** Free 
2d590 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
2d5a0 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
2d5b0 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
2d5c0 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
2d5d0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2d5e0 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  o){.  if( ALWAYS
2d5f0 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
2d600 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
2d610 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  =0; i<pWInfo->nL
2d620 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  evel; i++){.    
2d630 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
2d640 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57  info *pInfo = pW
2d650 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49  Info->a[i].pIdxI
2d660 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nfo;.      if( p
2d670 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
2d680 2f 2a 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f  /* assert( pInfo
2d690 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2d6a0 74 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  tr==0 || db->mal
2d6b0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a  locFailed ); */.
2d6c0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 66          if( pInf
2d6d0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2d6e0 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Str ){.         
2d6f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
2d700 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
2d710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d720 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2d730 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , pInfo);.      
2d740 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  }.      if( pWIn
2d750 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73  fo->a[i].plan.ws
2d760 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
2d770 4d 50 5f 49 4e 44 45 58 20 29 7b 0a 20 20 20 20  MP_INDEX ){.    
2d780 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
2d790 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  = pWInfo->a[i].p
2d7a0 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
2d7b0 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
2d7c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d7d0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
2d7e0 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
2d7f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2d800 72 65 65 28 64 62 2c 20 70 49 64 78 29 3b 0a 20  ree(db, pIdx);. 
2d810 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d820 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65  .    }.    where
2d830 43 6c 61 75 73 65 43 6c 65 61 72 28 70 57 49 6e  ClauseClear(pWIn
2d840 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20 20 73 71  fo->pWC);.    sq
2d850 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2d860 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
2d870 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2d880 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2d890 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66   the loop used f
2d8a0 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  or WHERE clause 
2d8b0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54  processing..** T
2d8c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2d8d0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2d8e0 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74  an opaque struct
2d8f0 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ure that contain
2d900 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  s.** information
2d910 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69   needed to termi
2d920 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20  nate the loop.  
2d930 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69  Later, the calli
2d940 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68  ng routine.** sh
2d950 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
2d960 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69  te3WhereEnd() wi
2d970 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  th the return va
2d980 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
2d990 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  tion.** in order
2d9a0 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
2d9b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
2d9c0 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
2d9d0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2d9e0 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  rs, this routine
2d9f0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a   returns NULL..*
2da00 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69  *.** The basic i
2da10 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e  dea is to do a n
2da20 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20  ested loop, one 
2da30 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61  loop for each ta
2da40 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52  ble in.** the FR
2da50 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73  OM clause of a s
2da60 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20  elect.  (INSERT 
2da70 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65  and UPDATE state
2da80 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a  ments are the.**
2da90 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43   same as a SELEC
2daa0 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69  T with only a si
2dab0 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
2dac0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20  e FROM clause.) 
2dad0 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
2dae0 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74   if the SQL is t
2daf0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
2db00 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2db10 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20  1, t2, t3 WHERE 
2db20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...;.**.** Then 
2db30 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
2db40 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c  ed is conceptual
2db50 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c  ly like the foll
2db60 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
2db70 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
2db80 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20  n t1 do       \ 
2db90 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
2dba0 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65  d.**        fore
2dbb0 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
2dbc0 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71  o      |-- by sq
2dbd0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2dbe0 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  ).**          fo
2dbf0 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33  reach row3 in t3
2dc00 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20   do   /.**      
2dc10 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
2dc20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20                \ 
2dc40 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
2dc50 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20  d.**        end 
2dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc70 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71         |-- by sq
2dc80 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
2dc90 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20  **      end     
2dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcb0 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65      /.**.** Note
2dcc0 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20   that the loops 
2dcd0 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73  might not be nes
2dce0 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  ted in the order
2dcf0 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a   in which they.*
2dd00 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  * appear in the 
2dd10 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61  FROM clause if a
2dd20 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
2dd30 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20   is better able 
2dd40 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f  to make.** use o
2dd50 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65  f indices.  Note
2dd60 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20   also that when 
2dd70 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
2dd80 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68  appears in.** th
2dd90 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
2dda0 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  it might result 
2ddb0 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65  in additional ne
2ddc0 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a  sted loops for.*
2ddd0 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  * scanning throu
2dde0 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e  gh all values on
2ddf0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
2de00 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a  side of the IN..
2de10 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
2de20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73  Btree cursors as
2de30 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
2de40 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73  ch table.  t1 us
2de50 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  es cursor.** num
2de60 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ber pTabList->a[
2de70 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20  0].iCursor.  t2 
2de80 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  uses the cursor 
2de90 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69  pTabList->a[1].i
2dea0 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73  Cursor..** And s
2deb0 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72  o forth.  This r
2dec0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
2ded0 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68   code to open th
2dee0 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73  ose VDBE cursors
2def0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57  .** and sqlite3W
2df00 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61  hereEnd() genera
2df10 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
2df20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  close them..**.*
2df30 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20  * The code that 
2df40 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2df50 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65  n() generates le
2df60 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73  aves the cursors
2df70 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61   named.** in pTa
2df80 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61  bList pointing a
2df90 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69  t their appropri
2dfa0 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68  ate entries.  Th
2dfb0 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20  e [...] code.** 
2dfc0 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d  can use OP_Colum
2dfd0 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f  n and OP_Rowid o
2dfe0 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20  pcodes on these 
2dff0 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61  cursors to extra
2e000 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  ct.** data from 
2e010 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c  the various tabl
2e020 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  es of the loop..
2e030 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  **.** If the WHE
2e040 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70  RE clause is emp
2e050 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20  ty, the foreach 
2e060 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20  loops must each 
2e070 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e  scan their.** en
2e080 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68  tire tables.  Th
2e090 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  us a three-way j
2e0a0 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29  oin is an O(N^3)
2e0b0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
2e0c0 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
2e0d0 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61  s have indices a
2e0e0 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72  nd there are ter
2e0f0 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
2e100 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72  clause that.** r
2e110 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e  efer to those in
2e120 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74  dices, a complet
2e130 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e  e table scan can
2e140 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20   be avoided and 
2e150 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c  the.** code will
2e160 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72   run much faster
2e170 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77  .  Most of the w
2e180 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ork of this rout
2e190 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a  ine is checking.
2e1a0 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ** to see if the
2e1b0 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74  re are indices t
2e1c0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
2e1d0 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20  to speed up the 
2e1e0 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  loop..**.** Term
2e1f0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2e200 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75  lause are also u
2e210 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69  sed to limit whi
2e220 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79  ch rows actually
2e230 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74  .** make it to t
2e240 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20  he "..." in the 
2e250 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f  middle of the lo
2e260 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  op.  After each 
2e270 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65  "foreach",.** te
2e280 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
2e290 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65   clause that use
2e2a0 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74   only terms in t
2e2b0 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74  hat loop and out
2e2c0 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20  er.** loops are 
2e2d0 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66  evaluated and if
2e2e0 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73   false a jump is
2e2f0 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c   made around all
2e300 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69   subsequent.** i
2e310 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61  nner loops (or a
2e320 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20  round the "..." 
2e330 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75  if the test occu
2e340 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e  rs within the in
2e350 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f  ner-.** most loo
2e360 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a  p).**.** OUTER J
2e370 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75  OINS.**.** An ou
2e380 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c  ter join of tabl
2e390 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20  es t1 and t2 is 
2e3a0 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65  conceptally code
2e3b0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
2e3c0 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72  .**    foreach r
2e3d0 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20  ow1 in t1 do.** 
2e3e0 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a       flag = 0.**
2e3f0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
2e400 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20  w2 in t2 do.**  
2e410 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20        start:.** 
2e420 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
2e430 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20           flag = 
2e440 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a  1.**      end.**
2e450 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30        if flag==0
2e460 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
2e470 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75  move the row2 cu
2e480 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72  rsor to a null r
2e490 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74  ow.**        got
2e4a0 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20  o start.**      
2e4b0 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a  fi.**    end.**.
2e4c0 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55  ** ORDER BY CLAU
2e4d0 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a  SE PROCESSING.**
2e4e0 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20  .** pOrderBy is 
2e4f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2e500 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2e510 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
2e520 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68  tement,.** if th
2e530 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
2e540 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
2e550 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
2e560 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
2e570 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
2e580 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
2e590 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
2e5a0 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73  then pOrderBy is
2e5b0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
2e5c0 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  an index can be 
2e5d0 75 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  used so that the
2e5e0 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20   natural output 
2e5f0 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74 61 62  order of the tab
2e600 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f  le.** scan is co
2e610 72 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52  rrect for the OR
2e620 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2e630 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69  hen that index i
2e640 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 74 68  s used and.** th
2e650 65 20 72 65 74 75 72 6e 65 64 20 57 68 65 72 65  e returned Where
2e660 49 6e 66 6f 2e 6e 4f 42 53 61 74 20 66 69 65 6c  Info.nOBSat fiel
2e670 64 20 69 73 20 73 65 74 20 74 6f 20 70 4f 72 64  d is set to pOrd
2e680 65 72 42 79 2d 3e 6e 45 78 70 72 2e 20 20 54 68  erBy->nExpr.  Th
2e690 69 73 0a 2a 2a 20 69 73 20 61 6e 20 6f 70 74 69  is.** is an opti
2e6a0 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72  mization that pr
2e6b0 65 76 65 6e 74 73 20 61 6e 20 75 6e 6e 65 63 65  events an unnece
2e6c0 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68  ssary sort of th
2e6d0 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  e result set.** 
2e6e0 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72  if an index appr
2e6f0 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
2e700 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2e710 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a  already exists..
2e720 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65  **.** If the whe
2e730 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20  re clause loops 
2e740 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67  cannot be arrang
2e750 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
2e760 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74  e correct.** out
2e770 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20  put order, then 
2e780 57 68 65 72 65 49 6e 66 6f 2e 6e 4f 42 53 61 74  WhereInfo.nOBSat
2e790 20 69 73 20 30 2e 0a 2a 2f 0a 57 68 65 72 65 49   is 0..*/.WhereI
2e7a0 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72  nfo *sqlite3Wher
2e7b0 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20  eBegin(.  Parse 
2e7c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2e7d0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2e7e0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
2e7f0 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
2e800 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
2e810 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
2e820 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
2e830 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
2e840 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2e850 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
2e860 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
2e870 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
2e880 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
2e890 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2e8a0 44 69 73 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68  Distinct,  /* Th
2e8b0 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f  e select-list fo
2e8c0 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 69  r DISTINCT queri
2e8d0 65 73 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  es - or NULL */.
2e8e0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
2e8f0 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ,       /* One o
2e900 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
2e910 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
2e920 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
2e930 69 6e 74 20 69 49 64 78 43 75 72 20 20 20 20 20  int iIdxCur     
2e940 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52        /* If WHER
2e950 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
2e960 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75  is set, index cu
2e970 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  rsor number */.)
2e980 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e  {.  int nByteWIn
2e990 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
2e9a0 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c  * Num. bytes all
2e9b0 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65  ocated for Where
2e9c0 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20  Info struct */. 
2e9d0 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20   int nTabList;  
2e9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e9f0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
2ea00 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f  s in pTabList */
2ea10 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2ea20 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Info;         /*
2ea30 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   Will become the
2ea40 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
2ea50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
2ea60 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
2ea70 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f  arse->pVdbe;   /
2ea80 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61  * The virtual da
2ea90 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f  tabase engine */
2eaa0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
2eab0 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ady;          /*
2eac0 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   Cursors that ar
2ead0 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69  e not yet positi
2eae0 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 42  oned */.  WhereB
2eaf0 65 73 74 49 64 78 20 73 57 42 49 3b 20 20 20 20  estIdx sWBI;    
2eb00 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
2eb10 65 78 20 73 65 61 72 63 68 20 63 6f 6e 74 65 78  ex search contex
2eb20 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  t */.  WhereMask
2eb30 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
2eb40 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
2eb50 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a  ion mask set */.
2eb60 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
2eb70 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  evel;        /* 
2eb80 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69  A single level i
2eb90 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f  n pWInfo->a[] */
2eba0 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20  .  int iFrom;   
2ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ebc0 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 46 52   First unused FR
2ebd0 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
2ebe0 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c  t */.  int andFl
2ebf0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
2ec00 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62    /* AND-ed comb
2ec10 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70  ination of all p
2ec20 57 43 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20  WC->a[].wtFlags 
2ec30 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
2ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec50 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2ec60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2ec70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ec80 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
2ec90 65 63 74 69 6f 6e 20 2a 2f 0a 0a 0a 20 20 2f 2a  ection */...  /*
2eca0 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61   Variable initia
2ecb0 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 6d 65  lization */.  me
2ecc0 6d 73 65 74 28 26 73 57 42 49 2c 20 30 2c 20 73  mset(&sWBI, 0, s
2ecd0 69 7a 65 6f 66 28 73 57 42 49 29 29 3b 0a 20 20  izeof(sWBI));.  
2ece0 73 57 42 49 2e 70 50 61 72 73 65 20 3d 20 70 50  sWBI.pParse = pP
2ecf0 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  arse;..  /* The 
2ed00 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
2ed10 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2ed20 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
2ed30 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
2ed40 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
2ed50 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
2ed60 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
2ed70 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
2ed80 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
2ed90 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
2eda0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2edb0 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
2edc0 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
2edd0 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
2ede0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
2edf0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
2ee00 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
2ee10 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
2ee20 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
2ee30 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
2ee40 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
2ee50 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  e WHERE_ONETABLE
2ee60 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
2ee70 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
2ee80 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
2ee90 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
2eea0 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
2eeb0 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
2eec0 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
2eed0 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
2eee0 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
2eef0 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
2ef00 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
2ef10 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
2ef20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
2ef30 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
2ef40 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c  NLY) ? 1 : pTabL
2ef50 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a  ist->nSrc;..  /*
2ef60 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
2ef70 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
2ef80 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
2ef90 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
2efa0 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
2efb0 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c  n value. A singl
2efc0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
2efd0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
2efe0 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a  e WhereInfo.  **
2eff0 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e   struct, the con
2f000 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e  tents of WhereIn
2f010 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72  fo.a[], the Wher
2f020 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
2f030 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57  e.  ** and the W
2f040 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
2f050 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65  cture. Since Whe
2f060 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  reClause contain
2f070 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a  s an 8-byte.  **
2f080 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74   field (type Bit
2f090 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65  mask) it must be
2f0a0 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38   aligned on an 8
2f0b0 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f  -byte boundary o
2f0c0 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68  n.  ** some arch
2f0d0 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65  itectures. Hence
2f0e0 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65   the ROUND8() be
2f0f0 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d  low..  */.  db =
2f100 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
2f110 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e  ByteWInfo = ROUN
2f120 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49  D8(sizeof(WhereI
2f130 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31  nfo)+(nTabList-1
2f140 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  )*sizeof(WhereLe
2f150 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20  vel));.  pWInfo 
2f160 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2f170 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20  cZero(db, .     
2f180 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20   nByteWInfo + . 
2f190 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72       sizeof(Wher
2f1a0 65 43 6c 61 75 73 65 29 20 2b 0a 20 20 20 20 20  eClause) +.     
2f1b0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4d 61 73   sizeof(WhereMas
2f1c0 6b 53 65 74 29 0a 20 20 29 3b 0a 20 20 69 66 28  kSet).  );.  if(
2f1d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2f1e0 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
2f1f0 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
2f200 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  o);.    pWInfo =
2f210 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   0;.    goto whe
2f220 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
2f230 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  }.  pWInfo->nLev
2f240 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20  el = nTabList;. 
2f250 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
2f260 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
2f270 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
2f280 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
2f290 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69  o->iBreak = sqli
2f2a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2f2b0 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  (v);.  pWInfo->p
2f2c0 57 43 20 3d 20 73 57 42 49 2e 70 57 43 20 3d 20  WC = sWBI.pWC = 
2f2d0 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 29 26  (WhereClause *)&
2f2e0 28 28 75 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e  ((u8 *)pWInfo)[n
2f2f0 42 79 74 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57  ByteWInfo];.  pW
2f300 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2f310 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20   = wctrlFlags;. 
2f320 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
2f330 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
2f340 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
2f350 20 70 4d 61 73 6b 53 65 74 20 3d 20 28 57 68 65   pMaskSet = (Whe
2f360 72 65 4d 61 73 6b 53 65 74 2a 29 26 73 57 42 49  reMaskSet*)&sWBI
2f370 2e 70 57 43 5b 31 5d 3b 0a 20 20 73 57 42 49 2e  .pWC[1];.  sWBI.
2f380 61 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  aLevel = pWInfo-
2f390 3e 61 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c  >a;..  /* Disabl
2f3a0 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f  e the DISTINCT o
2f3b0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53  ptimization if S
2f3c0 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
2f3d0 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a  t is set via.  *
2f3e0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
2f3f0 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  trl(SQLITE_TESTC
2f400 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
2f410 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20  S,...) */.  if( 
2f420 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
2f430 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2f440 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 20 70  DistinctOpt) ) p
2f450 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 0a 20  Distinct = 0;.. 
2f460 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48   /* Split the WH
2f470 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ERE clause into 
2f480 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72  separate subexpr
2f490 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61  essions where ea
2f4a0 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65  ch.  ** subexpre
2f4b0 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
2f4c0 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  ed by an AND ope
2f4d0 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e  rator..  */.  in
2f4e0 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53  itMaskSet(pMaskS
2f4f0 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  et);.  whereClau
2f500 73 65 49 6e 69 74 28 73 57 42 49 2e 70 57 43 2c  seInit(sWBI.pWC,
2f510 20 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65   pParse, pMaskSe
2f520 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  t, wctrlFlags);.
2f530 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2f540 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73  eConstants(pPars
2f550 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68  e, pWhere);.  wh
2f560 65 72 65 53 70 6c 69 74 28 73 57 42 49 2e 70 57  ereSplit(sWBI.pW
2f570 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  C, pWhere, TK_AN
2f580 44 29 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  D);   /* IMP: R-
2f590 31 35 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20  15842-53296 */. 
2f5a0 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c     .  /* Special
2f5b0 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63   case: a WHERE c
2f5c0 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f  lause that is co
2f5d0 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74  nstant.  Evaluat
2f5e0 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65  e the.  ** expre
2f5f0 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72  ssion and either
2f600 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f   jump over all o
2f610 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61  f the code or fa
2f620 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20  ll thru..  */.  
2f630 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28 6e  if( pWhere && (n
2f640 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71  TabList==0 || sq
2f650 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
2f660 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72  antNotJoin(pWher
2f670 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e)) ){.    sqlit
2f680 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
2f690 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57  arse, pWhere, pW
2f6a0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51  Info->iBreak, SQ
2f6b0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2f6c0 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  ;.    pWhere = 0
2f6d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69  ;.  }..  /* Assi
2f6e0 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68  gn a bit from th
2f6f0 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65  e bitmask to eve
2f700 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ry term in the F
2f710 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
2f720 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67  .  ** When assig
2f730 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c  ning bitmask val
2f740 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75  ues to FROM clau
2f750 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d  se cursors, it m
2f760 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20  ust be.  ** the 
2f770 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69  case that if X i
2f780 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
2f790 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20  r the N-th FROM 
2f7a0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e  clause term then
2f7b0 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  .  ** the bitmas
2f7c0 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63  k for all FROM c
2f7d0 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74  lause terms to t
2f7e0 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e  he left of the N
2f7f0 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73  -th term.  ** is
2f800 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70   (X-1).   An exp
2f810 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
2f820 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
2f830 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73  LEFT JOIN can us
2f840 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e  e.  ** its Expr.
2f850 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2f860 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68  value to find th
2f870 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65  e bitmask of the
2f880 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a   right table.  *
2f890 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
2f8a0 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20  Subtracting one 
2f8b0 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74  from the right t
2f8c0 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76  able bitmask giv
2f8d0 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73  es a.  ** bitmas
2f8e0 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
2f8f0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2f900 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69  the join.  Knowi
2f910 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  ng the bitmask. 
2f920 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c   ** for all tabl
2f930 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
2f940 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73  f a left join is
2f950 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
2f960 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a  ket #3015..  **.
2f970 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
2f980 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
2f990 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
2f9a0 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
2f9b0 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69  s in.  ** pTabLi
2f9c0 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65  st, not just the
2f9d0 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20   first nTabList 
2f9e0 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73  tables.  nTabLis
2f9f0 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20  t is normally.  
2fa00 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62  ** equal to pTab
2fa10 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d  List->nSrc but m
2fa20 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65  ight be shortene
2fa30 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20  d to 1 if the.  
2fa40 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  ** WHERE_ONETABL
2fa50 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73  E_ONLY flag is s
2fa60 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  et..  */.  for(i
2fa70 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
2fa80 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
2fa90 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d     createMask(pM
2faa0 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
2fab0 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
2fac0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
2fad0 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74  EBUG.  {.    Bit
2fae0 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d  mask toTheLeft =
2faf0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
2fb00 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ; ii<pTabList->n
2fb10 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Src; ii++){.    
2fb20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65    Bitmask m = ge
2fb30 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
2fb40 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
2fb50 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2fb60 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74  assert( (m-1)==t
2fb70 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20  oTheLeft );.    
2fb80 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d    toTheLeft |= m
2fb90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2fba0 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
2fbb0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
2fbc0 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
2fbd0 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
2fbe0 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
2fbf0 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
2fc00 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
2fc10 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
2fc20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
2fc30 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
2fc40 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
2fc50 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
2fc60 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
2fc70 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
2fc80 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
2fc90 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
2fca0 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
2fcb0 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
2fcc0 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70  ssed..  */.  exp
2fcd0 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
2fce0 4c 69 73 74 2c 20 73 57 42 49 2e 70 57 43 29 3b  List, sWBI.pWC);
2fcf0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2fd00 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
2fd10 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2fd20 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ror;.  }..  /* C
2fd30 68 65 63 6b 20 69 66 20 74 68 65 20 44 49 53 54  heck if the DIST
2fd40 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 2c 20  INCT qualifier, 
2fd50 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2c  if there is one,
2fd60 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 0a   is redundant. .
2fd70 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74    ** If it is, t
2fd80 68 65 6e 20 73 65 74 20 70 44 69 73 74 69 6e 63  hen set pDistinc
2fd90 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 57 68  t to NULL and Wh
2fda0 65 72 65 49 6e 66 6f 2e 65 44 69 73 74 69 6e 63  ereInfo.eDistinc
2fdb0 74 20 74 6f 0a 20 20 2a 2a 20 57 48 45 52 45 5f  t to.  ** WHERE_
2fdc0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20  DISTINCT_UNIQUE 
2fdd0 74 6f 20 74 65 6c 6c 20 74 68 65 20 63 61 6c 6c  to tell the call
2fde0 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  er to ignore the
2fdf0 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a   DISTINCT..  */.
2fe00 20 20 69 66 28 20 70 44 69 73 74 69 6e 63 74 20    if( pDistinct 
2fe10 26 26 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  && isDistinctRed
2fe20 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70  undant(pParse, p
2fe30 54 61 62 4c 69 73 74 2c 20 73 57 42 49 2e 70 57  TabList, sWBI.pW
2fe40 43 2c 20 70 44 69 73 74 69 6e 63 74 29 20 29 7b  C, pDistinct) ){
2fe50 0a 20 20 20 20 70 44 69 73 74 69 6e 63 74 20 3d  .    pDistinct =
2fe60 20 30 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   0;.    pWInfo->
2fe70 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
2fe80 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
2fe90 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f  E;.  }..  /* Cho
2fea0 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  se the best inde
2feb0 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63  x to use for eac
2fec0 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  h table in the F
2fed0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
2fee0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
2fef0 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c  fills in the fol
2ff00 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20  lowing fields:. 
2ff10 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66   **.  **   pWInf
2ff20 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20  o->a[].pIdx     
2ff30 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73   The index to us
2ff40 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c  e for this level
2ff50 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
2ff60 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
2ff70 2e 77 73 46 6c 61 67 73 20 20 20 57 48 45 52 45  .wsFlags   WHERE
2ff80 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63  _xxx flags assoc
2ff90 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 0a  iated with pIdx.
2ffa0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
2ffb0 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65  [].nEq       The
2ffc0 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e   number of == an
2ffd0 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
2ffe0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2fff0 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68  a[].iFrom     Wh
30000 69 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ich term of the 
30010 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62  FROM clause is b
30020 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20  eing coded.  ** 
30030 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54    pWInfo->a[].iT
30040 61 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45  abCur   The VDBE
30050 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
30060 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20  database table. 
30070 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
30080 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20  ].iIdxCur   The 
30090 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
300a0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 20  the index.  **  
300b0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65   pWInfo->a[].pTe
300c0 72 6d 20 20 20 20 20 57 68 65 6e 20 77 73 46 6c  rm     When wsFl
300d0 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65 20  ags==WO_OR, the 
300e0 4f 52 2d 63 6c 61 75 73 65 20 74 65 72 6d 0a 20  OR-clause term. 
300f0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
30100 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20  op also figures 
30110 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20  out the nesting 
30120 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20  order of tables 
30130 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a  in the FROM.  **
30140 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
30150 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 20 3d 20  sWBI.notValid = 
30160 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 73  ~(Bitmask)0;.  s
30170 57 42 49 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  WBI.pOrderBy = p
30180 4f 72 64 65 72 42 79 3b 0a 20 20 73 57 42 49 2e  OrderBy;.  sWBI.
30190 6e 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20  n = nTabList;.  
301a0 73 57 42 49 2e 70 44 69 73 74 69 6e 63 74 20 3d  sWBI.pDistinct =
301b0 20 70 44 69 73 74 69 6e 63 74 3b 0a 20 20 61 6e   pDistinct;.  an
301c0 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57  dFlags = ~0;.  W
301d0 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
301e0 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
301f0 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28  ***\n"));.  for(
30200 73 57 42 49 2e 69 3d 69 46 72 6f 6d 3d 30 2c 20  sWBI.i=iFrom=0, 
30210 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
30220 3b 20 73 57 42 49 2e 69 3c 6e 54 61 62 4c 69 73  ; sWBI.i<nTabLis
30230 74 3b 20 73 57 42 49 2e 69 2b 2b 2c 20 70 4c 65  t; sWBI.i++, pLe
30240 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  vel++){.    Wher
30250 65 43 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20  eCost bestPlan; 
30260 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20          /* Most 
30270 65 66 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73  efficient plan s
30280 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
30290 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
302a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
302b0 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20   Index for FROM 
302c0 74 61 62 6c 65 20 61 74 20 70 54 61 62 49 74 65  table at pTabIte
302d0 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20  m */.    int j; 
302e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302f0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
30300 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61  ing over FROM ta
30310 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  bles */.    int 
30320 62 65 73 74 4a 20 3d 20 2d 31 3b 20 20 20 20 20  bestJ = -1;     
30330 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
30340 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20  alue of j */.   
30350 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20   Bitmask m;     
30360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30370 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f  Bitmask value fo
30380 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a  r j or bestJ */.
30390 20 20 20 20 69 6e 74 20 69 73 4f 70 74 69 6d 61      int isOptima
303a0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
303b0 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
303c0 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69  optimal/non-opti
303d0 6d 61 6c 20 73 65 61 72 63 68 20 2a 2f 0a 20 20  mal search */.  
303e0 20 20 69 6e 74 20 63 6b 4f 70 74 69 6d 61 6c 3b    int ckOptimal;
303f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30400 20 44 6f 20 74 68 65 20 6f 70 74 69 6d 61 6c 20   Do the optimal 
30410 73 63 61 6e 20 63 68 65 63 6b 20 2a 2f 0a 20 20  scan check */.  
30420 20 20 69 6e 74 20 6e 55 6e 63 6f 6e 73 74 72 61    int nUnconstra
30430 69 6e 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  ined;         /*
30440 20 4e 75 6d 62 65 72 20 74 61 62 6c 65 73 20 77   Number tables w
30450 69 74 68 6f 75 74 20 49 4e 44 45 58 45 44 20 42  ithout INDEXED B
30460 59 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  Y */.    Bitmask
30470 20 6e 6f 74 49 6e 64 65 78 65 64 3b 20 20 20 20   notIndexed;    
30480 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
30490 74 61 62 6c 65 73 20 74 68 61 74 20 63 61 6e 6e  tables that cann
304a0 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20  ot use an index 
304b0 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  */..    memset(&
304c0 62 65 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a  bestPlan, 0, siz
304d0 65 6f 66 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a  eof(bestPlan));.
304e0 20 20 20 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f      bestPlan.rCo
304f0 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
30500 44 42 4c 3b 0a 20 20 20 20 57 48 45 52 45 54 52  DBL;.    WHERETR
30510 41 43 45 28 28 22 2a 2a 2a 20 42 65 67 69 6e 20  ACE(("*** Begin 
30520 73 65 61 72 63 68 20 66 6f 72 20 6c 6f 6f 70 20  search for loop 
30530 25 64 20 2a 2a 2a 5c 6e 22 2c 20 73 57 42 49 2e  %d ***\n", sWBI.
30540 69 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f  i));..    /* Loo
30550 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65  p through the re
30560 6d 61 69 6e 69 6e 67 20 65 6e 74 72 69 65 73 20  maining entries 
30570 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
30580 73 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 20  se to find the. 
30590 20 20 20 2a 2a 20 6e 65 78 74 20 6e 65 73 74 65     ** next neste
305a0 64 20 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f 6f 70  d loop. The loop
305b0 20 74 65 73 74 73 20 61 6c 6c 20 46 52 4f 4d 20   tests all FROM 
305c0 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 0a 20  clause entries. 
305d0 20 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e 63     ** either onc
305e0 65 20 6f 72 20 74 77 69 63 65 2e 20 0a 20 20 20  e or twice. .   
305f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
30600 69 72 73 74 20 74 65 73 74 20 69 73 20 61 6c 77  irst test is alw
30610 61 79 73 20 70 65 72 66 6f 72 6d 65 64 20 69 66  ays performed if
30620 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
30630 72 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 0a 20  r more entries. 
30640 20 20 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67 20     ** remaining 
30650 61 6e 64 20 6e 65 76 65 72 20 70 65 72 66 6f 72  and never perfor
30660 6d 65 64 20 69 66 20 74 68 65 72 65 20 69 73 20  med if there is 
30670 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d 20 63 6c  only one FROM cl
30680 61 75 73 65 20 65 6e 74 72 79 0a 20 20 20 20 2a  ause entry.    *
30690 2a 20 74 6f 20 63 68 6f 6f 73 65 20 66 72 6f 6d  * to choose from
306a0 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 65 73  .  The first tes
306b0 74 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e 20 22  t looks for an "
306c0 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e 20 20  optimal" scan.  
306d0 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63  In.    ** this c
306e0 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74 69 6d 61  ontext an optima
306f0 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65 20 74 68  l scan is one th
30700 61 74 20 75 73 65 73 20 74 68 65 20 73 61 6d 65  at uses the same
30710 20 73 74 72 61 74 65 67 79 0a 20 20 20 20 2a 2a   strategy.    **
30720 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 46   for the given F
30730 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ROM clause entry
30740 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6c   as would be sel
30750 65 63 74 65 64 20 69 66 20 74 68 65 20 65 6e 74  ected if the ent
30760 72 79 0a 20 20 20 20 2a 2a 20 77 65 72 65 20 75  ry.    ** were u
30770 73 65 64 20 61 73 20 74 68 65 20 69 6e 6e 65 72  sed as the inner
30780 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70  most nested loop
30790 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
307a0 73 2c 20 61 20 74 61 62 6c 65 0a 20 20 20 20 2a  s, a table.    *
307b0 2a 20 69 73 20 63 68 6f 73 65 6e 20 73 75 63 68  * is chosen such
307c0 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f   that the cost o
307d0 66 20 72 75 6e 6e 69 6e 67 20 74 68 61 74 20 74  f running that t
307e0 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  able cannot be r
307f0 65 64 75 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  educed.    ** by
30800 20 77 61 69 74 69 6e 67 20 66 6f 72 20 6f 74 68   waiting for oth
30810 65 72 20 74 61 62 6c 65 73 20 74 6f 20 72 75 6e  er tables to run
30820 20 66 69 72 73 74 2e 20 20 54 68 69 73 20 22 6f   first.  This "o
30830 70 74 69 6d 61 6c 22 20 74 65 73 74 20 77 6f 72  ptimal" test wor
30840 6b 73 0a 20 20 20 20 2a 2a 20 62 79 20 66 69 72  ks.    ** by fir
30850 73 74 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  st assuming that
30860 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
30870 20 69 73 20 6f 6e 20 74 68 65 20 69 6e 6e 65 72   is on the inner
30880 20 6c 6f 6f 70 20 61 6e 64 20 66 69 6e 64 69 6e   loop and findin
30890 67 0a 20 20 20 20 2a 2a 20 69 74 73 20 71 75 65  g.    ** its que
308a0 72 79 20 70 6c 61 6e 2c 20 74 68 65 6e 20 63 68  ry plan, then ch
308b0 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66  ecking to see if
308c0 20 74 68 61 74 20 71 75 65 72 79 20 70 6c 61 6e   that query plan
308d0 20 75 73 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a   uses any.    **
308e0 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
308f0 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  se terms that ar
30900 65 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 2e  e sWBI.notValid.
30910 20 20 49 66 20 6e 6f 20 6e 6f 74 56 61 6c 69 64    If no notValid
30920 20 74 65 72 6d 73 0a 20 20 20 20 2a 2a 20 61 72   terms.    ** ar
30930 65 20 75 73 65 64 20 74 68 65 6e 20 74 68 65 20  e used then the 
30940 22 6f 70 74 69 6d 61 6c 22 20 71 75 65 72 79 20  "optimal" query 
30950 70 6c 61 6e 20 77 6f 72 6b 73 2e 0a 20 20 20 20  plan works..    
30960 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
30970 68 61 74 20 74 68 65 20 57 68 65 72 65 43 6f 73  hat the WhereCos
30980 74 2e 6e 52 6f 77 20 70 61 72 61 6d 65 74 65 72  t.nRow parameter
30990 20 66 6f 72 20 61 6e 20 6f 70 74 69 6d 61 6c 20   for an optimal 
309a0 73 63 61 6e 20 6d 69 67 68 74 0a 20 20 20 20 2a  scan might.    *
309b0 2a 20 6e 6f 74 20 62 65 20 61 73 20 73 6d 61 6c  * not be as smal
309c0 6c 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65  l as it would be
309d0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 72 65   if the table re
309e0 61 6c 6c 79 20 77 65 72 65 20 74 68 65 20 69 6e  ally were the in
309f0 6e 65 72 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 6a  nermost.    ** j
30a00 6f 69 6e 2e 20 20 54 68 65 20 6e 52 6f 77 20 76  oin.  The nRow v
30a10 61 6c 75 65 20 63 61 6e 20 62 65 20 72 65 64 75  alue can be redu
30a20 63 65 64 20 62 79 20 57 48 45 52 45 20 63 6c 61  ced by WHERE cla
30a30 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
30a40 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e      ** that do n
30a50 6f 74 20 75 73 65 20 69 6e 64 69 63 65 73 2e 20  ot use indices. 
30a60 20 42 75 74 20 74 68 69 73 20 6e 52 6f 77 20 72   But this nRow r
30a70 65 64 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 68 61  eduction only ha
30a80 70 70 65 6e 73 20 69 66 20 74 68 65 0a 20 20 20  ppens if the.   
30a90 20 2a 2a 20 74 61 62 6c 65 20 72 65 61 6c 6c 79   ** table really
30aa0 20 69 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73   is the innermos
30ab0 74 20 6a 6f 69 6e 2e 20 20 0a 20 20 20 20 2a 2a  t join.  .    **
30ac0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
30ad0 6e 64 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f  nd loop iteratio
30ae0 6e 20 69 73 20 6f 6e 6c 79 20 70 65 72 66 6f 72  n is only perfor
30af0 6d 65 64 20 69 66 20 6e 6f 20 6f 70 74 69 6d 61  med if no optima
30b00 6c 20 73 63 61 6e 0a 20 20 20 20 2a 2a 20 73 74  l scan.    ** st
30b10 72 61 74 65 67 69 65 73 20 77 65 72 65 20 66 6f  rategies were fo
30b20 75 6e 64 20 62 79 20 74 68 65 20 66 69 72 73 74  und by the first
30b30 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   iteration. This
30b40 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
30b50 6e 0a 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64  n.    ** is used
30b60 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
30b70 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73  he lowest cost s
30b80 63 61 6e 20 6f 76 65 72 61 6c 6c 2e 0a 20 20 20  can overall..   
30b90 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 6f   **.    ** Witho
30ba0 75 74 20 74 68 65 20 6f 70 74 69 6d 61 6c 20 73  ut the optimal s
30bb0 63 61 6e 20 73 74 65 70 20 28 74 68 65 20 66 69  can step (the fi
30bc0 72 73 74 20 69 74 65 72 61 74 69 6f 6e 29 20 61  rst iteration) a
30bd0 20 73 75 62 6f 70 74 69 6d 61 6c 0a 20 20 20 20   suboptimal.    
30be0 2a 2a 20 70 6c 61 6e 20 6d 69 67 68 74 20 62 65  ** plan might be
30bf0 20 63 68 6f 73 65 6e 20 66 6f 72 20 71 75 65 72   chosen for quer
30c00 69 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  ies like this:. 
30c10 20 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a 20     **   .    ** 
30c20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
30c30 31 28 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a 2a  1(a, b); .    **
30c40 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
30c50 74 32 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a 2a  t2(c, d);.    **
30c60 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
30c70 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 32   t2, t1 WHERE t2
30c80 2e 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a 20  .rowid = t1.a;. 
30c90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
30ca0 20 62 65 73 74 20 73 74 72 61 74 65 67 79 20 69   best strategy i
30cb0 73 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  s to iterate thr
30cc0 6f 75 67 68 20 74 61 62 6c 65 20 74 31 20 66 69  ough table t1 fi
30cd0 72 73 74 2e 20 48 6f 77 65 76 65 72 20 69 74 0a  rst. However it.
30ce0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f      ** is not po
30cf0 73 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  ssible to determ
30d00 69 6e 65 20 74 68 69 73 20 77 69 74 68 20 61 20  ine this with a 
30d10 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20 61 6c  simple greedy al
30d20 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 20  gorithm..    ** 
30d30 53 69 6e 63 65 20 74 68 65 20 63 6f 73 74 20 6f  Since the cost o
30d40 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  f a linear scan 
30d50 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 32  through table t2
30d60 20 69 73 20 74 68 65 20 73 61 6d 65 20 0a 20 20   is the same .  
30d70 20 20 2a 2a 20 61 73 20 74 68 65 20 63 6f 73 74    ** as the cost
30d80 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61   of a linear sca
30d90 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  n through table 
30da0 74 31 2c 20 61 20 73 69 6d 70 6c 65 20 67 72 65  t1, a simple gre
30db0 65 64 79 20 0a 20 20 20 20 2a 2a 20 61 6c 67 6f  edy .    ** algo
30dc0 72 69 74 68 6d 20 6d 61 79 20 63 68 6f 6f 73 65  rithm may choose
30dd0 20 74 6f 20 75 73 65 20 74 32 20 66 6f 72 20 74   to use t2 for t
30de0 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 77  he outer loop, w
30df0 68 69 63 68 20 69 73 20 61 20 6d 75 63 68 0a 20  hich is a much. 
30e00 20 20 20 2a 2a 20 63 6f 73 74 6c 69 65 72 20 61     ** costlier a
30e10 70 70 72 6f 61 63 68 2e 0a 20 20 20 20 2a 2f 0a  pproach..    */.
30e20 20 20 20 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e      nUnconstrain
30e30 65 64 20 3d 20 30 3b 0a 20 20 20 20 6e 6f 74 49  ed = 0;.    notI
30e40 6e 64 65 78 65 64 20 3d 20 30 3b 0a 0a 20 20 20  ndexed = 0;..   
30e50 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 61 6c 20   /* The optimal 
30e60 73 63 61 6e 20 63 68 65 63 6b 20 6f 6e 6c 79 20  scan check only 
30e70 6f 63 63 75 72 73 20 69 66 20 74 68 65 72 65 20  occurs if there 
30e80 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
30e90 74 61 62 6c 65 73 0a 20 20 20 20 2a 2a 20 61 76  tables.    ** av
30ea0 61 69 6c 61 62 6c 65 20 74 6f 20 62 65 20 72 65  ailable to be re
30eb0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 69  ordered */.    i
30ec0 66 28 20 69 46 72 6f 6d 3d 3d 6e 54 61 62 4c 69  f( iFrom==nTabLi
30ed0 73 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 63 6b  st-1 ){.      ck
30ee0 4f 70 74 69 6d 61 6c 20 3d 20 30 3b 20 20 2f 2a  Optimal = 0;  /*
30ef0 20 43 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   Common case of 
30f00 6a 75 73 74 20 6f 6e 65 20 74 61 62 6c 65 20 69  just one table i
30f10 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
30f20 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e */.    }else{.
30f30 20 20 20 20 20 20 63 6b 4f 70 74 69 6d 61 6c 20        ckOptimal 
30f40 3d 20 2d 31 3b 0a 20 20 20 20 20 20 66 6f 72 28  = -1;.      for(
30f50 6a 3d 69 46 72 6f 6d 2c 20 73 57 42 49 2e 70 53  j=iFrom, sWBI.pS
30f60 72 63 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  rc=&pTabList->a[
30f70 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74 3b 20  j]; j<nTabList; 
30f80 6a 2b 2b 2c 20 73 57 42 49 2e 70 53 72 63 2b 2b  j++, sWBI.pSrc++
30f90 29 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 67  ){.        m = g
30fa0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
30fb0 20 73 57 42 49 2e 70 53 72 63 2d 3e 69 43 75 72   sWBI.pSrc->iCur
30fc0 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sor);.        if
30fd0 28 20 28 6d 20 26 20 73 57 42 49 2e 6e 6f 74 56  ( (m & sWBI.notV
30fe0 61 6c 69 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alid)==0 ){.    
30ff0 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72        if( j==iFr
31000 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20  om ) iFrom++;.  
31010 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
31020 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31030 20 20 20 20 69 66 28 20 6a 3e 69 46 72 6f 6d 20      if( j>iFrom 
31040 26 26 20 28 73 57 42 49 2e 70 53 72 63 2d 3e 6a  && (sWBI.pSrc->j
31050 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
31060 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
31070 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
31080 20 20 69 66 28 20 2b 2b 63 6b 4f 70 74 69 6d 61    if( ++ckOptima
31090 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  l ) break;.     
310a0 20 20 20 69 66 28 20 28 73 57 42 49 2e 70 53 72     if( (sWBI.pSr
310b0 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
310c0 5f 4c 45 46 54 29 21 3d 30 20 29 20 62 72 65 61  _LEFT)!=0 ) brea
310d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
310e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6b 4f  .    assert( ckO
310f0 70 74 69 6d 61 6c 3d 3d 30 20 7c 7c 20 63 6b 4f  ptimal==0 || ckO
31100 70 74 69 6d 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20  ptimal==1 );..  
31110 20 20 66 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d    for(isOptimal=
31120 63 6b 4f 70 74 69 6d 61 6c 3b 20 69 73 4f 70 74  ckOptimal; isOpt
31130 69 6d 61 6c 3e 3d 30 20 26 26 20 62 65 73 74 4a  imal>=0 && bestJ
31140 3c 30 3b 20 69 73 4f 70 74 69 6d 61 6c 2d 2d 29  <0; isOptimal--)
31150 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 46  {.      for(j=iF
31160 72 6f 6d 2c 20 73 57 42 49 2e 70 53 72 63 3d 26  rom, sWBI.pSrc=&
31170 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20  pTabList->a[j]; 
31180 6a 3c 6e 54 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c  j<nTabList; j++,
31190 20 73 57 42 49 2e 70 53 72 63 2b 2b 29 7b 0a 20   sWBI.pSrc++){. 
311a0 20 20 20 20 20 20 20 69 66 28 20 6a 3e 69 46 72         if( j>iFr
311b0 6f 6d 20 26 26 20 28 73 57 42 49 2e 70 53 72 63  om && (sWBI.pSrc
311c0 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54  ->jointype & (JT
311d0 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
311e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
311f0 20 2f 2a 20 54 68 69 73 20 62 72 65 61 6b 20 61   /* This break a
31200 6e 64 20 6f 6e 65 20 6c 69 6b 65 20 69 74 20 69  nd one like it i
31210 6e 20 74 68 65 20 63 6b 4f 70 74 69 6d 61 6c 20  n the ckOptimal 
31220 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6c 6f 6f 70  computation loop
31230 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 62  .          ** ab
31240 6f 76 65 20 70 72 65 76 65 6e 74 20 74 61 62 6c  ove prevent tabl
31250 65 20 72 65 6f 72 64 65 72 69 6e 67 20 61 63 72  e reordering acr
31260 6f 73 73 20 4c 45 46 54 20 61 6e 64 20 43 52 4f  oss LEFT and CRO
31270 53 53 20 4a 4f 49 4e 73 2e 0a 20 20 20 20 20 20  SS JOINs..      
31280 20 20 20 20 2a 2a 20 54 68 65 20 4c 45 46 54 20      ** The LEFT 
31290 4a 4f 49 4e 20 63 61 73 65 20 69 73 20 6e 65 63  JOIN case is nec
312a0 65 73 73 61 72 79 20 66 6f 72 20 63 6f 72 72 65  essary for corre
312b0 63 74 6e 65 73 73 2e 20 20 54 68 65 20 70 72 6f  ctness.  The pro
312c0 68 69 62 69 74 69 6f 6e 0a 20 20 20 20 20 20 20  hibition.       
312d0 20 20 20 2a 2a 20 61 67 61 69 6e 73 74 20 72 65     ** against re
312e0 6f 72 64 65 72 69 6e 67 20 61 63 72 6f 73 73 20  ordering across 
312f0 61 20 43 52 4f 53 53 20 4a 4f 49 4e 20 69 73 20  a CROSS JOIN is 
31300 61 6e 20 53 51 4c 69 74 65 20 66 65 61 74 75 72  an SQLite featur
31310 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  e that.         
31320 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 64   ** allows the d
31330 65 76 65 6c 6f 70 65 72 20 74 6f 20 63 6f 6e 74  eveloper to cont
31340 72 6f 6c 20 74 61 62 6c 65 20 72 65 6f 72 64 65  rol table reorde
31350 72 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  ring */.        
31360 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
31370 20 7d 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 67   }.        m = g
31380 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
31390 20 73 57 42 49 2e 70 53 72 63 2d 3e 69 43 75 72   sWBI.pSrc->iCur
313a0 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sor);.        if
313b0 28 20 28 6d 20 26 20 73 57 42 49 2e 6e 6f 74 56  ( (m & sWBI.notV
313c0 61 6c 69 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alid)==0 ){.    
313d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e        assert( j>
313e0 69 46 72 6f 6d 20 29 3b 0a 20 20 20 20 20 20 20  iFrom );.       
313f0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
31400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
31410 57 42 49 2e 6e 6f 74 52 65 61 64 79 20 3d 20 28  WBI.notReady = (
31420 69 73 4f 70 74 69 6d 61 6c 20 3f 20 6d 20 3a 20  isOptimal ? m : 
31430 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 29 3b 0a  sWBI.notValid);.
31440 20 20 20 20 20 20 20 20 69 66 28 20 73 57 42 49          if( sWBI
31450 2e 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30  .pSrc->pIndex==0
31460 20 29 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65   ) nUnconstraine
31470 64 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  d++;.  .        
31480 57 48 45 52 45 54 52 41 43 45 28 28 22 20 20 20  WHERETRACE(("   
31490 3d 3d 3d 20 74 72 79 69 6e 67 20 74 61 62 6c 65  === trying table
314a0 20 25 64 20 28 25 73 29 20 77 69 74 68 20 69 73   %d (%s) with is
314b0 4f 70 74 69 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e  Optimal=%d ===\n
314c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
314d0 20 20 20 20 20 20 20 6a 2c 20 73 57 42 49 2e 70         j, sWBI.p
314e0 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  Src->pTab->zName
314f0 2c 20 69 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20  , isOptimal));. 
31500 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
31510 57 42 49 2e 70 53 72 63 2d 3e 70 54 61 62 20 29  WBI.pSrc->pTab )
31520 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
31530 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
31540 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  LE.        if( I
31550 73 56 69 72 74 75 61 6c 28 73 57 42 49 2e 70 53  sVirtual(sWBI.pS
31560 72 63 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  rc->pTab) ){.   
31570 20 20 20 20 20 20 20 73 57 42 49 2e 70 70 49 64         sWBI.ppId
31580 78 49 6e 66 6f 20 3d 20 26 70 57 49 6e 66 6f 2d  xInfo = &pWInfo-
31590 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a  >a[j].pIdxInfo;.
315a0 20 20 20 20 20 20 20 20 20 20 62 65 73 74 56 69            bestVi
315b0 72 74 75 61 6c 49 6e 64 65 78 28 26 73 57 42 49  rtualIndex(&sWBI
315c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
315d0 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
315e0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73   {.          bes
315f0 74 42 74 72 65 65 49 6e 64 65 78 28 26 73 57 42  tBtreeIndex(&sWB
31600 49 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  I);.        }.  
31610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
31620 4f 70 74 69 6d 61 6c 20 7c 7c 20 28 73 57 42 49  Optimal || (sWBI
31630 2e 63 6f 73 74 2e 75 73 65 64 26 73 57 42 49 2e  .cost.used&sWBI.
31640 6e 6f 74 56 61 6c 69 64 29 3d 3d 30 20 29 3b 0a  notValid)==0 );.
31650 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
31660 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
31670 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20  use is present, 
31680 74 68 65 6e 20 74 68 65 20 70 6c 61 6e 20 6d 75  then the plan mu
31690 73 74 20 75 73 65 20 74 68 61 74 0a 20 20 20 20  st use that.    
316a0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 66 20      ** index if 
316b0 69 74 20 75 73 65 73 20 61 6e 79 20 69 6e 64 65  it uses any inde
316c0 78 20 61 74 20 61 6c 6c 20 2a 2f 0a 20 20 20 20  x at all */.    
316d0 20 20 20 20 61 73 73 65 72 74 28 20 73 57 42 49      assert( sWBI
316e0 2e 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30  .pSrc->pIndex==0
316f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
31700 20 20 20 20 7c 7c 20 28 73 57 42 49 2e 63 6f 73      || (sWBI.cos
31710 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  t.plan.wsFlags &
31720 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
31730 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  CAN)==0.        
31740 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 57 42            || sWB
31750 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70 49  I.cost.plan.u.pI
31760 64 78 3d 3d 73 57 42 49 2e 70 53 72 63 2d 3e 70  dx==sWBI.pSrc->p
31770 49 6e 64 65 78 20 29 3b 0a 0a 20 20 20 20 20 20  Index );..      
31780 20 20 69 66 28 20 69 73 4f 70 74 69 6d 61 6c 20    if( isOptimal 
31790 26 26 20 28 73 57 42 49 2e 63 6f 73 74 2e 70 6c  && (sWBI.cost.pl
317a0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
317b0 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29  RE_NOT_FULLSCAN)
317c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
317d0 20 6e 6f 74 49 6e 64 65 78 65 64 20 7c 3d 20 6d   notIndexed |= m
317e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
317f0 20 20 20 20 69 66 28 20 69 73 4f 70 74 69 6d 61      if( isOptima
31800 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
31810 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 72 4f 70 74  WInfo->a[j].rOpt
31820 43 6f 73 74 20 3d 20 73 57 42 49 2e 63 6f 73 74  Cost = sWBI.cost
31830 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  .rCost;.        
31840 7d 65 6c 73 65 20 69 66 28 20 63 6b 4f 70 74 69  }else if( ckOpti
31850 6d 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mal ){.         
31860 20 2f 2a 20 49 66 20 74 77 6f 20 6f 72 20 6d 6f   /* If two or mo
31870 72 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 6e  re tables have n
31880 65 61 72 6c 79 20 74 68 65 20 73 61 6d 65 20 6f  early the same o
31890 75 74 65 72 20 6c 6f 6f 70 20 63 6f 73 74 2c 20  uter loop cost, 
318a0 62 75 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  but.          **
318b0 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
318c0 69 6e 6e 65 72 20 6c 6f 6f 70 20 28 6f 70 74 69  inner loop (opti
318d0 6d 61 6c 29 20 63 6f 73 74 2c 20 77 65 20 77 61  mal) cost, we wa
318e0 6e 74 20 74 6f 20 63 68 6f 6f 73 65 0a 20 20 20  nt to choose.   
318f0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
31900 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 74 68 61  e outer loop tha
31910 74 20 74 61 62 6c 65 20 77 68 69 63 68 20 62 65  t table which be
31920 6e 65 66 69 74 73 20 74 68 65 20 6c 65 61 73 74  nefits the least
31930 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20   from.          
31940 2a 2a 20 62 65 69 6e 67 20 69 6e 20 74 68 65 20  ** being in the 
31950 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 20 54 68 65  inner loop.  The
31960 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
31970 73 63 61 6c 65 73 20 74 68 65 20 0a 20 20 20 20  scales the .    
31980 20 20 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 6c        ** outer l
31990 6f 6f 70 20 63 6f 73 74 20 65 73 74 69 6d 61 74  oop cost estimat
319a0 65 20 74 6f 20 61 63 63 6f 6d 70 6c 69 73 68 20  e to accomplish 
319b0 74 68 61 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  that. */.       
319c0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
319d0 20 20 20 73 63 61 6c 69 6e 67 20 63 6f 73 74 20     scaling cost 
319e0 66 72 6f 6d 20 25 2e 31 66 20 74 6f 20 25 2e 31  from %.1f to %.1
319f0 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  f\n",.          
31a00 20 20 20 20 20 20 20 20 20 20 20 20 73 57 42 49              sWBI
31a10 2e 63 6f 73 74 2e 72 43 6f 73 74 2c 0a 20 20 20  .cost.rCost,.   
31a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a30 20 20 20 73 57 42 49 2e 63 6f 73 74 2e 72 43 6f     sWBI.cost.rCo
31a40 73 74 2f 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e  st/pWInfo->a[j].
31a50 72 4f 70 74 43 6f 73 74 29 29 3b 0a 20 20 20 20  rOptCost));.    
31a60 20 20 20 20 20 20 73 57 42 49 2e 63 6f 73 74 2e        sWBI.cost.
31a70 72 43 6f 73 74 20 2f 3d 20 70 57 49 6e 66 6f 2d  rCost /= pWInfo-
31a80 3e 61 5b 6a 5d 2e 72 4f 70 74 43 6f 73 74 3b 0a  >a[j].rOptCost;.
31a90 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
31aa0 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 73     /* Conditions
31ab0 20 75 6e 64 65 72 20 77 68 69 63 68 20 74 68 69   under which thi
31ac0 73 20 74 61 62 6c 65 20 62 65 63 6f 6d 65 73 20  s table becomes 
31ad0 74 68 65 20 62 65 73 74 20 73 6f 20 66 61 72 3a  the best so far:
31ae0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
31af0 20 20 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65      **   (1) The
31b00 20 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20   table must not 
31b10 64 65 70 65 6e 64 20 6f 6e 20 6f 74 68 65 72 20  depend on other 
31b20 74 61 62 6c 65 73 20 74 68 61 74 20 68 61 76 65  tables that have
31b30 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
31b40 20 20 20 20 20 20 79 65 74 20 72 75 6e 2e 20 20        yet run.  
31b50 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
31b60 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 64 65 70   it must not dep
31b70 65 6e 64 20 6f 6e 20 74 61 62 6c 65 73 0a 20 20  end on tables.  
31b80 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69        **       i
31b90 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 2e 29 0a  n inner loops.).
31ba0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31bb0 20 20 20 2a 2a 20 20 20 28 32 29 20 28 54 68 69     **   (2) (Thi
31bc0 73 20 72 75 6c 65 20 77 61 73 20 72 65 6d 6f 76  s rule was remov
31bd0 65 64 20 6f 6e 20 32 30 31 32 2d 31 31 2d 30 39  ed on 2012-11-09
31be0 2e 20 20 54 68 65 20 73 63 61 6c 69 6e 67 20 6f  .  The scaling o
31bf0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
31c00 20 20 20 20 20 20 20 63 6f 73 74 20 75 73 69 6e         cost usin
31c10 67 20 74 68 65 20 6f 70 74 69 6d 61 6c 20 73 63  g the optimal sc
31c20 61 6e 20 63 6f 73 74 20 6d 61 64 65 20 74 68 69  an cost made thi
31c30 73 20 72 75 6c 65 20 6f 62 73 6f 6c 65 74 65 2e  s rule obsolete.
31c40 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
31c50 20 20 20 20 20 2a 2a 20 20 20 28 33 29 20 41 6c       **   (3) Al
31c60 6c 20 74 61 62 6c 65 73 20 68 61 76 65 20 61 6e  l tables have an
31c70 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
31c80 73 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65  se or this table
31c90 20 6c 61 63 6b 73 20 61 6e 0a 20 20 20 20 20 20   lacks an.      
31ca0 20 20 2a 2a 20 20 20 20 20 20 20 49 4e 44 45 58    **       INDEX
31cb0 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ED BY clause or 
31cc0 74 68 69 73 20 74 61 62 6c 65 20 75 73 65 73 20  this table uses 
31cd0 74 68 65 20 73 70 65 63 69 66 69 63 0a 20 20 20  the specific.   
31ce0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69 6e       **       in
31cf0 64 65 78 20 73 70 65 63 69 66 69 65 64 20 62 79  dex specified by
31d00 20 69 74 73 20 49 4e 44 45 58 45 44 20 42 59 20   its INDEXED BY 
31d10 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 72 75  clause.  This ru
31d20 6c 65 20 65 6e 73 75 72 65 73 0a 20 20 20 20 20  le ensures.     
31d30 20 20 20 2a 2a 20 20 20 20 20 20 20 74 68 61 74     **       that
31d40 20 61 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 69   a best-so-far i
31d50 73 20 61 6c 77 61 79 73 20 73 65 6c 65 63 74 65  s always selecte
31d60 64 20 65 76 65 6e 20 69 66 20 61 6e 20 69 6d 70  d even if an imp
31d70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
31d80 2a 2a 20 20 20 20 20 20 20 63 6f 6d 62 69 6e 61  **       combina
31d90 74 69 6f 6e 20 6f 66 20 49 4e 44 45 58 45 44 20  tion of INDEXED 
31da0 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 67  BY clauses are g
31db0 69 76 65 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  iven.  The error
31dc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
31dd0 20 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74    will be detect
31de0 65 64 20 61 6e 64 20 72 65 6c 61 79 65 64 20 62  ed and relayed b
31df0 61 63 6b 20 74 6f 20 74 68 65 20 61 70 70 6c 69  ack to the appli
31e00 63 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 20 20  cation later..  
31e10 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 54        **       T
31e20 68 65 20 4e 45 56 45 52 28 29 20 63 6f 6d 65 73  he NEVER() comes
31e30 20 61 62 6f 75 74 20 62 65 63 61 75 73 65 20 72   about because r
31e40 75 6c 65 20 28 32 29 20 61 62 6f 76 65 20 70 72  ule (2) above pr
31e50 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a  events.        *
31e60 2a 20 20 20 20 20 20 20 41 6e 20 69 6e 64 65 78  *       An index
31e70 61 62 6c 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d  able full-table-
31e80 73 63 61 6e 20 66 72 6f 6d 20 72 65 61 63 68 69  scan from reachi
31e90 6e 67 20 72 75 6c 65 20 28 33 29 2e 0a 20 20 20  ng rule (3)..   
31ea0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31eb0 2a 2a 20 20 20 28 34 29 20 54 68 65 20 70 6c 61  **   (4) The pla
31ec0 6e 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20 6c  n cost must be l
31ed0 6f 77 65 72 20 74 68 61 6e 20 70 72 69 6f 72 20  ower than prior 
31ee0 70 6c 61 6e 73 2c 20 77 68 65 72 65 20 22 63 6f  plans, where "co
31ef0 73 74 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  st".        **  
31f00 20 20 20 20 20 69 73 20 64 65 66 69 6e 65 64 20       is defined 
31f10 62 79 20 74 68 65 20 63 6f 6d 70 61 72 65 43 6f  by the compareCo
31f20 73 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 62  st() function ab
31f30 6f 76 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ove. .        */
31f40 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 73 57  .        if( (sW
31f50 42 49 2e 63 6f 73 74 2e 75 73 65 64 26 73 57 42  BI.cost.used&sWB
31f60 49 2e 6e 6f 74 56 61 6c 69 64 29 3d 3d 30 20 20  I.notValid)==0  
31f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f80 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
31f90 20 20 20 20 20 20 20 20 26 26 20 28 6e 55 6e 63          && (nUnc
31fa0 6f 6e 73 74 72 61 69 6e 65 64 3d 3d 30 20 7c 7c  onstrained==0 ||
31fb0 20 73 57 42 49 2e 70 53 72 63 2d 3e 70 49 6e 64   sWBI.pSrc->pInd
31fc0 65 78 3d 3d 30 20 20 20 20 20 20 20 20 2f 2a 20  ex==0        /* 
31fd0 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
31fe0 20 20 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28         || NEVER(
31ff0 28 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e  (sWBI.cost.plan.
32000 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
32010 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30  NOT_FULLSCAN)!=0
32020 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  )).            &
32030 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20 63 6f  & (bestJ<0 || co
32040 6d 70 61 72 65 43 6f 73 74 28 26 73 57 42 49 2e  mpareCost(&sWBI.
32050 63 6f 73 74 2c 20 26 62 65 73 74 50 6c 61 6e 29  cost, &bestPlan)
32060 29 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20  )   /* (4) */.  
32070 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
32080 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
32090 20 20 20 3d 3d 3d 20 74 61 62 6c 65 20 25 64 20     === table %d 
320a0 28 25 73 29 20 69 73 20 62 65 73 74 20 73 6f 20  (%s) is best so 
320b0 66 61 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  far\n".         
320c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
320d0 20 20 20 20 20 63 6f 73 74 3d 25 2e 31 66 2c 20       cost=%.1f, 
320e0 6e 52 6f 77 3d 25 2e 31 66 2c 20 6e 4f 42 53 61  nRow=%.1f, nOBSa
320f0 74 3d 25 64 2c 20 77 73 46 6c 61 67 73 3d 25 30  t=%d, wsFlags=%0
32100 38 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  8x\n",.         
32110 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20               j, 
32120 73 57 42 49 2e 70 53 72 63 2d 3e 70 54 61 62 2d  sWBI.pSrc->pTab-
32130 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
32140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 57                sW
32150 42 49 2e 63 6f 73 74 2e 72 43 6f 73 74 2c 20 73  BI.cost.rCost, s
32160 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e 6e 52  WBI.cost.plan.nR
32170 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
32180 20 20 20 20 20 20 20 20 20 20 73 57 42 49 2e 63            sWBI.c
32190 6f 73 74 2e 70 6c 61 6e 2e 6e 4f 42 53 61 74 2c  ost.plan.nOBSat,
321a0 20 73 57 42 49 2e 63 6f 73 74 2e 70 6c 61 6e 2e   sWBI.cost.plan.
321b0 77 73 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 20  wsFlags));.     
321c0 20 20 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20       bestPlan = 
321d0 73 57 42 49 2e 63 6f 73 74 3b 0a 20 20 20 20 20  sWBI.cost;.     
321e0 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a       bestJ = j;.
321f0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
32200 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
32210 6c 69 6b 65 20 22 77 20 4a 4f 49 4e 20 78 20 4c  like "w JOIN x L
32220 45 46 54 20 4a 4f 49 4e 20 79 20 4a 4f 49 4e 20  EFT JOIN y JOIN 
32230 7a 22 20 20 6d 61 6b 65 20 73 75 72 65 20 74 68  z"  make sure th
32240 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  at.        ** ta
32250 62 6c 65 20 79 20 28 61 6e 64 20 6e 6f 74 20 74  ble y (and not t
32260 61 62 6c 65 20 7a 29 20 69 73 20 61 6c 77 61 79  able z) is alway
32270 73 20 74 68 65 20 6e 65 78 74 20 69 6e 6e 65 72  s the next inner
32280 20 6c 6f 6f 70 20 69 6e 73 69 64 65 0a 20 20 20   loop inside.   
32290 20 20 20 20 20 2a 2a 20 6f 66 20 74 61 62 6c 65       ** of table
322a0 20 78 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   x. */.        i
322b0 66 28 20 28 73 57 42 49 2e 70 53 72 63 2d 3e 6a  f( (sWBI.pSrc->j
322c0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
322d0 54 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  T)!=0 ) break;. 
322e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
322f0 20 61 73 73 65 72 74 28 20 62 65 73 74 4a 3e 3d   assert( bestJ>=
32300 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
32310 20 73 57 42 49 2e 6e 6f 74 56 61 6c 69 64 20 26   sWBI.notValid &
32320 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
32330 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  t, pTabList->a[b
32340 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29  estJ].iCursor) )
32350 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 65  ;.    assert( be
32360 73 74 4a 3d 3d 69 46 72 6f 6d 20 7c 7c 20 28 70  stJ==iFrom || (p
32370 54 61 62 4c 69 73 74 2d 3e 61 5b 69 46 72 6f 6d  TabList->a[iFrom
32380 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
32390 4c 45 46 54 29 3d 3d 30 20 29 3b 0a 20 20 20 20  LEFT)==0 );.    
323a0 74 65 73 74 63 61 73 65 28 20 62 65 73 74 4a 3e  testcase( bestJ>
323b0 69 46 72 6f 6d 20 26 26 20 28 70 54 61 62 4c 69  iFrom && (pTabLi
323c0 73 74 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  st->a[iFrom].joi
323d0 6e 74 79 70 65 20 26 20 4a 54 5f 43 52 4f 53 53  ntype & JT_CROSS
323e0 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
323f0 63 61 73 65 28 20 62 65 73 74 4a 3e 69 46 72 6f  case( bestJ>iFro
32400 6d 20 26 26 20 62 65 73 74 4a 3c 6e 54 61 62 4c  m && bestJ<nTabL
32410 69 73 74 2d 31 0a 20 20 20 20 20 20 20 20 20 20  ist-1.          
32420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32430 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  && (pTabList->a[
32440 62 65 73 74 4a 2b 31 5d 2e 6a 6f 69 6e 74 79 70  bestJ+1].jointyp
32450 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
32460 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  );.    WHERETRAC
32470 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
32480 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20  r selects table 
32490 25 64 20 28 25 73 29 20 66 6f 72 20 6c 6f 6f 70  %d (%s) for loop
324a0 20 25 64 20 77 69 74 68 3a 5c 6e 22 0a 20 20 20   %d with:\n".   
324b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
324c0 20 20 63 6f 73 74 3d 25 2e 31 66 2c 20 6e 52 6f    cost=%.1f, nRo
324d0 77 3d 25 2e 31 66 2c 20 6e 4f 42 53 61 74 3d 25  w=%.1f, nOBSat=%
324e0 64 2c 20 77 73 46 6c 61 67 73 3d 30 78 25 30 38  d, wsFlags=0x%08
324f0 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
32500 20 20 20 20 20 20 62 65 73 74 4a 2c 20 70 54 61        bestJ, pTa
32510 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
32520 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
32530 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
32540 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 2c 20 62  vel-pWInfo->a, b
32550 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 2c 20 62  estPlan.rCost, b
32560 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f  estPlan.plan.nRo
32570 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
32580 20 20 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e     bestPlan.plan
32590 2e 6e 4f 42 53 61 74 2c 20 62 65 73 74 50 6c 61  .nOBSat, bestPla
325a0 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 29 29  n.plan.wsFlags))
325b0 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 50  ;.    if( (bestP
325c0 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
325d0 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
325e0 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  T)!=0 ){.      a
325f0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65  ssert( pWInfo->e
32600 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20  Distinct==0 );. 
32610 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
32620 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
32630 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
32640 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c  .    }.    andFl
32650 61 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e  ags &= bestPlan.
32660 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20  plan.wsFlags;.  
32670 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d    pLevel->plan =
32680 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a   bestPlan.plan;.
32690 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
326a0 43 75 72 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Cur = pTabList->
326b0 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72  a[bestJ].iCursor
326c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
326d0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
326e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
326f0 44 45 58 45 44 20 29 3b 0a 20 20 20 20 74 65 73  DEXED );.    tes
32700 74 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e  tcase( bestPlan.
32710 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
32720 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20  HERE_TEMP_INDEX 
32730 29 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74 50  );.    if( bestP
32740 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
32750 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45   & (WHERE_INDEXE
32760 44 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  D|WHERE_TEMP_IND
32770 45 58 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  EX) ){.      if(
32780 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
32790 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
327a0 4c 59 29 20 0a 20 20 20 20 20 20 20 26 26 20 28  LY) .       && (
327b0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
327c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
327d0 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20 0a 20 20  MP_INDEX)==0 .  
327e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
327f0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
32800 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
32810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
32820 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
32830 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
32840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
32850 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
32860 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a  ->iIdxCur = -1;.
32870 20 20 20 20 7d 0a 20 20 20 20 73 57 42 49 2e 6e      }.    sWBI.n
32880 6f 74 56 61 6c 69 64 20 26 3d 20 7e 67 65 74 4d  otValid &= ~getM
32890 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
328a0 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
328b0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  .iCursor);.    p
328c0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28  Level->iFrom = (
328d0 75 38 29 62 65 73 74 4a 3b 0a 20 20 20 20 69 66  u8)bestJ;.    if
328e0 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  ( bestPlan.plan.
328f0 6e 52 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20  nRow>=(double)1 
32900 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
32910 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2a 3d 20 62  >nQueryLoop *= b
32920 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f  estPlan.plan.nRo
32930 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  w;.    }..    /*
32940 20 43 68 65 63 6b 20 74 68 61 74 20 69 66 20 74   Check that if t
32950 68 65 20 74 61 62 6c 65 20 73 63 61 6e 6e 65 64  he table scanned
32960 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 74   by this loop it
32970 65 72 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20  eration had an. 
32980 20 20 20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59     ** INDEXED BY
32990 20 63 6c 61 75 73 65 20 61 74 74 61 63 68 65 64   clause attached
329a0 20 74 6f 20 69 74 2c 20 74 68 61 74 20 74 68 65   to it, that the
329b0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 69 73 20   named index is 
329c0 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65  being.    ** use
329d0 64 20 66 6f 72 20 74 68 65 20 73 63 61 6e 2e 20  d for the scan. 
329e0 49 66 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65  If not, then que
329f0 72 79 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68  ry compilation h
32a00 61 73 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a  as failed..    *
32a10 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
32a20 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  r..    */.    pI
32a30 64 78 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  dx = pTabList->a
32a40 5b 62 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a  [bestJ].pIndex;.
32a50 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
32a60 20 20 20 20 20 20 69 66 28 20 28 62 65 73 74 50        if( (bestP
32a70 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
32a80 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
32a90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
32aa0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
32ab0 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
32ac0 75 73 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  use index: %s", 
32ad0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
32ae0 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
32af0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
32b00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32b10 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45   /* If an INDEXE
32b20 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 75  D BY clause is u
32b30 73 65 64 2c 20 74 68 65 20 62 65 73 74 49 6e 64  sed, the bestInd
32b40 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  ex() function is
32b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
32b60 61 6e 74 65 65 64 20 74 6f 20 66 69 6e 64 20 74  anteed to find t
32b70 68 65 20 69 6e 64 65 78 20 73 70 65 63 69 66 69  he index specifi
32b80 65 64 20 69 6e 20 74 68 65 20 49 4e 44 45 58 45  ed in the INDEXE
32b90 44 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  D BY clause.    
32ba0 20 20 20 20 2a 2a 20 69 66 20 69 74 20 66 69 6e      ** if it fin
32bb0 64 20 61 6e 20 69 6e 64 65 78 20 61 74 20 61 6c  d an index at al
32bc0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  l. */.        as
32bd0 73 65 72 74 28 20 62 65 73 74 50 6c 61 6e 2e 70  sert( bestPlan.p
32be0 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78  lan.u.pIdx==pIdx
32bf0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
32c00 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
32c10 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
32c20 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
32c30 6e 22 29 29 3b 0a 20 20 69 66 28 20 70 50 61 72  n"));.  if( pPar
32c40 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
32c50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
32c60 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
32c70 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ginError;.  }.  
32c80 69 66 28 20 6e 54 61 62 4c 69 73 74 20 29 7b 0a  if( nTabList ){.
32c90 20 20 20 20 70 4c 65 76 65 6c 2d 2d 3b 0a 20 20      pLevel--;.  
32ca0 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74    pWInfo->nOBSat
32cb0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
32cc0 6e 4f 42 53 61 74 3b 0a 20 20 7d 65 6c 73 65 7b  nOBSat;.  }else{
32cd0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  .    pWInfo->nOB
32ce0 53 61 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Sat = 0;.  }..  
32cf0 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20  /* If the total 
32d00 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63  query only selec
32d10 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c  ts a single row,
32d20 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20   then the ORDER 
32d30 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69  BY.  ** clause i
32d40 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20  s irrelevant..  
32d50 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61  */.  if( (andFla
32d60 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55  gs & WHERE_UNIQU
32d70 45 29 21 3d 30 20 26 26 20 70 4f 72 64 65 72 42  E)!=0 && pOrderB
32d80 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
32d90 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20   nTabList==0 || 
32da0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
32db0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4c  Flags & WHERE_AL
32dc0 4c 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 3b 0a  L_UNIQUE)!=0 );.
32dd0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53      pWInfo->nOBS
32de0 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  at = pOrderBy->n
32df0 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Expr;.  }..  /* 
32e00 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
32e10 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
32e20 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
32e30 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
32e40 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
32e50 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
32e60 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
32e70 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
32e80 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
32e90 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
32ea0 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
32eb0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
32ec0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
32ed0 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
32ee0 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67  to update a sing
32ef0 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61  le row..  */.  a
32f00 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
32f10 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
32f20 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
32f30 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
32f40 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
32f50 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
32f60 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
32f70 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67  )!=0 && (andFlag
32f80 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
32f90 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e  )!=0 ){.    pWIn
32fa0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20  fo->okOnePass = 
32fb0 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
32fc0 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  [0].plan.wsFlags
32fd0 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
32fe0 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  NLY;.  }..  /* O
32ff0 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
33000 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
33010 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
33020 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
33030 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
33040 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
33050 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
33060 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
33070 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
33080 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
33090 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74  er Goto */.  not
330a0 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
330b0 6b 29 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  k)0;.  pWInfo->n
330c0 52 6f 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65  RowOut = (double
330d0 29 31 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20  )1;.  for(ii=0, 
330e0 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
330f0 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
33100 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
33110 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
33120 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
33130 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
33140 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
33150 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
33160 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
33170 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
33180 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
33190 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a  item *pTabItem;.
331a0 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
331b0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
331c0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
331d0 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d   pTab = pTabItem
331e0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 70 57 49 6e  ->pTab;.    pWIn
331f0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70  fo->nRowOut *= p
33200 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77  Level->plan.nRow
33210 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
33220 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
33230 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
33240 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  ma);.    if( (pT
33250 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
33260 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
33270 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
33280 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
33290 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
332a0 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
332b0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
332c0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
332d0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
332e0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
332f0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
33300 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
33310 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
33320 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
33330 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
33340 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
33350 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
33360 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
33370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
33380 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
33390 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
333a0 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
333b0 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
333c0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
333d0 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* noop */.    
333e0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
333f0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
33400 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
33410 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
33420 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
33430 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
33440 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
33450 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
33460 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b   op = pWInfo->ok
33470 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65  OnePass ? OP_Ope
33480 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e  nWrite : OP_Open
33490 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69  Read;.      sqli
334a0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
334b0 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
334c0 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
334d0 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65  b, op);.      te
334e0 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43  stcase( pTab->nC
334f0 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
33500 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61     testcase( pTa
33510 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
33520 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
33530 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
33540 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29  pTab->nCol<BMS )
33550 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
33560 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  k b = pTabItem->
33570 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20  colUsed;.       
33580 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
33590 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62      for(; b; b=b
335a0 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  >>1, n++){}.    
335b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
335c0 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74  hangeP4(v, sqlit
335d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
335e0 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20  r(v)-1, .       
335f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33600 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f       SQLITE_INT_
33610 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e  TO_PTR(n), P4_IN
33620 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  T32);.        as
33630 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e  sert( n<=pTab->n
33640 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Col );.      }. 
33650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33660 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
33670 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
33680 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
33690 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
336a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
336b0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
336c0 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c  NDEX.    if( (pL
336d0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
336e0 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
336f0 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
33700 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f     constructAuto
33710 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73  maticIndex(pPars
33720 65 2c 20 73 57 42 49 2e 70 57 43 2c 20 70 54 61  e, sWBI.pWC, pTa
33730 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c  bItem, notReady,
33740 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65   pLevel);.    }e
33750 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
33760 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
33770 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
33780 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
33790 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78        Index *pIx
337a0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
337b0 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 4b 65  u.pIdx;.      Ke
337c0 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71  yInfo *pKey = sq
337d0 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
337e0 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a  o(pParse, pIx);.
337f0 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
33800 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
33810 64 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73  dxCur;.      ass
33820 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
33830 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
33840 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
33850 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29  ( iIndexCur>=0 )
33860 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
33870 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
33880 4f 70 65 6e 52 65 61 64 2c 20 69 49 6e 64 65 78  OpenRead, iIndex
33890 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
338a0 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
338b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
338c0 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  ar*)pKey, P4_KEY
338d0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
338e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
338f0 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
33900 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
33910 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
33920 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
33930 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74  e, iDb);.    not
33940 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
33950 6b 28 73 57 42 49 2e 70 57 43 2d 3e 70 4d 61 73  k(sWBI.pWC->pMas
33960 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e  kSet, pTabItem->
33970 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  iCursor);.  }.  
33980 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
33990 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
339a0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
339b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
339c0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
339d0 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47  inError;..  /* G
339e0 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
339f0 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
33a00 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
33a10 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
33a20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
33a30 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
33a40 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
33a50 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
33a60 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
33a70 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
33a80 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
33a90 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62  or(ii=0; ii<nTab
33aa0 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  List; ii++){.   
33ab0 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
33ac0 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 65 78  o->a[ii];.    ex
33ad0 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61  plainOneScan(pPa
33ae0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
33af0 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65  Level, ii, pLeve
33b00 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46  l->iFrom, wctrlF
33b10 6c 61 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65  lags);.    notRe
33b20 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f  ady = codeOneLoo
33b30 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69  pStart(pWInfo, i
33b40 69 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e  i, wctrlFlags, n
33b50 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
33b60 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
33b70 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
33b80 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  nt;.  }..#ifdef 
33b90 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20  SQLITE_TEST  /* 
33ba0 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  For testing and 
33bb0 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
33bc0 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72  ly */.  /* Recor
33bd0 64 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70  d in the query p
33be0 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lan information 
33bf0 61 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e  about the curren
33c00 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64  t table.  ** and
33c10 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
33c20 74 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66  to access it (if
33c30 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74   any).  If the t
33c40 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a  able itself.  **
33c50 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74   is not used, it
33c60 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27  s name is just '
33c70 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65  {}'.  If no inde
33c80 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74  x is used.  ** t
33c90 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74  he index is list
33ca0 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20  ed as "{}".  If 
33cb0 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
33cc0 69 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a  is used the.  **
33cd0 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27   index name is '
33ce0 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  *'..  */.  for(i
33cf0 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
33d00 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  ; ii++){.    cha
33d10 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  r *z;.    int n;
33d20 0a 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20  .    int w;.    
33d30 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
33d40 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a  tem *pTabItem;..
33d50 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
33d60 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  Info->a[ii];.   
33d70 20 77 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   w = pLevel->pla
33d80 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  n.wsFlags;.    p
33d90 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
33da0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
33db0 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70  From];.    z = p
33dc0 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  TabItem->zAlias;
33dd0 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
33de0 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  z = pTabItem->pT
33df0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  ab->zName;.    n
33e00 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
33e10 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  30(z);.    if( n
33e20 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
33e30 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
33e40 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20  lan)-10 ){.     
33e50 20 69 66 28 20 28 77 20 26 20 57 48 45 52 45 5f   if( (w & WHERE_
33e60 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  IDX_ONLY)!=0 && 
33e70 28 77 20 26 20 57 48 45 52 45 5f 43 4f 56 45 52  (w & WHERE_COVER
33e80 5f 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  _SCAN)==0 ){.   
33e90 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
33ea0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
33eb0 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32  nQPlan], "{}", 2
33ec0 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
33ed0 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65  n += 2;.      }e
33ee0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
33ef0 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
33f00 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
33f10 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   z, n);.        
33f20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20  nQPlan += n;.   
33f30 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
33f40 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
33f50 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  Plan++] = ' ';. 
33f60 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
33f70 65 28 20 77 20 26 20 57 48 45 52 45 5f 52 4f 57  e( w & WHERE_ROW
33f80 49 44 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73  ID_EQ );.    tes
33f90 74 63 61 73 65 28 20 77 20 26 20 57 48 45 52 45  tcase( w & WHERE
33fa0 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a  _ROWID_RANGE );.
33fb0 20 20 20 20 69 66 28 20 77 20 26 20 28 57 48 45      if( w & (WHE
33fc0 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
33fd0 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29  E_ROWID_RANGE) )
33fe0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
33ff0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
34000 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22  an[nQPlan], "* "
34010 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  , 2);.      nQPl
34020 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  an += 2;.    }el
34030 73 65 20 69 66 28 20 28 77 20 26 20 57 48 45 52  se if( (w & WHER
34040 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26  E_INDEXED)!=0 &&
34050 20 28 77 20 26 20 57 48 45 52 45 5f 43 4f 56 45   (w & WHERE_COVE
34060 52 5f 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20  R_SCAN)==0 ){.  
34070 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
34080 74 72 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e  trlen30(pLevel->
34090 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
340a0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  me);.      if( n
340b0 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
340c0 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
340d0 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  lan)-2 ){.      
340e0 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
340f0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
34100 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c  lan], pLevel->pl
34110 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
34120 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
34130 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
34140 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
34150 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20  _plan[nQPlan++] 
34160 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = ' ';.      }. 
34170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34180 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
34190 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
341a0 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20  n], "{} ", 3);. 
341b0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33       nQPlan += 3
341c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  ;.    }.  }.  wh
341d0 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
341e0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
341f0 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
34200 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
34210 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
34220 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
34230 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
34240 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
34250 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
34260 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
34270 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
34280 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
34290 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
342a0 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
342b0 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
342c0 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
342d0 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
342e0 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
342f0 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
34300 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  /.  return pWInf
34310 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
34320 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
34330 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
34340 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49  Error:.  if( pWI
34350 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73  nfo ){.    pPars
34360 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
34370 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
34380 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65  eryLoop;.    whe
34390 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
343a0 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  WInfo);.  }.  re
343b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
343c0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e   Generate the en
343d0 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  d of the WHERE l
343e0 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e  oop.  See commen
343f0 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ts on .** sqlite
34400 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f  3WhereBegin() fo
34410 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
34420 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  ormation..*/.voi
34430 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
34440 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
34450 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  nfo){.  Parse *p
34460 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
34470 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a  pParse;.  Vdbe *
34480 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
34490 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  e;.  int i;.  Wh
344a0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
344b0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
344c0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
344d0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
344e0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
344f0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
34500 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
34510 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
34520 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
34530 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
34540 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f  ;.  for(i=pWInfo
34550 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30  ->nLevel-1; i>=0
34560 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76  ; i--){.    pLev
34570 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
34580 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  i];.    sqlite3V
34590 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
345a0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43  v, pLevel->addrC
345b0 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ont);.    if( pL
345c0 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f  evel->op!=OP_Noo
345d0 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
345e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
345f0 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76  pLevel->op, pLev
34600 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
34610 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  p2);.      sqlit
34620 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
34630 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20  , pLevel->p5);. 
34640 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
34650 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
34660 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
34670 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  E && pLevel->u.i
34680 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20  n.nIn>0 ){.     
34690 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
346a0 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  pIn;.      int j
346b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
346c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
346d0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e  v, pLevel->addrN
346e0 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  xt);.      for(j
346f0 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  =pLevel->u.in.nI
34700 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e  n, pIn=&pLevel->
34710 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31  u.in.aInLoop[j-1
34720 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e  ]; j>0; j--, pIn
34730 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  --){.        sql
34740 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
34750 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
34760 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  op+1);.        s
34770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
34780 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
34790 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20  pOp, pIn->iCur, 
347a0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b  pIn->addrInTop);
347b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
347c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
347d0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31  pIn->addrInTop-1
347e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
347f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
34800 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
34810 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a  aInLoop);.    }.
34820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
34830 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
34840 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
34850 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
34860 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
34870 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
34880 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
34890 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
348a0 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c  OP_IfPos, pLevel
348b0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
348c0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 65      assert( (pLe
348d0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
348e0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
348f0 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
34900 20 20 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c    || (pLevel->pl
34910 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
34920 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
34930 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65  ;.      if( (pLe
34940 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
34950 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
34960 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
34970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34980 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
34990 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  w, pTabList->a[i
349a0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
349b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
349c0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
349d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
349e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
349f0 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65   OP_NullRow, pLe
34a00 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
34a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34a20 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
34a30 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20  Return ){.      
34a40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34a50 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
34a60 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
34a70 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
34a80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34aa0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
34ab0 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
34ac0 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
34ad0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
34ae0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
34af0 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  addr);.    }.  }
34b00 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61  ..  /* The "brea
34b10 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65  k" point is here
34b20 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20  , just past the 
34b30 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72  end of the outer
34b40 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20   loop..  ** Set 
34b50 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  it..  */.  sqlit
34b60 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
34b70 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  el(v, pWInfo->iB
34b80 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  reak);..  /* Clo
34b90 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75  se all of the cu
34ba0 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20  rsors that were 
34bb0 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65  opened by sqlite
34bc0 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a  3WhereBegin..  *
34bd0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  /.  assert( pWIn
34be0 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c  fo->nLevel==1 ||
34bf0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
34c00 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  =pTabList->nSrc 
34c10 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  );.  for(i=0, pL
34c20 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
34c30 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
34c40 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
34c50 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
34c60 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  x = 0;.    struc
34c70 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
34c80 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
34c90 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
34ca0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
34cb0 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
34cc0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
34cd0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
34ce0 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
34cf0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
34d00 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20  hemeral)==0.    
34d10 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
34d20 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57  t==0.     && (pW
34d30 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
34d40 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
34d50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20  EN_CLOSE)==0.   
34d60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73   ){.      int ws
34d70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
34d80 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69  wsFlags;.      i
34d90 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
34da0 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20 57  ePass && (ws & W
34db0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
34dc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
34dd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
34de0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
34df0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
34e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
34e10 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e  ( (ws & WHERE_IN
34e20 44 45 58 45 44 29 21 3d 30 20 26 26 20 28 77 73  DEXED)!=0 && (ws
34e30 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
34e40 44 45 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)==0 ){.     
34e50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34e60 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
34e70 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
34e80 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
34e90 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
34ea0 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
34eb0 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20  ndex, make code 
34ec0 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
34ed0 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
34ee0 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
34ef0 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74   in preference t
34f00 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d  o the table. Som
34f10 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61  etimes, this mea
34f20 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  ns.    ** the ta
34f30 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62  ble need never b
34f40 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69  e read from. Thi
34f50 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s is a performan
34f60 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a  ce boost,.    **
34f70 20 61 73 20 74 68 65 20 76 64 62 65 20 6c 65 76   as the vdbe lev
34f80 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74  el waits until t
34f90 68 65 20 74 61 62 6c 65 20 69 73 20 72 65 61 64  he table is read
34fa0 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79   before actually
34fb0 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20  .    ** seeking 
34fc0 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
34fd0 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63   to the record c
34fe0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
34ff0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
35000 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  ** position in t
35010 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
35020 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
35030 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
35040 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
35050 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
35060 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
35070 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
35080 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
35090 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
350a0 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
350b0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
350c0 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
350d0 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
350e0 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
350f0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
35100 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
35110 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
35120 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
35130 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
35140 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
35150 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
35160 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
35170 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
35180 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 70  DEXED ){.      p
35190 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
351a0 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 7d  an.u.pIdx;.    }
351b0 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
351c0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
351d0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29  WHERE_MULTI_OR )
351e0 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
351f0 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
35200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
35210 70 49 64 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c  pIdx && !db->mal
35220 6c 6f 63 46 61 69 6c 65 64 29 7b 0a 20 20 20 20  locFailed){.    
35230 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74    int k, j, last
35240 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
35250 70 4f 70 3b 0a 0a 20 20 20 20 20 20 70 4f 70 20  pOp;..      pOp 
35260 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
35270 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54  Op(v, pWInfo->iT
35280 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20  op);.      last 
35290 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
352a0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
352b0 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d     for(k=pWInfo-
352c0 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b  >iTop; k<last; k
352d0 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
352e0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21      if( pOp->p1!
352f0 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
35300 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35310 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70       if( pOp->op
35320 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
35330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
35340 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
35350 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
35360 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
35370 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  ->p2==pIdx->aiCo
35380 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  lumn[j] ){.     
35390 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
353a0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
353b0 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
353c0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
353d0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
353e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
353f0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
35400 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35410 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
35420 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
35430 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
35440 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 70            || j<p
35450 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  Idx->nColumn );.
35460 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
35470 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
35480 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
35490 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
354a0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
354b0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
354c0 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f  pcode = OP_IdxRo
354d0 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  wid;.        }. 
354e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
354f0 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
35500 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72  anup.  */.  pPar
35510 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
35520 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
35530 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72  ueryLoop;.  wher
35540 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
35550 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Info);.  return;
35560 0a 7d 0a                                         .}.